@lvnt/release-radar-cli 0.2.12 → 0.2.13

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/dist/index.js CHANGED
@@ -1,110 +1,40 @@
1
1
  import chalk from 'chalk';
2
- import { readFileSync } from 'fs';
3
- import { fileURLToPath } from 'url';
4
- import { dirname, join } from 'path';
5
2
  import { ConfigManager } from './config.js';
6
3
  import { DownloadTracker } from './tracker.js';
7
4
  import { loadVersions } from './versions.js';
8
5
  import { checkAndUpdate } from './updater.js';
9
6
  import { downloadFile, updateNpmPackage } from './downloader.js';
10
- import { promptSetup, promptToolSelection, renderTable } from './ui.js';
7
+ import { promptSetup, promptToolSelection } from './ui.js';
11
8
  import { isNpmTool } from './types.js';
12
- function getVersion() {
13
- const __dirname = dirname(fileURLToPath(import.meta.url));
14
- const pkgPath = join(__dirname, '..', 'package.json');
15
- const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
16
- return pkg.version;
17
- }
18
- function showHelp() {
19
- const version = getVersion();
20
- console.log(`
21
- ${chalk.bold('release-radar-cli')} v${version}
22
-
23
- ${chalk.bold('USAGE:')}
24
- release-radar-cli [command] [options]
25
-
26
- ${chalk.bold('COMMANDS:')}
27
- ${chalk.cyan('(default)')} Interactive mode - select and download tools
28
- ${chalk.cyan('status')} Show tool versions and download status
29
- ${chalk.cyan('config')} Configure or reconfigure settings (Nexus URL, download dir)
30
- ${chalk.cyan('version')} Show CLI version
31
- ${chalk.cyan('help')} Show this help message
32
-
33
- ${chalk.bold('OPTIONS:')}
34
- ${chalk.cyan('-v, --version')} Show version number
35
- ${chalk.cyan('-h, --help')} Show help
36
- ${chalk.cyan('--skip-update')} Skip auto-update check on startup
37
-
38
- ${chalk.bold('EXAMPLES:')}
39
- release-radar-cli # Interactive mode
40
- release-radar-cli status # Show all tool versions
41
- release-radar-cli config # Reconfigure settings
42
- release-radar-cli --version # Show version
43
-
44
- ${chalk.bold('CONFIG LOCATION:')}
45
- ~/.release-radar-cli/config.json
46
-
47
- ${chalk.gray('For more info: https://github.com/lvntbkdmr/release-radar')}
48
- `);
49
- }
50
9
  async function showStatus() {
51
10
  const tracker = new DownloadTracker();
52
11
  const versions = loadVersions();
53
12
  const downloaded = tracker.getAll();
54
13
  console.log(chalk.bold('\nTool Status:\n'));
55
- const rows = versions.tools.map(tool => {
14
+ console.log(chalk.bold(' Tool Latest Downloaded Status Type'));
15
+ console.log(chalk.gray('─'.repeat(70)));
16
+ for (const tool of versions.tools) {
56
17
  const record = downloaded[tool.name];
18
+ const downloadedVersion = record?.version ?? '-';
57
19
  let status;
58
20
  if (!record) {
59
- status = 'new';
21
+ status = chalk.blue('NEW');
60
22
  }
61
23
  else if (record.version !== tool.version) {
62
- status = 'update';
24
+ status = chalk.yellow('UPDATE');
63
25
  }
64
26
  else {
65
- status = 'current';
27
+ status = chalk.green('');
66
28
  }
67
- return {
68
- displayName: tool.displayName,
69
- version: tool.version,
70
- downloadedVersion: record?.version ?? '-',
71
- status,
72
- type: isNpmTool(tool) ? 'npm' : 'download',
73
- };
74
- });
75
- renderTable(rows);
29
+ const typeStr = isNpmTool(tool) ? chalk.magenta('npm') : chalk.cyan('wget');
30
+ console.log(` ${tool.displayName.padEnd(18)} ${tool.version.padEnd(12)} ${downloadedVersion.padEnd(12)} ${status.padEnd(12)} ${typeStr}`);
31
+ }
76
32
  console.log('');
77
33
  }
78
34
  async function runConfig() {
79
35
  const configManager = new ConfigManager();
80
- // Check if already configured and show current values
81
- if (configManager.isConfigured()) {
82
- const current = configManager.load();
83
- console.log(chalk.bold('\nCurrent configuration:'));
84
- console.log(` Nexus URL: ${chalk.cyan(current.nexusUrl)}`);
85
- console.log(` Download dir: ${chalk.cyan(current.downloadDir)}`);
86
- console.log('');
87
- const { reconfigure } = await (await import('inquirer')).default.prompt([
88
- {
89
- type: 'confirm',
90
- name: 'reconfigure',
91
- message: 'Do you want to update these settings?',
92
- default: false,
93
- },
94
- ]);
95
- if (!reconfigure) {
96
- console.log(chalk.gray('Configuration unchanged.'));
97
- return;
98
- }
99
- // Prompt with current values as defaults
100
- const { promptReconfigure } = await import('./ui.js');
101
- const config = await promptReconfigure(current);
102
- configManager.save(config);
103
- }
104
- else {
105
- const config = await promptSetup();
106
- configManager.save(config);
107
- }
36
+ const config = await promptSetup();
37
+ configManager.save(config);
108
38
  console.log(chalk.green('\nConfiguration saved!'));
109
39
  }
110
40
  async function runInteractive() {
@@ -190,25 +120,9 @@ async function runInteractive() {
190
120
  }
191
121
  }
192
122
  async function main() {
193
- const rawArgs = process.argv.slice(2);
194
- // Handle flags first
195
- if (rawArgs.includes('-v') || rawArgs.includes('--version')) {
196
- console.log(getVersion());
197
- return;
198
- }
199
- if (rawArgs.includes('-h') || rawArgs.includes('--help')) {
200
- showHelp();
201
- return;
202
- }
203
- const args = rawArgs.filter(arg => !arg.startsWith('--') && !arg.startsWith('-'));
123
+ const args = process.argv.slice(2).filter(arg => !arg.startsWith('--'));
204
124
  const command = args[0];
205
125
  switch (command) {
206
- case 'version':
207
- console.log(getVersion());
208
- break;
209
- case 'help':
210
- showHelp();
211
- break;
212
126
  case 'status':
213
127
  await showStatus();
214
128
  break;
package/dist/ui.d.ts CHANGED
@@ -2,7 +2,6 @@ import type { VersionsJsonTool } from './types.js';
2
2
  import type { DownloadedState } from './tracker.js';
3
3
  import type { CliConfig } from './config.js';
4
4
  export declare function promptSetup(): Promise<CliConfig>;
5
- export declare function promptReconfigure(current: CliConfig): Promise<CliConfig>;
6
5
  interface ToolChoiceBase {
7
6
  name: string;
8
7
  displayName: string;
@@ -20,13 +19,5 @@ interface ToolChoiceNpm extends ToolChoiceBase {
20
19
  package: string;
21
20
  }
22
21
  export type ToolChoice = ToolChoiceDownload | ToolChoiceNpm;
23
- export interface TableRow {
24
- displayName: string;
25
- version: string;
26
- downloadedVersion: string;
27
- status: 'new' | 'update' | 'current';
28
- type: 'npm' | 'download';
29
- }
30
- export declare function renderTable(rows: TableRow[]): void;
31
22
  export declare function promptToolSelection(tools: VersionsJsonTool[], downloaded: DownloadedState, generatedAt: string): Promise<ToolChoice[]>;
32
23
  export {};
package/dist/ui.js CHANGED
@@ -30,35 +30,6 @@ export async function promptSetup() {
30
30
  downloadDir: answers.downloadDir.replace('~', process.env.HOME || ''),
31
31
  };
32
32
  }
33
- export async function promptReconfigure(current) {
34
- console.log(chalk.bold('\nUpdate your settings:\n'));
35
- const answers = await inquirer.prompt([
36
- {
37
- type: 'input',
38
- name: 'nexusUrl',
39
- message: 'Nexus proxy base URL:',
40
- default: current.nexusUrl,
41
- validate: (input) => {
42
- if (!input.trim())
43
- return 'URL is required';
44
- if (!input.startsWith('http'))
45
- return 'URL must start with http:// or https://';
46
- return true;
47
- },
48
- },
49
- {
50
- type: 'input',
51
- name: 'downloadDir',
52
- message: 'Download directory:',
53
- default: current.downloadDir,
54
- validate: (input) => input.trim() ? true : 'Directory is required',
55
- },
56
- ]);
57
- return {
58
- nexusUrl: answers.nexusUrl.replace(/\/$/, ''),
59
- downloadDir: answers.downloadDir.replace('~', process.env.HOME || ''),
60
- };
61
- }
62
33
  function getStatus(tool, downloaded) {
63
34
  const record = downloaded[tool.name];
64
35
  if (!record) {
@@ -94,28 +65,17 @@ function createToolChoice(tool, downloaded) {
94
65
  };
95
66
  }
96
67
  }
97
- export function renderTable(rows) {
98
- // Calculate dynamic column widths
99
- const colWidths = {
100
- tool: Math.max(4, ...rows.map(r => r.displayName.length)) + 2,
101
- latest: Math.max(6, ...rows.map(r => r.version.length)) + 2,
102
- downloaded: Math.max(10, ...rows.map(r => r.downloadedVersion.length)) + 2,
103
- status: 8,
104
- type: 4,
105
- };
106
- const totalWidth = colWidths.tool + colWidths.latest + colWidths.downloaded + colWidths.status + colWidths.type + 2;
107
- // Header
108
- console.log(chalk.bold(' ' +
109
- 'Tool'.padEnd(colWidths.tool) +
110
- 'Latest'.padEnd(colWidths.latest) +
111
- 'Downloaded'.padEnd(colWidths.downloaded) +
112
- 'Status'.padEnd(colWidths.status) +
113
- 'Type'));
114
- console.log(chalk.gray('─'.repeat(totalWidth)));
115
- // Rows
116
- for (const row of rows) {
68
+ export async function promptToolSelection(tools, downloaded, generatedAt) {
69
+ const choices = tools.map((tool) => createToolChoice(tool, downloaded));
70
+ console.log(chalk.bold(`\nrelease-radar-cli`));
71
+ console.log(chalk.gray(`Last updated: ${new Date(generatedAt).toLocaleString()}\n`));
72
+ // Display table
73
+ console.log(chalk.bold(' Tool Latest Downloaded Status Type'));
74
+ console.log(chalk.gray('─'.repeat(70)));
75
+ choices.forEach((choice) => {
76
+ const downloadedStr = choice.downloadedVersion ?? '-';
117
77
  let statusStr;
118
- switch (row.status) {
78
+ switch (choice.status) {
119
79
  case 'new':
120
80
  statusStr = chalk.blue('NEW');
121
81
  break;
@@ -126,28 +86,9 @@ export function renderTable(rows) {
126
86
  statusStr = chalk.green('✓');
127
87
  break;
128
88
  }
129
- const typeStr = row.type === 'npm' ? chalk.magenta('npm') : chalk.cyan('wget');
130
- console.log(' ' +
131
- row.displayName.padEnd(colWidths.tool) +
132
- row.version.padEnd(colWidths.latest) +
133
- row.downloadedVersion.padEnd(colWidths.downloaded) +
134
- statusStr.padEnd(colWidths.status + 5) + // +5 for chalk color codes
135
- typeStr);
136
- }
137
- }
138
- export async function promptToolSelection(tools, downloaded, generatedAt) {
139
- const choices = tools.map((tool) => createToolChoice(tool, downloaded));
140
- console.log(chalk.bold(`\nrelease-radar-cli`));
141
- console.log(chalk.gray(`Last updated: ${new Date(generatedAt).toLocaleString()}\n`));
142
- // Convert to table rows and display
143
- const rows = choices.map(choice => ({
144
- displayName: choice.displayName,
145
- version: choice.version,
146
- downloadedVersion: choice.downloadedVersion ?? '-',
147
- status: choice.status,
148
- type: choice.type === 'npm' ? 'npm' : 'download',
149
- }));
150
- renderTable(rows);
89
+ const typeStr = choice.type === 'npm' ? chalk.magenta('npm') : chalk.cyan('wget');
90
+ console.log(` ${choice.displayName.padEnd(18)} ${choice.version.padEnd(12)} ${downloadedStr.padEnd(12)} ${statusStr.padEnd(12)} ${typeStr}`);
91
+ });
151
92
  console.log('');
152
93
  const { selected } = await inquirer.prompt([
153
94
  {
package/dist/updater.js CHANGED
@@ -1,4 +1,4 @@
1
- import { execSync } from 'child_process';
1
+ import { execSync, spawn } from 'child_process';
2
2
  import { readFileSync } from 'fs';
3
3
  import { fileURLToPath } from 'url';
4
4
  import { dirname, join } from 'path';
@@ -40,7 +40,13 @@ export async function checkAndUpdate() {
40
40
  });
41
41
  if (result)
42
42
  console.log(result);
43
- console.log('Update complete. Please run the command again.\n');
43
+ console.log('Update complete. Restarting...\n');
44
+ // Restart self with a fresh terminal
45
+ const child = spawn(process.argv[0], process.argv.slice(1), {
46
+ detached: true,
47
+ stdio: 'inherit',
48
+ });
49
+ child.unref();
44
50
  process.exit(0);
45
51
  }
46
52
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvnt/release-radar-cli",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "Interactive CLI for downloading tools through Nexus proxy",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -16,8 +16,7 @@
16
16
  "files": [
17
17
  "dist",
18
18
  "bin",
19
- "versions.json",
20
- "README.md"
19
+ "versions.json"
21
20
  ],
22
21
  "keywords": [
23
22
  "release",
@@ -27,12 +26,6 @@
27
26
  ],
28
27
  "author": "lvnt",
29
28
  "license": "ISC",
30
- "repository": {
31
- "type": "git",
32
- "url": "git+https://github.com/lvntbkdmr/release-radar.git",
33
- "directory": "cli"
34
- },
35
- "homepage": "https://github.com/lvntbkdmr/release-radar#readme",
36
29
  "dependencies": {
37
30
  "chalk": "^5.3.0",
38
31
  "inquirer": "^9.2.12"
@@ -44,4 +37,4 @@
44
37
  "typescript": "^5.3.0",
45
38
  "vitest": "^1.1.0"
46
39
  }
47
- }
40
+ }
package/versions.json CHANGED
@@ -1,21 +1,109 @@
1
1
  {
2
- "generatedAt": "2026-01-24T10:00:00Z",
2
+ "generatedAt": "2026-01-25T15:40:53.910Z",
3
3
  "tools": [
4
+ {
5
+ "name": "Claude Code CLI",
6
+ "displayName": "Claude Code CLI",
7
+ "version": "2.1.19",
8
+ "publishedAt": "2026-01-25T15:40:53.910Z",
9
+ "downloadUrl": "{{NEXUS_URL}}/storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/2.1.19/win32-x64/claude.exe",
10
+ "filename": "claude-2.1.19.exe"
11
+ },
4
12
  {
5
13
  "name": "Ninja",
6
14
  "displayName": "Ninja",
7
- "version": "1.12.0",
8
- "publishedAt": "2026-01-20T00:00:00Z",
9
- "downloadUrl": "{{NEXUS_URL}}/github.com/ninja-build/ninja/releases/download/v1.12.0/ninja-linux.zip",
10
- "filename": "ninja-1.12.0-linux.zip"
15
+ "version": "1.13.2",
16
+ "publishedAt": "2026-01-25T15:40:53.910Z",
17
+ "downloadUrl": "{{NEXUS_URL}}/github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-win.zip",
18
+ "filename": "ninja-1.13.2-win.zip"
11
19
  },
12
20
  {
13
21
  "name": "CMake",
14
22
  "displayName": "CMake",
15
- "version": "3.28.1",
16
- "publishedAt": "2026-01-18T00:00:00Z",
17
- "downloadUrl": "{{NEXUS_URL}}/github.com/Kitware/CMake/releases/download/v3.28.1/cmake-3.28.1-linux-x86_64.tar.gz",
18
- "filename": "cmake-3.28.1-linux-x86_64.tar.gz"
23
+ "version": "4.2.2",
24
+ "publishedAt": "2026-01-25T15:40:53.910Z",
25
+ "downloadUrl": "{{NEXUS_URL}}/github.com/Kitware/CMake/releases/download/v4.2.2/cmake-4.2.2-windows-x86_64.zip",
26
+ "filename": "cmake-4.2.2-windows-x86_64.zip"
27
+ },
28
+ {
29
+ "name": "Git",
30
+ "displayName": "Git for Windows",
31
+ "version": "2.52.0.windows.1",
32
+ "publishedAt": "2026-01-25T15:40:53.910Z",
33
+ "downloadUrl": "{{NEXUS_URL}}/github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/Git-2.52.0-64-bit.exe",
34
+ "filename": "Git-2.52.0-64-bit.exe"
35
+ },
36
+ {
37
+ "name": "Clangd",
38
+ "displayName": "Clangd",
39
+ "version": "21.1.8",
40
+ "publishedAt": "2026-01-25T15:40:53.910Z",
41
+ "downloadUrl": "{{NEXUS_URL}}/github.com/clangd/clangd/releases/download/21.1.8/clangd-windows-21.1.8.zip",
42
+ "filename": "clangd-windows-21.1.8.zip"
43
+ },
44
+ {
45
+ "name": "Wezterm",
46
+ "displayName": "Wezterm",
47
+ "version": "20240203-110809-5046fc22",
48
+ "publishedAt": "2026-01-25T15:40:53.910Z",
49
+ "downloadUrl": "{{NEXUS_URL}}/github.com/wezterm/wezterm/releases/download/20240203-110809-5046fc22/WezTerm-20240203-110809-5046fc22-setup.exe",
50
+ "filename": "WezTerm-20240203-110809-5046fc22-setup.exe"
51
+ },
52
+ {
53
+ "name": "Ralphy",
54
+ "displayName": "Ralphy CLI",
55
+ "version": "4.5.3",
56
+ "publishedAt": "2026-01-25T15:40:53.910Z",
57
+ "type": "npm",
58
+ "package": "ralphy-cli"
59
+ },
60
+ {
61
+ "name": "vscode-cpptools",
62
+ "displayName": "C/C++ Extension",
63
+ "version": "1.29.3",
64
+ "publishedAt": "2026-01-25T15:40:53.910Z",
65
+ "downloadUrl": "{{NEXUS_URL}}/github.com/microsoft/vscode-cpptools/releases/download/v1.29.3/cpptools-windows-x64.vsix",
66
+ "filename": "cpptools-windows-x64-1.29.3.vsix"
67
+ },
68
+ {
69
+ "name": "vscode-clangd",
70
+ "displayName": "clangd Extension",
71
+ "version": "0.4.0",
72
+ "publishedAt": "2026-01-25T15:40:53.910Z",
73
+ "downloadUrl": "{{NEXUS_URL}}/github.com/clangd/vscode-clangd/releases/download/0.4.0/vscode-clangd-0.4.0.vsix",
74
+ "filename": "vscode-clangd-0.4.0.vsix"
75
+ },
76
+ {
77
+ "name": "CMake Tools",
78
+ "displayName": "CMake Tools Extension",
79
+ "version": "1.21.36",
80
+ "publishedAt": "2026-01-25T15:40:53.910Z",
81
+ "downloadUrl": "{{NEXUS_URL}}/github.com/microsoft/vscode-cmake-tools/releases/download/v1.21.36/cmake-tools.vsix",
82
+ "filename": "cmake-tools-1.21.36.vsix"
83
+ },
84
+ {
85
+ "name": "Roo Code",
86
+ "displayName": "Roo Code Extension",
87
+ "version": "3.43.0",
88
+ "publishedAt": "2026-01-25T15:40:53.910Z",
89
+ "downloadUrl": "{{NEXUS_URL}}/github.com/RooCodeInc/Roo-Code/releases/download/v3.43.0/roo-cline-3.43.0.vsix",
90
+ "filename": "roo-cline-3.43.0.vsix"
91
+ },
92
+ {
93
+ "name": "Atlascode",
94
+ "displayName": "Atlassian Extension",
95
+ "version": "4.0.17",
96
+ "publishedAt": "2026-01-25T15:40:53.910Z",
97
+ "downloadUrl": "{{NEXUS_URL}}/github.com/atlassian/atlascode/releases/download/v4.0.17/atlascode-4.0.17.vsix",
98
+ "filename": "atlascode-4.0.17.vsix"
99
+ },
100
+ {
101
+ "name": "Zed",
102
+ "displayName": "Zed",
103
+ "version": "0.220.6",
104
+ "publishedAt": "2026-01-25T15:40:53.910Z",
105
+ "downloadUrl": "{{NEXUS_URL}}/github.com/zed-industries/zed/releases/download/v0.220.6/Zed-x86_64.exe",
106
+ "filename": "Zed-0.220.6-x86_64.exe"
19
107
  }
20
108
  ]
21
- }
109
+ }
package/README.md DELETED
@@ -1,124 +0,0 @@
1
- # release-radar-cli
2
-
3
- Interactive CLI for downloading development tools through a Nexus proxy. Companion tool to [@lvnt/release-radar](https://www.npmjs.com/package/@lvnt/release-radar).
4
-
5
- ## Why?
6
-
7
- In corporate/intranet environments with restricted internet access, downloading tools directly isn't possible. This CLI:
8
-
9
- - Downloads tools through your Nexus proxy server
10
- - Tracks which versions you've downloaded
11
- - Shows available updates at a glance
12
- - Supports both wget downloads and npm global packages
13
-
14
- ## Installation
15
-
16
- ```bash
17
- npm install -g @lvnt/release-radar-cli
18
- ```
19
-
20
- ## Quick Start
21
-
22
- ```bash
23
- # Run interactive mode
24
- release-radar-cli
25
-
26
- # First run will prompt for configuration:
27
- # - Nexus proxy URL (e.g., https://nexus.company.com/repository/raw-proxy)
28
- # - Download directory (e.g., ~/downloads/tools)
29
- ```
30
-
31
- ## Commands
32
-
33
- | Command | Description |
34
- |---------|-------------|
35
- | `release-radar-cli` | Interactive mode - select and download tools |
36
- | `release-radar-cli status` | Show all tool versions and download status |
37
- | `release-radar-cli config` | Configure or reconfigure settings |
38
- | `release-radar-cli version` | Show CLI version |
39
- | `release-radar-cli help` | Show help message |
40
-
41
- ## Options
42
-
43
- | Option | Description |
44
- |--------|-------------|
45
- | `-v, --version` | Show version number |
46
- | `-h, --help` | Show help |
47
- | `--skip-update` | Skip auto-update check on startup |
48
-
49
- ## Interactive Mode
50
-
51
- When you run `release-radar-cli`, you'll see a table of available tools:
52
-
53
- ```
54
- Tool Latest Downloaded Status Type
55
- ──────────────────────────────────────────────────────────────────────
56
- Claude Code CLI 1.0.17 1.0.16 UPDATE wget
57
- Ninja 1.12.1 1.12.1 ✓ wget
58
- CMake 4.0.1 - NEW wget
59
- Ralphy 1.2.0 1.2.0 ✓ npm
60
- ```
61
-
62
- Select tools with arrow keys and spacebar, then press Enter to download.
63
-
64
- ## Status Display
65
-
66
- ```bash
67
- release-radar-cli status
68
- ```
69
-
70
- Shows versions without interactive prompts - useful for scripts or quick checks.
71
-
72
- ## Configuration
73
-
74
- Config is stored at `~/.release-radar-cli/config.json`:
75
-
76
- ```json
77
- {
78
- "nexusUrl": "https://nexus.company.com/repository/raw-proxy",
79
- "downloadDir": "/home/user/downloads/tools"
80
- }
81
- ```
82
-
83
- To reconfigure:
84
-
85
- ```bash
86
- release-radar-cli config
87
- ```
88
-
89
- ## Download Types
90
-
91
- ### wget (Binary Downloads)
92
-
93
- Downloads files through Nexus proxy using wget:
94
- - Claude Code CLI
95
- - Ninja
96
- - CMake
97
- - Git
98
- - Clangd
99
- - Wezterm
100
- - VS Code Extensions
101
-
102
- ### npm (Global Packages)
103
-
104
- Updates npm packages globally:
105
- - Ralphy
106
-
107
- ## Auto-Update
108
-
109
- The CLI checks for updates on startup and automatically updates itself if a newer version is available. Skip this with `--skip-update`.
110
-
111
- ## How It Works
112
-
113
- 1. **ReleaseRadar service** monitors tool versions and publishes updates to this CLI
114
- 2. **This CLI** reads the embedded `versions.json` containing latest versions and download URLs
115
- 3. **You select** which tools to download
116
- 4. **CLI downloads** through your configured Nexus proxy
117
-
118
- ## Related
119
-
120
- - [@lvnt/release-radar](https://www.npmjs.com/package/@lvnt/release-radar) - The monitoring service that powers this CLI
121
-
122
- ## License
123
-
124
- ISC