@lvnt/release-radar-cli 0.2.41 → 0.2.43

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
@@ -7,7 +7,7 @@ import { DownloadTracker } from './tracker.js';
7
7
  import { loadVersions } from './versions.js';
8
8
  import { checkAndUpdate } from './updater.js';
9
9
  import { downloadFile, updateNpmPackage } from './downloader.js';
10
- import { promptSetup, promptToolSelection, renderTable } from './ui.js';
10
+ import { promptSetup, promptToolSelection, renderTable, isVscodeExtension } from './ui.js';
11
11
  import { isNpmTool } from './types.js';
12
12
  function getVersion() {
13
13
  const __dirname = dirname(fileURLToPath(import.meta.url));
@@ -84,6 +84,7 @@ async function showStatus() {
84
84
  downloadedVersion: record?.version ?? '-',
85
85
  status,
86
86
  type: isNpmTool(tool) ? 'npm' : 'download',
87
+ category: isVscodeExtension(tool) ? 'vscode-extension' : 'tool',
87
88
  };
88
89
  });
89
90
  renderTable(rows);
package/dist/ui.d.ts CHANGED
@@ -26,7 +26,9 @@ export interface TableRow {
26
26
  downloadedVersion: string;
27
27
  status: 'new' | 'update' | 'current';
28
28
  type: 'npm' | 'download';
29
+ category: 'tool' | 'vscode-extension';
29
30
  }
30
31
  export declare function renderTable(rows: TableRow[]): void;
32
+ export declare function isVscodeExtension(tool: VersionsJsonTool): boolean;
31
33
  export declare function promptToolSelection(tools: VersionsJsonTool[], downloaded: DownloadedState, generatedAt: string): Promise<ToolChoice[]>;
32
34
  export {};
package/dist/ui.js CHANGED
@@ -94,72 +94,107 @@ function createToolChoice(tool, downloaded) {
94
94
  };
95
95
  }
96
96
  }
97
- export function renderTable(rows) {
98
- // Calculate dynamic column widths
99
- const colWidths = {
97
+ function calculateColWidths(rows) {
98
+ return {
100
99
  tool: Math.max(4, ...rows.map(r => r.displayName.length)) + 2,
101
100
  latest: Math.max(6, ...rows.map(r => r.version.length)) + 2,
102
101
  downloaded: Math.max(10, ...rows.map(r => r.downloadedVersion.length)) + 2,
103
102
  status: 8,
104
103
  type: 4,
105
104
  };
106
- const totalWidth = colWidths.tool + colWidths.latest + colWidths.downloaded + colWidths.status + colWidths.type + 2;
107
- // Header
105
+ }
106
+ function renderTableHeader(colWidths) {
108
107
  console.log(chalk.bold(' ' +
109
108
  'Tool'.padEnd(colWidths.tool) +
110
109
  'Latest'.padEnd(colWidths.latest) +
111
110
  'Downloaded'.padEnd(colWidths.downloaded) +
112
111
  'Status'.padEnd(colWidths.status) +
113
112
  'Type'));
113
+ const totalWidth = colWidths.tool + colWidths.latest + colWidths.downloaded + colWidths.status + colWidths.type + 2;
114
+ console.log(chalk.gray('─'.repeat(totalWidth)));
115
+ }
116
+ function renderTableRow(row, colWidths) {
117
+ let statusText;
118
+ let statusColored;
119
+ switch (row.status) {
120
+ case 'new':
121
+ statusText = 'NEW'.padEnd(colWidths.status);
122
+ statusColored = chalk.blue(statusText);
123
+ break;
124
+ case 'update':
125
+ statusText = 'UPDATE'.padEnd(colWidths.status);
126
+ statusColored = chalk.yellow(statusText);
127
+ break;
128
+ case 'current':
129
+ statusText = '✓'.padEnd(colWidths.status);
130
+ statusColored = chalk.green(statusText);
131
+ break;
132
+ }
133
+ const typeStr = row.type === 'npm' ? chalk.magenta('npm') : chalk.cyan('wget');
134
+ console.log(' ' +
135
+ row.displayName.padEnd(colWidths.tool) +
136
+ row.version.padEnd(colWidths.latest) +
137
+ row.downloadedVersion.padEnd(colWidths.downloaded) +
138
+ statusColored +
139
+ typeStr);
140
+ }
141
+ function renderGroupHeader(title, colWidths) {
142
+ const totalWidth = colWidths.tool + colWidths.latest + colWidths.downloaded + colWidths.status + colWidths.type + 2;
143
+ console.log('');
144
+ console.log(chalk.bold.underline(` ${title}`));
114
145
  console.log(chalk.gray('─'.repeat(totalWidth)));
115
- // Rows
116
- for (const row of rows) {
117
- // Pad plain text BEFORE applying colors (chalk adds invisible ANSI codes)
118
- let statusText;
119
- let statusColored;
120
- switch (row.status) {
121
- case 'new':
122
- statusText = 'NEW'.padEnd(colWidths.status);
123
- statusColored = chalk.blue(statusText);
124
- break;
125
- case 'update':
126
- statusText = 'UPDATE'.padEnd(colWidths.status);
127
- statusColored = chalk.yellow(statusText);
128
- break;
129
- case 'current':
130
- statusText = '✓'.padEnd(colWidths.status);
131
- statusColored = chalk.green(statusText);
132
- break;
146
+ }
147
+ export function renderTable(rows) {
148
+ const colWidths = calculateColWidths(rows);
149
+ // Group rows by category
150
+ const tools = rows.filter(r => r.category === 'tool');
151
+ const extensions = rows.filter(r => r.category === 'vscode-extension');
152
+ // Render tools first
153
+ if (tools.length > 0) {
154
+ renderTableHeader(colWidths);
155
+ for (const row of tools) {
156
+ renderTableRow(row, colWidths);
157
+ }
158
+ }
159
+ // Render VSCode extensions as a separate group
160
+ if (extensions.length > 0) {
161
+ renderGroupHeader('VSCode Extensions', colWidths);
162
+ for (const row of extensions) {
163
+ renderTableRow(row, colWidths);
133
164
  }
134
- const typeStr = row.type === 'npm' ? chalk.magenta('npm') : chalk.cyan('wget');
135
- console.log(' ' +
136
- row.displayName.padEnd(colWidths.tool) +
137
- row.version.padEnd(colWidths.latest) +
138
- row.downloadedVersion.padEnd(colWidths.downloaded) +
139
- statusColored +
140
- typeStr);
141
165
  }
142
166
  }
167
+ export function isVscodeExtension(tool) {
168
+ if (isNpmTool(tool))
169
+ return false;
170
+ // Check if filename ends with .vsix
171
+ return tool.filename.toLowerCase().endsWith('.vsix');
172
+ }
143
173
  export async function promptToolSelection(tools, downloaded, generatedAt) {
144
174
  const choices = tools.map((tool) => createToolChoice(tool, downloaded));
145
175
  console.log(chalk.bold(`\nrelease-radar-cli`));
146
176
  console.log(chalk.gray(`Last updated: ${new Date(generatedAt).toLocaleString()}\n`));
147
- // Convert to table rows and display
148
- const rows = choices.map(choice => ({
149
- displayName: choice.displayName,
150
- version: choice.version,
151
- downloadedVersion: choice.downloadedVersion ?? '-',
152
- status: choice.status,
153
- type: choice.type === 'npm' ? 'npm' : 'download',
177
+ // Convert to table rows with category and display
178
+ const rows = tools.map((tool, i) => ({
179
+ displayName: choices[i].displayName,
180
+ version: choices[i].version,
181
+ downloadedVersion: choices[i].downloadedVersion ?? '-',
182
+ status: choices[i].status,
183
+ type: choices[i].type === 'npm' ? 'npm' : 'download',
184
+ category: isVscodeExtension(tool) ? 'vscode-extension' : 'tool',
154
185
  }));
155
186
  renderTable(rows);
156
187
  console.log('');
188
+ // Sort choices to match displayed order (tools first, then extensions)
189
+ const toolChoices = choices.filter((_, i) => !isVscodeExtension(tools[i]));
190
+ const extensionChoices = choices.filter((_, i) => isVscodeExtension(tools[i]));
191
+ const sortedChoices = [...toolChoices, ...extensionChoices];
157
192
  const { selected } = await inquirer.prompt([
158
193
  {
159
194
  type: 'checkbox',
160
195
  name: 'selected',
161
196
  message: 'Select tools to download:',
162
- choices: choices.map((choice) => ({
197
+ choices: sortedChoices.map((choice) => ({
163
198
  name: `${choice.displayName} ${choice.version}`,
164
199
  value: choice,
165
200
  checked: choice.status !== 'current',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvnt/release-radar-cli",
3
- "version": "0.2.41",
3
+ "version": "0.2.43",
4
4
  "description": "Interactive CLI for downloading tools through Nexus proxy",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
package/versions.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
- "generatedAt": "2026-01-29T11:00:10.128Z",
2
+ "generatedAt": "2026-01-29T20:20:55.513Z",
3
3
  "tools": [
4
4
  {
5
5
  "name": "VSCode",
6
6
  "displayName": "VS Code",
7
7
  "version": "1.108.2",
8
- "publishedAt": "2026-01-29T11:00:10.127Z",
8
+ "publishedAt": "2026-01-29T20:20:55.511Z",
9
9
  "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/vscode-v1.108.2/VSCode-1.108.2-win-x64.msi",
10
10
  "filename": "VSCode-1.108.2-win-x64.msi"
11
11
  },
@@ -13,7 +13,7 @@
13
13
  "name": "Claude Code CLI",
14
14
  "displayName": "Claude Code CLI",
15
15
  "version": "2.1.23",
16
- "publishedAt": "2026-01-29T11:00:10.127Z",
16
+ "publishedAt": "2026-01-29T20:20:55.511Z",
17
17
  "downloadUrl": "{{NEXUS_URL}}/storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/2.1.23/win32-x64/claude.exe",
18
18
  "filename": "claude-2.1.23.exe"
19
19
  },
@@ -21,7 +21,7 @@
21
21
  "name": "Ninja",
22
22
  "displayName": "Ninja",
23
23
  "version": "1.13.2",
24
- "publishedAt": "2026-01-29T11:00:10.127Z",
24
+ "publishedAt": "2026-01-29T20:20:55.511Z",
25
25
  "downloadUrl": "{{NEXUS_URL}}/github.com/ninja-build/ninja/releases/download/v1.13.2/ninja-win.zip",
26
26
  "filename": "ninja-1.13.2-win.zip"
27
27
  },
@@ -29,7 +29,7 @@
29
29
  "name": "CMake",
30
30
  "displayName": "CMake",
31
31
  "version": "4.2.3",
32
- "publishedAt": "2026-01-29T11:00:10.127Z",
32
+ "publishedAt": "2026-01-29T20:20:55.511Z",
33
33
  "downloadUrl": "{{NEXUS_URL}}/github.com/Kitware/CMake/releases/download/v4.2.3/cmake-4.2.3-windows-x86_64.zip",
34
34
  "filename": "cmake-4.2.3-windows-x86_64.zip"
35
35
  },
@@ -37,7 +37,7 @@
37
37
  "name": "Git",
38
38
  "displayName": "Git for Windows",
39
39
  "version": "2.52.0.windows.1",
40
- "publishedAt": "2026-01-29T11:00:10.127Z",
40
+ "publishedAt": "2026-01-29T20:20:55.511Z",
41
41
  "downloadUrl": "{{NEXUS_URL}}/github.com/git-for-windows/git/releases/download/v2.52.0.windows.1/Git-2.52.0-64-bit.exe",
42
42
  "filename": "Git-2.52.0-64-bit.exe"
43
43
  },
@@ -45,7 +45,7 @@
45
45
  "name": "Clangd",
46
46
  "displayName": "Clangd",
47
47
  "version": "21.1.8",
48
- "publishedAt": "2026-01-29T11:00:10.127Z",
48
+ "publishedAt": "2026-01-29T20:20:55.511Z",
49
49
  "downloadUrl": "{{NEXUS_URL}}/github.com/clangd/clangd/releases/download/21.1.8/clangd-windows-21.1.8.zip",
50
50
  "filename": "clangd-windows-21.1.8.zip"
51
51
  },
@@ -53,7 +53,7 @@
53
53
  "name": "Wezterm",
54
54
  "displayName": "Wezterm",
55
55
  "version": "20240203-110809-5046fc22",
56
- "publishedAt": "2026-01-29T11:00:10.127Z",
56
+ "publishedAt": "2026-01-29T20:20:55.511Z",
57
57
  "downloadUrl": "{{NEXUS_URL}}/github.com/wezterm/wezterm/releases/download/20240203-110809-5046fc22/WezTerm-20240203-110809-5046fc22-setup.exe",
58
58
  "filename": "WezTerm-20240203-110809-5046fc22-setup.exe"
59
59
  },
@@ -61,7 +61,7 @@
61
61
  "name": "Ralphy",
62
62
  "displayName": "Ralphy CLI",
63
63
  "version": "4.7.1",
64
- "publishedAt": "2026-01-29T11:00:10.127Z",
64
+ "publishedAt": "2026-01-29T20:20:55.511Z",
65
65
  "type": "npm",
66
66
  "package": "ralphy-cli"
67
67
  },
@@ -69,7 +69,7 @@
69
69
  "name": "vscode-cpptools",
70
70
  "displayName": "C/C++ Extension",
71
71
  "version": "1.29.3",
72
- "publishedAt": "2026-01-29T11:00:10.127Z",
72
+ "publishedAt": "2026-01-29T20:20:55.511Z",
73
73
  "downloadUrl": "{{NEXUS_URL}}/github.com/microsoft/vscode-cpptools/releases/download/v1.29.3/cpptools-windows-x64.vsix",
74
74
  "filename": "cpptools-windows-x64-1.29.3.vsix"
75
75
  },
@@ -77,7 +77,7 @@
77
77
  "name": "vscode-clangd",
78
78
  "displayName": "clangd Extension",
79
79
  "version": "0.4.0",
80
- "publishedAt": "2026-01-29T11:00:10.127Z",
80
+ "publishedAt": "2026-01-29T20:20:55.511Z",
81
81
  "downloadUrl": "{{NEXUS_URL}}/github.com/clangd/vscode-clangd/releases/download/0.4.0/vscode-clangd-0.4.0.vsix",
82
82
  "filename": "vscode-clangd-0.4.0.vsix"
83
83
  },
@@ -85,7 +85,7 @@
85
85
  "name": "Claude Code VSCode",
86
86
  "displayName": "Claude Code Extension",
87
87
  "version": "2.1.23",
88
- "publishedAt": "2026-01-29T11:00:10.127Z",
88
+ "publishedAt": "2026-01-29T20:20:55.511Z",
89
89
  "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/claude-code-vscode-v2.1.23/claude-code-2.1.23-win32-x64.vsix",
90
90
  "filename": "claude-code-2.1.23-win32-x64.vsix"
91
91
  },
@@ -93,7 +93,7 @@
93
93
  "name": "CMake Tools",
94
94
  "displayName": "CMake Tools Extension",
95
95
  "version": "1.22.26",
96
- "publishedAt": "2026-01-29T11:00:10.127Z",
96
+ "publishedAt": "2026-01-29T20:20:55.511Z",
97
97
  "downloadUrl": "{{NEXUS_URL}}/github.com/microsoft/vscode-cmake-tools/releases/download/v1.22.26/cmake-tools.vsix",
98
98
  "filename": "cmake-tools-1.22.26.vsix"
99
99
  },
@@ -101,7 +101,7 @@
101
101
  "name": "Roo Code",
102
102
  "displayName": "Roo Code Extension",
103
103
  "version": "3.45.0",
104
- "publishedAt": "2026-01-29T11:00:10.127Z",
104
+ "publishedAt": "2026-01-29T20:20:55.511Z",
105
105
  "downloadUrl": "{{NEXUS_URL}}/github.com/RooCodeInc/Roo-Code/releases/download/v3.45.0/roo-cline-3.45.0.vsix",
106
106
  "filename": "roo-cline-3.45.0.vsix"
107
107
  },
@@ -109,7 +109,7 @@
109
109
  "name": "Atlascode",
110
110
  "displayName": "Atlassian Extension",
111
111
  "version": "4.0.17",
112
- "publishedAt": "2026-01-29T11:00:10.127Z",
112
+ "publishedAt": "2026-01-29T20:20:55.511Z",
113
113
  "downloadUrl": "{{NEXUS_URL}}/github.com/atlassian/atlascode/releases/download/v4.0.17/atlascode-4.0.17.vsix",
114
114
  "filename": "atlascode-4.0.17.vsix"
115
115
  },
@@ -117,7 +117,7 @@
117
117
  "name": "Zed",
118
118
  "displayName": "Zed",
119
119
  "version": "0.221.4",
120
- "publishedAt": "2026-01-29T11:00:10.127Z",
120
+ "publishedAt": "2026-01-29T20:20:55.511Z",
121
121
  "downloadUrl": "{{NEXUS_URL}}/github.com/zed-industries/zed/releases/download/v0.221.4/Zed-x86_64.exe",
122
122
  "filename": "Zed-0.221.4-x86_64.exe"
123
123
  },
@@ -125,7 +125,7 @@
125
125
  "name": "Claude Code Router",
126
126
  "displayName": "Claude Code Router",
127
127
  "version": "2.0.0",
128
- "publishedAt": "2026-01-29T11:00:10.127Z",
128
+ "publishedAt": "2026-01-29T20:20:55.511Z",
129
129
  "type": "npm",
130
130
  "package": "@musistudio/claude-code-router"
131
131
  },
@@ -133,17 +133,81 @@
133
133
  "name": "PowerShell",
134
134
  "displayName": "PowerShell",
135
135
  "version": "7.5.4",
136
- "publishedAt": "2026-01-29T11:00:10.127Z",
136
+ "publishedAt": "2026-01-29T20:20:55.511Z",
137
137
  "downloadUrl": "{{NEXUS_URL}}/github.com/PowerShell/PowerShell/releases/download/v7.5.4/PowerShell-7.5.4-win-x64.msi",
138
138
  "filename": "PowerShell-7.5.4-win-x64.msi"
139
139
  },
140
+ {
141
+ "name": "C/C++ Extension Pack",
142
+ "displayName": "C/C++ Extension Pack",
143
+ "version": "1.3.1",
144
+ "publishedAt": "2026-01-29T20:20:55.511Z",
145
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/c/c++-extension-pack-v1.3.1/cpptools-extension-pack-1.3.1.vsix",
146
+ "filename": "cpptools-extension-pack-1.3.1.vsix"
147
+ },
148
+ {
149
+ "name": "C/C++ Themes",
150
+ "displayName": "C/C++ Themes",
151
+ "version": "2.0.0",
152
+ "publishedAt": "2026-01-29T20:20:55.511Z",
153
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/c/c++-themes-v2.0.0/cpptools-themes-2.0.0.vsix",
154
+ "filename": "cpptools-themes-2.0.0.vsix"
155
+ },
156
+ {
157
+ "name": "YAML",
158
+ "displayName": "YAML Extension",
159
+ "version": "1.20.2026012308",
160
+ "publishedAt": "2026-01-29T20:20:55.511Z",
161
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/yaml-v1.20.2026012308/vscode-yaml-1.20.2026012308.vsix",
162
+ "filename": "vscode-yaml-1.20.2026012308.vsix"
163
+ },
164
+ {
165
+ "name": "Python Debugger",
166
+ "displayName": "Python Debugger",
167
+ "version": "2025.19.2026012701",
168
+ "publishedAt": "2026-01-29T20:20:55.512Z",
169
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/batch-2026-01-29-232025/debugpy-2025.19.2026012701.vsix",
170
+ "filename": "debugpy-2025.19.2026012701.vsix"
171
+ },
140
172
  {
141
173
  "name": "Pylance",
142
174
  "displayName": "Pylance",
143
175
  "version": "2025.12.102",
144
- "publishedAt": "2026-01-29T11:00:10.128Z",
176
+ "publishedAt": "2026-01-29T20:20:55.512Z",
145
177
  "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/pylance-v2025.12.102/vscode-pylance-2025.12.102.vsix",
146
178
  "filename": "vscode-pylance-2025.12.102.vsix"
179
+ },
180
+ {
181
+ "name": "isort",
182
+ "displayName": "isort Extension",
183
+ "version": "2025.1.13251007",
184
+ "publishedAt": "2026-01-29T20:20:55.512Z",
185
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/isort-v2025.1.13251007/isort-2025.1.13251007.vsix",
186
+ "filename": "isort-2025.1.13251007.vsix"
187
+ },
188
+ {
189
+ "name": "Go",
190
+ "displayName": "Go Extension",
191
+ "version": "0.53.1",
192
+ "publishedAt": "2026-01-29T20:20:55.513Z",
193
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/go-v0.53.1/go-0.53.1.vsix",
194
+ "filename": "go-0.53.1.vsix"
195
+ },
196
+ {
197
+ "name": "GitHub Theme",
198
+ "displayName": "GitHub Theme",
199
+ "version": "6.3.5",
200
+ "publishedAt": "2026-01-29T20:20:55.513Z",
201
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/github-theme-v6.3.5/github-vscode-theme-6.3.5.vsix",
202
+ "filename": "github-vscode-theme-6.3.5.vsix"
203
+ },
204
+ {
205
+ "name": "Material Icon Theme",
206
+ "displayName": "Material Icon Theme",
207
+ "version": "5.31.0",
208
+ "publishedAt": "2026-01-29T20:20:55.513Z",
209
+ "downloadUrl": "{{NEXUS_URL}}/github.com/lvntbkdmr/apps/releases/download/material-icon-theme-v5.31.0/material-icon-theme-5.31.0.vsix",
210
+ "filename": "material-icon-theme-5.31.0.vsix"
147
211
  }
148
212
  ]
149
213
  }