@fredlackey/devutils 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +156 -0
- package/bin/dev.js +16 -0
- package/files/README.md +0 -0
- package/files/claude/.claude/commands/setup-context.md +3 -0
- package/files/monorepos/_archive/README.md +36 -0
- package/files/monorepos/_legacy/README.md +36 -0
- package/files/monorepos/ai-docs/README.md +33 -0
- package/files/monorepos/apps/README.md +24 -0
- package/files/monorepos/docs/README.md +40 -0
- package/files/monorepos/packages/README.md +25 -0
- package/files/monorepos/research/README.md +29 -0
- package/files/monorepos/scripts/README.md +24 -0
- package/package.json +39 -0
- package/src/cli.js +68 -0
- package/src/commands/README.md +41 -0
- package/src/commands/configure.js +199 -0
- package/src/commands/identity.js +1630 -0
- package/src/commands/ignore.js +247 -0
- package/src/commands/install.js +173 -0
- package/src/commands/setup.js +212 -0
- package/src/commands/status.js +223 -0
- package/src/completion.js +284 -0
- package/src/constants.js +45 -0
- package/src/ignore/claude-code.txt +10 -0
- package/src/ignore/docker.txt +18 -0
- package/src/ignore/linux.txt +23 -0
- package/src/ignore/macos.txt +36 -0
- package/src/ignore/node.txt +55 -0
- package/src/ignore/terraform.txt +37 -0
- package/src/ignore/vscode.txt +18 -0
- package/src/ignore/windows.txt +35 -0
- package/src/index.js +0 -0
- package/src/installs/README.md +399 -0
- package/src/installs/adobe-creative-cloud.js +44 -0
- package/src/installs/appcleaner.js +44 -0
- package/src/installs/atomicparsley.js +44 -0
- package/src/installs/aws-cli.js +44 -0
- package/src/installs/balena-etcher.js +44 -0
- package/src/installs/bambu-studio.js +44 -0
- package/src/installs/bash-completion.js +44 -0
- package/src/installs/bash.js +44 -0
- package/src/installs/beyond-compare.js +44 -0
- package/src/installs/build-essential.js +44 -0
- package/src/installs/caffeine.js +44 -0
- package/src/installs/camtasia.js +44 -0
- package/src/installs/chatgpt.js +44 -0
- package/src/installs/chrome-canary.js +44 -0
- package/src/installs/chromium.js +44 -0
- package/src/installs/claude-code.js +44 -0
- package/src/installs/curl.js +44 -0
- package/src/installs/cursor.js +44 -0
- package/src/installs/dbschema.js +44 -0
- package/src/installs/docker.js +44 -0
- package/src/installs/drawio.js +44 -0
- package/src/installs/elmedia-player.js +44 -0
- package/src/installs/ffmpeg.js +44 -0
- package/src/installs/gemini-cli.js +44 -0
- package/src/installs/git.js +44 -0
- package/src/installs/gitego.js +44 -0
- package/src/installs/go.js +44 -0
- package/src/installs/google-chrome.js +44 -0
- package/src/installs/gpg.js +141 -0
- package/src/installs/homebrew.js +44 -0
- package/src/installs/imageoptim.js +44 -0
- package/src/installs/jq.js +44 -0
- package/src/installs/keyboard-maestro.js +44 -0
- package/src/installs/latex.js +44 -0
- package/src/installs/lftp.js +44 -0
- package/src/installs/messenger.js +44 -0
- package/src/installs/microsoft-office.js +44 -0
- package/src/installs/microsoft-teams.js +44 -0
- package/src/installs/node.js +44 -0
- package/src/installs/nordpass.js +44 -0
- package/src/installs/nvm.js +44 -0
- package/src/installs/openssh.js +134 -0
- package/src/installs/pandoc.js +44 -0
- package/src/installs/pinentry.js +44 -0
- package/src/installs/pngyu.js +44 -0
- package/src/installs/postman.js +44 -0
- package/src/installs/safari-tech-preview.js +44 -0
- package/src/installs/sfnt2woff.js +44 -0
- package/src/installs/shellcheck.js +44 -0
- package/src/installs/slack.js +44 -0
- package/src/installs/snagit.js +44 -0
- package/src/installs/spotify.js +44 -0
- package/src/installs/studio-3t.js +44 -0
- package/src/installs/sublime-text.js +44 -0
- package/src/installs/superwhisper.js +44 -0
- package/src/installs/tailscale.js +44 -0
- package/src/installs/termius.js +44 -0
- package/src/installs/terraform.js +44 -0
- package/src/installs/tidal.js +44 -0
- package/src/installs/tmux.js +44 -0
- package/src/installs/tree.js +44 -0
- package/src/installs/vim.js +44 -0
- package/src/installs/vlc.js +44 -0
- package/src/installs/vscode.js +44 -0
- package/src/installs/whatsapp.js +44 -0
- package/src/installs/woff2.js +44 -0
- package/src/installs/xcode.js +44 -0
- package/src/installs/yarn.js +44 -0
- package/src/installs/yq.js +44 -0
- package/src/installs/yt-dlp.js +44 -0
- package/src/installs/zoom.js +44 -0
- package/src/scripts/README.md +95 -0
- package/src/scripts/afk.js +23 -0
- package/src/scripts/backup-all.js +24 -0
- package/src/scripts/backup-source.js +24 -0
- package/src/scripts/brewd.js +23 -0
- package/src/scripts/brewi.js +24 -0
- package/src/scripts/brewr.js +24 -0
- package/src/scripts/brews.js +24 -0
- package/src/scripts/brewu.js +23 -0
- package/src/scripts/c.js +23 -0
- package/src/scripts/ccurl.js +24 -0
- package/src/scripts/certbot-crontab-init.js +24 -0
- package/src/scripts/certbot-init.js +25 -0
- package/src/scripts/ch.js +23 -0
- package/src/scripts/claude-danger.js +23 -0
- package/src/scripts/clean-dev.js +24 -0
- package/src/scripts/clear-dns-cache.js +23 -0
- package/src/scripts/clone.js +25 -0
- package/src/scripts/code-all.js +24 -0
- package/src/scripts/count-files.js +24 -0
- package/src/scripts/count-folders.js +24 -0
- package/src/scripts/count.js +24 -0
- package/src/scripts/d.js +23 -0
- package/src/scripts/datauri.js +24 -0
- package/src/scripts/delete-files.js +24 -0
- package/src/scripts/docker-clean.js +24 -0
- package/src/scripts/dp.js +23 -0
- package/src/scripts/e.js +24 -0
- package/src/scripts/empty-trash.js +23 -0
- package/src/scripts/evm.js +25 -0
- package/src/scripts/fetch-github-repos.js +25 -0
- package/src/scripts/get-channel.js +24 -0
- package/src/scripts/get-course.js +26 -0
- package/src/scripts/get-dependencies.js +25 -0
- package/src/scripts/get-folder.js +26 -0
- package/src/scripts/get-tunes.js +25 -0
- package/src/scripts/get-video.js +24 -0
- package/src/scripts/git-backup.js +25 -0
- package/src/scripts/git-clone.js +25 -0
- package/src/scripts/git-pup.js +23 -0
- package/src/scripts/git-push.js +24 -0
- package/src/scripts/h.js +24 -0
- package/src/scripts/hide-desktop-icons.js +23 -0
- package/src/scripts/hide-hidden-files.js +23 -0
- package/src/scripts/install-dependencies-from.js +25 -0
- package/src/scripts/ips.js +26 -0
- package/src/scripts/iso.js +24 -0
- package/src/scripts/killni.js +23 -0
- package/src/scripts/ll.js +24 -0
- package/src/scripts/local-ip.js +23 -0
- package/src/scripts/m.js +24 -0
- package/src/scripts/map.js +24 -0
- package/src/scripts/mkd.js +24 -0
- package/src/scripts/ncu-update-all.js +24 -0
- package/src/scripts/nginx-init.js +28 -0
- package/src/scripts/npmi.js +23 -0
- package/src/scripts/o.js +24 -0
- package/src/scripts/org-by-date.js +24 -0
- package/src/scripts/p.js +23 -0
- package/src/scripts/packages.js +25 -0
- package/src/scripts/path.js +23 -0
- package/src/scripts/ports.js +23 -0
- package/src/scripts/q.js +23 -0
- package/src/scripts/refresh-files.js +26 -0
- package/src/scripts/remove-smaller-files.js +24 -0
- package/src/scripts/rename-files-with-date.js +25 -0
- package/src/scripts/resize-image.js +25 -0
- package/src/scripts/rm-safe.js +24 -0
- package/src/scripts/s.js +24 -0
- package/src/scripts/set-git-public.js +23 -0
- package/src/scripts/show-desktop-icons.js +23 -0
- package/src/scripts/show-hidden-files.js +23 -0
- package/src/scripts/tpa.js +23 -0
- package/src/scripts/tpo.js +23 -0
- package/src/scripts/u.js +23 -0
- package/src/scripts/vpush.js +23 -0
- package/src/scripts/y.js +23 -0
- package/src/utils/README.md +95 -0
- package/src/utils/common/apps.js +143 -0
- package/src/utils/common/display.js +157 -0
- package/src/utils/common/network.js +185 -0
- package/src/utils/common/os.js +202 -0
- package/src/utils/common/package-manager.js +301 -0
- package/src/utils/common/privileges.js +138 -0
- package/src/utils/common/shell.js +195 -0
- package/src/utils/macos/apps.js +228 -0
- package/src/utils/macos/brew.js +315 -0
- package/src/utils/ubuntu/apt.js +301 -0
- package/src/utils/ubuntu/desktop.js +292 -0
- package/src/utils/ubuntu/snap.js +302 -0
- package/src/utils/ubuntu/systemd.js +286 -0
- package/src/utils/windows/choco.js +327 -0
- package/src/utils/windows/env.js +246 -0
- package/src/utils/windows/registry.js +269 -0
- package/src/utils/windows/shell.js +240 -0
- package/src/utils/windows/winget.js +378 -0
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Windows Package Manager (winget) Utilities
|
|
5
|
+
*
|
|
6
|
+
* Windows-specific utilities for interacting with winget.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const shell = require('../common/shell');
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Checks if winget is available
|
|
13
|
+
* @returns {boolean}
|
|
14
|
+
*/
|
|
15
|
+
function isInstalled() {
|
|
16
|
+
return shell.commandExists('winget');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Returns the installed winget version
|
|
21
|
+
* @returns {Promise<string|null>}
|
|
22
|
+
*/
|
|
23
|
+
async function getVersion() {
|
|
24
|
+
if (!isInstalled()) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const result = await shell.exec('winget --version');
|
|
29
|
+
if (result.code === 0) {
|
|
30
|
+
// Output: "v1.6.2771"
|
|
31
|
+
return result.stdout.trim().replace(/^v/, '');
|
|
32
|
+
}
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Installs a package via winget
|
|
38
|
+
* @param {string} packageName - The package name or ID to install
|
|
39
|
+
* @param {Object} [options] - Installation options
|
|
40
|
+
* @param {boolean} [options.silent=true] - Silent installation
|
|
41
|
+
* @param {string} [options.version] - Specific version to install
|
|
42
|
+
* @param {string} [options.source] - Package source (winget, msstore)
|
|
43
|
+
* @returns {Promise<{ success: boolean, output: string }>}
|
|
44
|
+
*/
|
|
45
|
+
async function install(packageName, options = {}) {
|
|
46
|
+
if (!isInstalled()) {
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
output: 'winget is not available'
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
let command = `winget install "${packageName}" --accept-package-agreements --accept-source-agreements`;
|
|
54
|
+
|
|
55
|
+
if (options.silent !== false) {
|
|
56
|
+
command += ' --silent';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (options.version) {
|
|
60
|
+
command += ` --version "${options.version}"`;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (options.source) {
|
|
64
|
+
command += ` --source ${options.source}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const result = await shell.exec(command);
|
|
68
|
+
return {
|
|
69
|
+
success: result.code === 0,
|
|
70
|
+
output: result.stdout || result.stderr
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Removes a package via winget
|
|
76
|
+
* @param {string} packageName - The package name or ID to remove
|
|
77
|
+
* @param {Object} [options] - Removal options
|
|
78
|
+
* @param {boolean} [options.silent=true] - Silent uninstallation
|
|
79
|
+
* @returns {Promise<{ success: boolean, output: string }>}
|
|
80
|
+
*/
|
|
81
|
+
async function uninstall(packageName, options = {}) {
|
|
82
|
+
if (!isInstalled()) {
|
|
83
|
+
return {
|
|
84
|
+
success: false,
|
|
85
|
+
output: 'winget is not available'
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
let command = `winget uninstall "${packageName}"`;
|
|
90
|
+
|
|
91
|
+
if (options.silent !== false) {
|
|
92
|
+
command += ' --silent';
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const result = await shell.exec(command);
|
|
96
|
+
return {
|
|
97
|
+
success: result.code === 0,
|
|
98
|
+
output: result.stdout || result.stderr
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Checks if a package is installed
|
|
104
|
+
* @param {string} packageName - The package name or ID to check
|
|
105
|
+
* @returns {Promise<boolean>}
|
|
106
|
+
*/
|
|
107
|
+
async function isPackageInstalled(packageName) {
|
|
108
|
+
if (!isInstalled()) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const result = await shell.exec(`winget list --exact --id "${packageName}"`);
|
|
113
|
+
// Check if the output contains the package
|
|
114
|
+
if (result.code === 0 && result.stdout.includes(packageName)) {
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Try by name if ID didn't match
|
|
119
|
+
const nameResult = await shell.exec(`winget list --exact --name "${packageName}"`);
|
|
120
|
+
return nameResult.code === 0 && nameResult.stdout.includes(packageName);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Returns the installed version of a package
|
|
125
|
+
* @param {string} packageName - The package name or ID
|
|
126
|
+
* @returns {Promise<string|null>}
|
|
127
|
+
*/
|
|
128
|
+
async function getPackageVersion(packageName) {
|
|
129
|
+
if (!isInstalled()) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const result = await shell.exec(`winget list --exact --id "${packageName}"`);
|
|
134
|
+
if (result.code !== 0) {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Parse the output to find the version
|
|
139
|
+
// Output format is a table with columns: Name, Id, Version, Available, Source
|
|
140
|
+
const lines = result.stdout.split('\n').filter(Boolean);
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
if (line.includes(packageName)) {
|
|
143
|
+
// Find version column (typically after the ID)
|
|
144
|
+
const parts = line.split(/\s{2,}/);
|
|
145
|
+
if (parts.length >= 3) {
|
|
146
|
+
return parts[2].trim();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Upgrades a package
|
|
156
|
+
* @param {string} packageName - The package name or ID to upgrade
|
|
157
|
+
* @param {Object} [options] - Upgrade options
|
|
158
|
+
* @param {boolean} [options.silent=true] - Silent upgrade
|
|
159
|
+
* @returns {Promise<{ success: boolean, output: string }>}
|
|
160
|
+
*/
|
|
161
|
+
async function upgrade(packageName, options = {}) {
|
|
162
|
+
if (!isInstalled()) {
|
|
163
|
+
return {
|
|
164
|
+
success: false,
|
|
165
|
+
output: 'winget is not available'
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
let command = `winget upgrade "${packageName}" --accept-package-agreements --accept-source-agreements`;
|
|
170
|
+
|
|
171
|
+
if (options.silent !== false) {
|
|
172
|
+
command += ' --silent';
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const result = await shell.exec(command);
|
|
176
|
+
return {
|
|
177
|
+
success: result.code === 0,
|
|
178
|
+
output: result.stdout || result.stderr
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Upgrades all packages
|
|
184
|
+
* @returns {Promise<{ success: boolean, output: string }>}
|
|
185
|
+
*/
|
|
186
|
+
async function upgradeAll() {
|
|
187
|
+
if (!isInstalled()) {
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
output: 'winget is not available'
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const result = await shell.exec('winget upgrade --all --accept-package-agreements --accept-source-agreements');
|
|
195
|
+
return {
|
|
196
|
+
success: result.code === 0,
|
|
197
|
+
output: result.stdout || result.stderr
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Searches the winget repository
|
|
203
|
+
* @param {string} query - The search query
|
|
204
|
+
* @returns {Promise<Array<{ name: string, id: string, version: string }>>}
|
|
205
|
+
*/
|
|
206
|
+
async function search(query) {
|
|
207
|
+
if (!isInstalled()) {
|
|
208
|
+
return [];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const result = await shell.exec(`winget search "${query}"`);
|
|
212
|
+
if (result.code !== 0) {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const packages = [];
|
|
217
|
+
const lines = result.stdout.split('\n').filter(Boolean);
|
|
218
|
+
|
|
219
|
+
// Skip header lines (usually first 2)
|
|
220
|
+
let dataStarted = false;
|
|
221
|
+
for (const line of lines) {
|
|
222
|
+
// Look for separator line to know when data starts
|
|
223
|
+
if (line.includes('---')) {
|
|
224
|
+
dataStarted = true;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
if (!dataStarted) continue;
|
|
229
|
+
|
|
230
|
+
// Parse columns (separated by multiple spaces)
|
|
231
|
+
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
232
|
+
if (parts.length >= 2) {
|
|
233
|
+
packages.push({
|
|
234
|
+
name: parts[0].trim(),
|
|
235
|
+
id: parts[1].trim(),
|
|
236
|
+
version: parts[2] ? parts[2].trim() : ''
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return packages;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Lists installed packages
|
|
246
|
+
* @returns {Promise<Array<{ name: string, id: string, version: string }>>}
|
|
247
|
+
*/
|
|
248
|
+
async function list() {
|
|
249
|
+
if (!isInstalled()) {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const result = await shell.exec('winget list');
|
|
254
|
+
if (result.code !== 0) {
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const packages = [];
|
|
259
|
+
const lines = result.stdout.split('\n').filter(Boolean);
|
|
260
|
+
|
|
261
|
+
let dataStarted = false;
|
|
262
|
+
for (const line of lines) {
|
|
263
|
+
if (line.includes('---')) {
|
|
264
|
+
dataStarted = true;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if (!dataStarted) continue;
|
|
269
|
+
|
|
270
|
+
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
271
|
+
if (parts.length >= 2) {
|
|
272
|
+
packages.push({
|
|
273
|
+
name: parts[0].trim(),
|
|
274
|
+
id: parts[1].trim(),
|
|
275
|
+
version: parts[2] ? parts[2].trim() : ''
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return packages;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Gets information about a package
|
|
285
|
+
* @param {string} packageName - The package name or ID
|
|
286
|
+
* @returns {Promise<string|null>}
|
|
287
|
+
*/
|
|
288
|
+
async function info(packageName) {
|
|
289
|
+
if (!isInstalled()) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const result = await shell.exec(`winget show "${packageName}"`);
|
|
294
|
+
if (result.code === 0) {
|
|
295
|
+
return result.stdout;
|
|
296
|
+
}
|
|
297
|
+
return null;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* Lists packages with available upgrades
|
|
302
|
+
* @returns {Promise<Array<{ name: string, id: string, currentVersion: string, availableVersion: string }>>}
|
|
303
|
+
*/
|
|
304
|
+
async function listUpgradable() {
|
|
305
|
+
if (!isInstalled()) {
|
|
306
|
+
return [];
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
const result = await shell.exec('winget upgrade');
|
|
310
|
+
if (result.code !== 0) {
|
|
311
|
+
return [];
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
const packages = [];
|
|
315
|
+
const lines = result.stdout.split('\n').filter(Boolean);
|
|
316
|
+
|
|
317
|
+
let dataStarted = false;
|
|
318
|
+
for (const line of lines) {
|
|
319
|
+
if (line.includes('---')) {
|
|
320
|
+
dataStarted = true;
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
if (!dataStarted) continue;
|
|
325
|
+
|
|
326
|
+
// Skip summary lines
|
|
327
|
+
if (line.includes('upgrades available') || line.includes('winget upgrade')) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const parts = line.split(/\s{2,}/).filter(Boolean);
|
|
332
|
+
if (parts.length >= 4) {
|
|
333
|
+
packages.push({
|
|
334
|
+
name: parts[0].trim(),
|
|
335
|
+
id: parts[1].trim(),
|
|
336
|
+
currentVersion: parts[2].trim(),
|
|
337
|
+
availableVersion: parts[3].trim()
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
return packages;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* Updates winget sources
|
|
347
|
+
* @returns {Promise<{ success: boolean, output: string }>}
|
|
348
|
+
*/
|
|
349
|
+
async function updateSources() {
|
|
350
|
+
if (!isInstalled()) {
|
|
351
|
+
return {
|
|
352
|
+
success: false,
|
|
353
|
+
output: 'winget is not available'
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const result = await shell.exec('winget source update');
|
|
358
|
+
return {
|
|
359
|
+
success: result.code === 0,
|
|
360
|
+
output: result.stdout || result.stderr
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
module.exports = {
|
|
365
|
+
isInstalled,
|
|
366
|
+
getVersion,
|
|
367
|
+
install,
|
|
368
|
+
uninstall,
|
|
369
|
+
isPackageInstalled,
|
|
370
|
+
getPackageVersion,
|
|
371
|
+
upgrade,
|
|
372
|
+
upgradeAll,
|
|
373
|
+
search,
|
|
374
|
+
list,
|
|
375
|
+
info,
|
|
376
|
+
listUpgradable,
|
|
377
|
+
updateSources
|
|
378
|
+
};
|