@fredlackey/devutils 0.0.1 → 0.0.3

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.
Files changed (259) hide show
  1. package/README.md +5 -5
  2. package/package.json +1 -1
  3. package/src/commands/install.js +374 -36
  4. package/src/installs/adobe-creative-cloud.js +527 -25
  5. package/src/installs/adobe-creative-cloud.md +605 -0
  6. package/src/installs/appcleaner.js +303 -26
  7. package/src/installs/appcleaner.md +699 -0
  8. package/src/installs/apt-transport-https.js +390 -0
  9. package/src/installs/apt-transport-https.md +678 -0
  10. package/src/installs/atomicparsley.js +624 -26
  11. package/src/installs/atomicparsley.md +795 -0
  12. package/src/installs/aws-cli.js +779 -26
  13. package/src/installs/aws-cli.md +727 -0
  14. package/src/installs/balena-etcher.js +688 -26
  15. package/src/installs/balena-etcher.md +761 -0
  16. package/src/installs/bambu-studio.js +912 -26
  17. package/src/installs/bambu-studio.md +780 -0
  18. package/src/installs/bash-completion.js +554 -23
  19. package/src/installs/bash-completion.md +833 -0
  20. package/src/installs/bash.js +399 -26
  21. package/src/installs/bash.md +993 -0
  22. package/src/installs/beyond-compare.js +585 -26
  23. package/src/installs/beyond-compare.md +813 -0
  24. package/src/installs/build-essential.js +511 -26
  25. package/src/installs/build-essential.md +977 -0
  26. package/src/installs/ca-certificates.js +618 -0
  27. package/src/installs/ca-certificates.md +937 -0
  28. package/src/installs/caffeine.js +490 -26
  29. package/src/installs/caffeine.md +839 -0
  30. package/src/installs/camtasia.js +577 -25
  31. package/src/installs/camtasia.md +762 -0
  32. package/src/installs/chatgpt.js +458 -26
  33. package/src/installs/chatgpt.md +814 -0
  34. package/src/installs/chocolatey.js +447 -0
  35. package/src/installs/chocolatey.md +661 -0
  36. package/src/installs/chrome-canary.js +472 -26
  37. package/src/installs/chrome-canary.md +641 -0
  38. package/src/installs/chromium.js +645 -26
  39. package/src/installs/chromium.md +838 -0
  40. package/src/installs/claude-code.js +558 -26
  41. package/src/installs/claude-code.md +1173 -0
  42. package/src/installs/curl.js +361 -26
  43. package/src/installs/curl.md +714 -0
  44. package/src/installs/cursor.js +561 -26
  45. package/src/installs/cursor.md +970 -0
  46. package/src/installs/dbschema.js +674 -26
  47. package/src/installs/dbschema.md +925 -0
  48. package/src/installs/dependencies.md +435 -0
  49. package/src/installs/development-tools.js +600 -0
  50. package/src/installs/development-tools.md +977 -0
  51. package/src/installs/docker.js +1010 -25
  52. package/src/installs/docker.md +1109 -0
  53. package/src/installs/drawio.js +1001 -26
  54. package/src/installs/drawio.md +795 -0
  55. package/src/installs/elmedia-player.js +328 -25
  56. package/src/installs/elmedia-player.md +556 -0
  57. package/src/installs/ffmpeg.js +870 -25
  58. package/src/installs/ffmpeg.md +852 -0
  59. package/src/installs/file.js +464 -0
  60. package/src/installs/file.md +987 -0
  61. package/src/installs/gemini-cli.js +793 -26
  62. package/src/installs/gemini-cli.md +1153 -0
  63. package/src/installs/git.js +382 -26
  64. package/src/installs/git.md +907 -0
  65. package/src/installs/gitego.js +931 -26
  66. package/src/installs/gitego.md +1172 -0
  67. package/src/installs/go.js +913 -26
  68. package/src/installs/go.md +958 -0
  69. package/src/installs/google-chrome.js +801 -25
  70. package/src/installs/google-chrome.md +862 -0
  71. package/src/installs/gpg.js +412 -73
  72. package/src/installs/gpg.md +1056 -0
  73. package/src/installs/homebrew.js +1015 -26
  74. package/src/installs/homebrew.md +988 -0
  75. package/src/installs/imageoptim.js +950 -26
  76. package/src/installs/imageoptim.md +1119 -0
  77. package/src/installs/installers.json +2297 -0
  78. package/src/installs/jq.js +382 -26
  79. package/src/installs/jq.md +809 -0
  80. package/src/installs/keyboard-maestro.js +701 -26
  81. package/src/installs/keyboard-maestro.md +825 -0
  82. package/src/installs/latex.js +771 -26
  83. package/src/installs/latex.md +1095 -0
  84. package/src/installs/lftp.js +338 -26
  85. package/src/installs/lftp.md +907 -0
  86. package/src/installs/lsb-release.js +346 -0
  87. package/src/installs/lsb-release.md +814 -0
  88. package/src/installs/messenger.js +829 -26
  89. package/src/installs/messenger.md +900 -0
  90. package/src/installs/microsoft-office.js +550 -26
  91. package/src/installs/microsoft-office.md +760 -0
  92. package/src/installs/microsoft-teams.js +782 -25
  93. package/src/installs/microsoft-teams.md +886 -0
  94. package/src/installs/node.js +886 -26
  95. package/src/installs/node.md +1153 -0
  96. package/src/installs/nordpass.js +698 -26
  97. package/src/installs/nordpass.md +921 -0
  98. package/src/installs/nvm.js +977 -26
  99. package/src/installs/nvm.md +1057 -0
  100. package/src/installs/openssh.js +734 -64
  101. package/src/installs/openssh.md +1056 -0
  102. package/src/installs/pandoc.js +644 -26
  103. package/src/installs/pandoc.md +1036 -0
  104. package/src/installs/pinentry.js +492 -26
  105. package/src/installs/pinentry.md +1142 -0
  106. package/src/installs/pngyu.js +851 -26
  107. package/src/installs/pngyu.md +896 -0
  108. package/src/installs/postman.js +781 -26
  109. package/src/installs/postman.md +940 -0
  110. package/src/installs/procps.js +425 -0
  111. package/src/installs/procps.md +851 -0
  112. package/src/installs/safari-tech-preview.js +355 -25
  113. package/src/installs/safari-tech-preview.md +533 -0
  114. package/src/installs/sfnt2woff.js +640 -26
  115. package/src/installs/sfnt2woff.md +795 -0
  116. package/src/installs/shellcheck.js +463 -26
  117. package/src/installs/shellcheck.md +1005 -0
  118. package/src/installs/slack.js +722 -25
  119. package/src/installs/slack.md +865 -0
  120. package/src/installs/snagit.js +566 -25
  121. package/src/installs/snagit.md +844 -0
  122. package/src/installs/software-properties-common.js +372 -0
  123. package/src/installs/software-properties-common.md +805 -0
  124. package/src/installs/spotify.js +858 -25
  125. package/src/installs/spotify.md +901 -0
  126. package/src/installs/studio-3t.js +803 -26
  127. package/src/installs/studio-3t.md +918 -0
  128. package/src/installs/sublime-text.js +780 -25
  129. package/src/installs/sublime-text.md +914 -0
  130. package/src/installs/superwhisper.js +687 -25
  131. package/src/installs/superwhisper.md +630 -0
  132. package/src/installs/tailscale.js +727 -26
  133. package/src/installs/tailscale.md +1100 -0
  134. package/src/installs/tar.js +389 -0
  135. package/src/installs/tar.md +946 -0
  136. package/src/installs/termius.js +780 -26
  137. package/src/installs/termius.md +844 -0
  138. package/src/installs/terraform.js +761 -26
  139. package/src/installs/terraform.md +899 -0
  140. package/src/installs/tidal.js +752 -25
  141. package/src/installs/tidal.md +864 -0
  142. package/src/installs/tmux.js +328 -26
  143. package/src/installs/tmux.md +1030 -0
  144. package/src/installs/tree.js +393 -26
  145. package/src/installs/tree.md +833 -0
  146. package/src/installs/unzip.js +460 -0
  147. package/src/installs/unzip.md +879 -0
  148. package/src/installs/vim.js +403 -26
  149. package/src/installs/vim.md +1040 -0
  150. package/src/installs/vlc.js +803 -26
  151. package/src/installs/vlc.md +927 -0
  152. package/src/installs/vscode.js +825 -26
  153. package/src/installs/vscode.md +1002 -0
  154. package/src/installs/wget.js +415 -0
  155. package/src/installs/wget.md +791 -0
  156. package/src/installs/whatsapp.js +710 -25
  157. package/src/installs/whatsapp.md +854 -0
  158. package/src/installs/winpty.js +352 -0
  159. package/src/installs/winpty.md +620 -0
  160. package/src/installs/woff2.js +535 -26
  161. package/src/installs/woff2.md +977 -0
  162. package/src/installs/wsl.js +572 -0
  163. package/src/installs/wsl.md +699 -0
  164. package/src/installs/xcode-clt.js +520 -0
  165. package/src/installs/xcode-clt.md +351 -0
  166. package/src/installs/xcode.js +542 -26
  167. package/src/installs/xcode.md +573 -0
  168. package/src/installs/yarn.js +806 -26
  169. package/src/installs/yarn.md +1074 -0
  170. package/src/installs/yq.js +636 -26
  171. package/src/installs/yq.md +944 -0
  172. package/src/installs/yt-dlp.js +683 -26
  173. package/src/installs/yt-dlp.md +946 -0
  174. package/src/installs/yum-utils.js +297 -0
  175. package/src/installs/yum-utils.md +648 -0
  176. package/src/installs/zoom.js +740 -25
  177. package/src/installs/zoom.md +884 -0
  178. package/src/scripts/README.md +567 -45
  179. package/src/scripts/STATUS.md +208 -0
  180. package/src/scripts/afk.js +395 -7
  181. package/src/scripts/backup-all.js +731 -9
  182. package/src/scripts/backup-source.js +711 -8
  183. package/src/scripts/brewd.js +373 -7
  184. package/src/scripts/brewi.js +505 -9
  185. package/src/scripts/brewr.js +512 -9
  186. package/src/scripts/brews.js +462 -9
  187. package/src/scripts/brewu.js +488 -7
  188. package/src/scripts/c.js +185 -7
  189. package/src/scripts/ccurl.js +325 -8
  190. package/src/scripts/certbot-crontab-init.js +488 -8
  191. package/src/scripts/certbot-init.js +641 -9
  192. package/src/scripts/ch.js +339 -7
  193. package/src/scripts/claude-danger.js +253 -8
  194. package/src/scripts/clean-dev.js +419 -8
  195. package/src/scripts/clear-dns-cache.js +525 -7
  196. package/src/scripts/clone.js +417 -7
  197. package/src/scripts/code-all.js +420 -7
  198. package/src/scripts/count-files.js +195 -8
  199. package/src/scripts/count-folders.js +195 -8
  200. package/src/scripts/count.js +248 -8
  201. package/src/scripts/d.js +203 -7
  202. package/src/scripts/datauri.js +373 -8
  203. package/src/scripts/delete-files.js +363 -7
  204. package/src/scripts/docker-clean.js +410 -8
  205. package/src/scripts/dp.js +426 -7
  206. package/src/scripts/e.js +375 -9
  207. package/src/scripts/empty-trash.js +497 -7
  208. package/src/scripts/evm.js +428 -9
  209. package/src/scripts/fetch-github-repos.js +441 -10
  210. package/src/scripts/get-channel.js +329 -8
  211. package/src/scripts/get-course.js +384 -11
  212. package/src/scripts/get-dependencies.js +290 -9
  213. package/src/scripts/get-folder.js +783 -10
  214. package/src/scripts/get-tunes.js +411 -10
  215. package/src/scripts/get-video.js +352 -9
  216. package/src/scripts/git-backup.js +561 -9
  217. package/src/scripts/git-clone.js +477 -9
  218. package/src/scripts/git-pup.js +303 -7
  219. package/src/scripts/git-push.js +380 -8
  220. package/src/scripts/h.js +607 -9
  221. package/src/scripts/hide-desktop-icons.js +483 -7
  222. package/src/scripts/hide-hidden-files.js +522 -7
  223. package/src/scripts/install-dependencies-from.js +440 -9
  224. package/src/scripts/ips.js +647 -10
  225. package/src/scripts/iso.js +354 -8
  226. package/src/scripts/killni.js +561 -7
  227. package/src/scripts/ll.js +451 -8
  228. package/src/scripts/local-ip.js +310 -8
  229. package/src/scripts/m.js +508 -8
  230. package/src/scripts/map.js +293 -8
  231. package/src/scripts/mkd.js +287 -7
  232. package/src/scripts/ncu-update-all.js +441 -8
  233. package/src/scripts/nginx-init.js +702 -12
  234. package/src/scripts/npmi.js +366 -7
  235. package/src/scripts/o.js +495 -8
  236. package/src/scripts/org-by-date.js +321 -7
  237. package/src/scripts/p.js +208 -7
  238. package/src/scripts/packages.js +313 -8
  239. package/src/scripts/path.js +209 -7
  240. package/src/scripts/ports.js +582 -8
  241. package/src/scripts/q.js +290 -8
  242. package/src/scripts/refresh-files.js +378 -10
  243. package/src/scripts/remove-smaller-files.js +500 -8
  244. package/src/scripts/rename-files-with-date.js +517 -9
  245. package/src/scripts/resize-image.js +523 -9
  246. package/src/scripts/rm-safe.js +653 -8
  247. package/src/scripts/s.js +525 -9
  248. package/src/scripts/set-git-public.js +349 -7
  249. package/src/scripts/show-desktop-icons.js +459 -7
  250. package/src/scripts/show-hidden-files.js +456 -7
  251. package/src/scripts/tpa.js +265 -8
  252. package/src/scripts/tpo.js +264 -7
  253. package/src/scripts/u.js +489 -7
  254. package/src/scripts/vpush.js +422 -8
  255. package/src/scripts/y.js +267 -7
  256. package/src/utils/common/os.js +94 -2
  257. package/src/utils/ubuntu/apt.js +13 -7
  258. package/src/utils/windows/choco.js +82 -26
  259. package/src/utils/windows/winget.js +89 -27
@@ -1,23 +1,504 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Update, upgrade, and cleanup Homebrew.
4
+ * brewu - Update, upgrade, and cleanup Homebrew
5
+ *
6
+ * Migrated from legacy dotfiles alias.
7
+ * Original: alias brewu="brew update --quiet && brew upgrade && brew cleanup"
8
+ *
9
+ * This script performs a full Homebrew maintenance cycle:
10
+ * 1. brew update --quiet - Fetch latest formulae from Homebrew's git repository
11
+ * 2. brew upgrade - Upgrade all outdated packages to their latest versions
12
+ * 3. brew cleanup - Remove old versions of installed packages to free disk space
13
+ *
14
+ * This is a common maintenance routine that keeps your Homebrew installation
15
+ * up-to-date and prevents disk space bloat from accumulated old package versions.
16
+ *
5
17
  * @module scripts/brewu
6
18
  */
7
19
 
20
+ const os = require('../utils/common/os');
21
+ const shell = require('../utils/common/shell');
22
+ const { spawnSync } = require('child_process');
23
+
24
+ /**
25
+ * Check if Homebrew is installed and available in PATH.
26
+ *
27
+ * Uses the shell utility to search for the `brew` command in PATH.
28
+ * This works on both macOS and Linux where Linuxbrew may be installed.
29
+ *
30
+ * @returns {boolean} True if brew command is available, false otherwise
31
+ */
32
+ function isBrewInstalled() {
33
+ return shell.commandExists('brew');
34
+ }
35
+
36
+ /**
37
+ * Run a brew subcommand with real-time output streaming.
38
+ *
39
+ * This helper function executes a single brew subcommand (like update, upgrade,
40
+ * or cleanup) and streams the output directly to the console so users can see
41
+ * progress in real-time. Returns the exit code so the caller can decide whether
42
+ * to continue with the next step.
43
+ *
44
+ * @param {string} subcommand - The brew subcommand to run (e.g., 'update', 'upgrade')
45
+ * @param {string[]} [subcommandArgs] - Additional arguments for the subcommand
46
+ * @returns {number} The exit code from the brew command (0 = success)
47
+ */
48
+ function runBrewCommand(subcommand, subcommandArgs = []) {
49
+ const result = spawnSync('brew', [subcommand, ...subcommandArgs], {
50
+ stdio: 'inherit', // Stream output directly to console
51
+ shell: false // Run brew directly without shell interpretation
52
+ });
53
+
54
+ return result.status || 0;
55
+ }
56
+
57
+ /**
58
+ * Pure Node.js implementation - not applicable for this command.
59
+ *
60
+ * This function cannot be implemented in pure Node.js because the `brew`
61
+ * commands require Homebrew to be installed. The update/upgrade/cleanup
62
+ * operations interact with Homebrew's internal package management system
63
+ * which cannot be replicated without Homebrew itself.
64
+ *
65
+ * Platform-specific functions should NOT call this function. They should
66
+ * either run the brew commands directly (on platforms with Homebrew support)
67
+ * or display guidance about equivalent commands for their platform.
68
+ *
69
+ * @param {string[]} args - Command line arguments (unused)
70
+ * @returns {Promise<void>}
71
+ * @throws {Error} Always throws - this function should not be called directly
72
+ */
73
+ async function do_brewu_nodejs(args) {
74
+ throw new Error(
75
+ 'do_brewu_nodejs cannot be implemented in pure Node.js.\n' +
76
+ 'The Homebrew update/upgrade/cleanup commands require Homebrew to be installed.\n' +
77
+ 'Use the platform-specific functions instead.'
78
+ );
79
+ }
80
+
81
+ /**
82
+ * Run brew update, upgrade, and cleanup on macOS.
83
+ *
84
+ * macOS is the primary platform for Homebrew. This function checks if
85
+ * Homebrew is installed and then runs the three-step maintenance cycle:
86
+ * update (fetch latest formulae), upgrade (update packages), and cleanup
87
+ * (remove old versions).
88
+ *
89
+ * The commands are run sequentially, stopping if any step fails. This
90
+ * matches the behavior of the original alias which used && to chain commands.
91
+ *
92
+ * @param {string[]} args - Command line arguments (currently unused)
93
+ * @returns {Promise<void>}
94
+ */
95
+ async function do_brewu_macos(args) {
96
+ // Check if Homebrew is installed
97
+ if (!isBrewInstalled()) {
98
+ console.error('Error: Homebrew is not installed.');
99
+ console.error('');
100
+ console.error('To install Homebrew, run:');
101
+ console.error(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
102
+ console.error('');
103
+ console.error('Or use the devutils installer:');
104
+ console.error(' dev install homebrew');
105
+ process.exit(1);
106
+ }
107
+
108
+ // Step 1: Update Homebrew's formulae (fetch latest package info)
109
+ // Using --quiet to reduce output noise during the fetch
110
+ console.log('==> Updating Homebrew...');
111
+ const updateCode = runBrewCommand('update', ['--quiet']);
112
+ if (updateCode !== 0) {
113
+ console.error('Error: brew update failed with exit code', updateCode);
114
+ process.exit(updateCode);
115
+ }
116
+
117
+ // Step 2: Upgrade all outdated packages
118
+ console.log('');
119
+ console.log('==> Upgrading packages...');
120
+ const upgradeCode = runBrewCommand('upgrade');
121
+ if (upgradeCode !== 0) {
122
+ console.error('Error: brew upgrade failed with exit code', upgradeCode);
123
+ process.exit(upgradeCode);
124
+ }
125
+
126
+ // Step 3: Cleanup old versions to free disk space
127
+ console.log('');
128
+ console.log('==> Cleaning up...');
129
+ const cleanupCode = runBrewCommand('cleanup');
130
+ if (cleanupCode !== 0) {
131
+ console.error('Error: brew cleanup failed with exit code', cleanupCode);
132
+ process.exit(cleanupCode);
133
+ }
134
+
135
+ console.log('');
136
+ console.log('Homebrew maintenance complete!');
137
+ }
138
+
139
+ /**
140
+ * Run brew update, upgrade, and cleanup on Ubuntu.
141
+ *
142
+ * Homebrew (Linuxbrew) can be installed on Ubuntu and other Linux distributions.
143
+ * This function checks if Homebrew is installed and runs the maintenance cycle.
144
+ * If Homebrew is not installed, it provides guidance for both installing
145
+ * Homebrew and using APT's built-in update commands.
146
+ *
147
+ * @param {string[]} args - Command line arguments (currently unused)
148
+ * @returns {Promise<void>}
149
+ */
150
+ async function do_brewu_ubuntu(args) {
151
+ // Check if Homebrew is installed (Linuxbrew)
152
+ if (!isBrewInstalled()) {
153
+ console.error('Error: Homebrew (Linuxbrew) is not installed.');
154
+ console.error('');
155
+ console.error('On Ubuntu, you can either:');
156
+ console.error('');
157
+ console.error('1. Install Homebrew for Linux:');
158
+ console.error(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
159
+ console.error('');
160
+ console.error('2. Use APT update commands instead:');
161
+ console.error(' sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y');
162
+ console.error('');
163
+ console.error(' Or use the devutils command:');
164
+ console.error(' u # Updates system packages');
165
+ process.exit(1);
166
+ }
167
+
168
+ // Run the same update/upgrade/cleanup cycle as macOS
169
+ console.log('==> Updating Homebrew...');
170
+ const updateCode = runBrewCommand('update', ['--quiet']);
171
+ if (updateCode !== 0) {
172
+ console.error('Error: brew update failed with exit code', updateCode);
173
+ process.exit(updateCode);
174
+ }
175
+
176
+ console.log('');
177
+ console.log('==> Upgrading packages...');
178
+ const upgradeCode = runBrewCommand('upgrade');
179
+ if (upgradeCode !== 0) {
180
+ console.error('Error: brew upgrade failed with exit code', upgradeCode);
181
+ process.exit(upgradeCode);
182
+ }
183
+
184
+ console.log('');
185
+ console.log('==> Cleaning up...');
186
+ const cleanupCode = runBrewCommand('cleanup');
187
+ if (cleanupCode !== 0) {
188
+ console.error('Error: brew cleanup failed with exit code', cleanupCode);
189
+ process.exit(cleanupCode);
190
+ }
191
+
192
+ console.log('');
193
+ console.log('Homebrew maintenance complete!');
194
+ }
195
+
196
+ /**
197
+ * Run brew update, upgrade, and cleanup on Raspberry Pi OS.
198
+ *
199
+ * Homebrew can be installed on Raspberry Pi OS (64-bit ARM).
200
+ * This function checks if Homebrew is installed and runs the maintenance cycle.
201
+ * If not available, it provides guidance for APT-based updates.
202
+ *
203
+ * @param {string[]} args - Command line arguments (currently unused)
204
+ * @returns {Promise<void>}
205
+ */
206
+ async function do_brewu_raspbian(args) {
207
+ // Check if Homebrew is installed
208
+ if (!isBrewInstalled()) {
209
+ console.error('Error: Homebrew is not installed.');
210
+ console.error('');
211
+ console.error('On Raspberry Pi OS, you can either:');
212
+ console.error('');
213
+ console.error('1. Install Homebrew (64-bit Raspberry Pi OS only):');
214
+ console.error(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
215
+ console.error('');
216
+ console.error('2. Use APT update commands instead:');
217
+ console.error(' sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y');
218
+ console.error('');
219
+ console.error(' Or use the devutils command:');
220
+ console.error(' u # Updates system packages');
221
+ process.exit(1);
222
+ }
223
+
224
+ // Run the update/upgrade/cleanup cycle
225
+ console.log('==> Updating Homebrew...');
226
+ const updateCode = runBrewCommand('update', ['--quiet']);
227
+ if (updateCode !== 0) {
228
+ console.error('Error: brew update failed with exit code', updateCode);
229
+ process.exit(updateCode);
230
+ }
231
+
232
+ console.log('');
233
+ console.log('==> Upgrading packages...');
234
+ const upgradeCode = runBrewCommand('upgrade');
235
+ if (upgradeCode !== 0) {
236
+ console.error('Error: brew upgrade failed with exit code', upgradeCode);
237
+ process.exit(upgradeCode);
238
+ }
239
+
240
+ console.log('');
241
+ console.log('==> Cleaning up...');
242
+ const cleanupCode = runBrewCommand('cleanup');
243
+ if (cleanupCode !== 0) {
244
+ console.error('Error: brew cleanup failed with exit code', cleanupCode);
245
+ process.exit(cleanupCode);
246
+ }
247
+
248
+ console.log('');
249
+ console.log('Homebrew maintenance complete!');
250
+ }
251
+
8
252
  /**
9
- * Performs a full Homebrew maintenance cycle:
10
- * update (fetch latest formulae), upgrade (update packages), and cleanup.
253
+ * Run brew update, upgrade, and cleanup on Amazon Linux.
254
+ *
255
+ * Homebrew can be installed on Amazon Linux, though it's less common.
256
+ * This function checks if Homebrew is installed and provides guidance
257
+ * for DNF/YUM-based package manager updates if not available.
258
+ *
259
+ * @param {string[]} args - Command line arguments (currently unused)
260
+ * @returns {Promise<void>}
261
+ */
262
+ async function do_brewu_amazon_linux(args) {
263
+ // Check if Homebrew is installed
264
+ if (!isBrewInstalled()) {
265
+ console.error('Error: Homebrew is not installed.');
266
+ console.error('');
267
+ console.error('On Amazon Linux, Homebrew is not the standard package manager.');
268
+ console.error('');
269
+ console.error('Use DNF/YUM update commands instead:');
270
+ console.error(' sudo dnf upgrade -y && sudo dnf autoremove -y');
271
+ console.error(' # or for older Amazon Linux:');
272
+ console.error(' sudo yum update -y && sudo yum autoremove -y');
273
+ console.error('');
274
+ console.error('Or use the devutils command:');
275
+ console.error(' u # Updates system packages');
276
+ console.error('');
277
+ console.error('To install Homebrew anyway:');
278
+ console.error(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
279
+ process.exit(1);
280
+ }
281
+
282
+ // Run the update/upgrade/cleanup cycle
283
+ console.log('==> Updating Homebrew...');
284
+ const updateCode = runBrewCommand('update', ['--quiet']);
285
+ if (updateCode !== 0) {
286
+ console.error('Error: brew update failed with exit code', updateCode);
287
+ process.exit(updateCode);
288
+ }
289
+
290
+ console.log('');
291
+ console.log('==> Upgrading packages...');
292
+ const upgradeCode = runBrewCommand('upgrade');
293
+ if (upgradeCode !== 0) {
294
+ console.error('Error: brew upgrade failed with exit code', upgradeCode);
295
+ process.exit(upgradeCode);
296
+ }
297
+
298
+ console.log('');
299
+ console.log('==> Cleaning up...');
300
+ const cleanupCode = runBrewCommand('cleanup');
301
+ if (cleanupCode !== 0) {
302
+ console.error('Error: brew cleanup failed with exit code', cleanupCode);
303
+ process.exit(cleanupCode);
304
+ }
305
+
306
+ console.log('');
307
+ console.log('Homebrew maintenance complete!');
308
+ }
309
+
310
+ /**
311
+ * Handle brewu command in Windows Command Prompt.
312
+ *
313
+ * Homebrew is not available on Windows. This function informs the user
314
+ * and provides guidance for equivalent package manager update commands using
315
+ * Chocolatey or winget.
11
316
  *
12
317
  * @param {string[]} args - Command line arguments (unused)
13
318
  * @returns {Promise<void>}
14
319
  */
15
- async function main(args) {
16
- // TODO: Implement brew update/upgrade/cleanup
320
+ async function do_brewu_cmd(args) {
321
+ console.error('Error: Homebrew is not available on Windows.');
322
+ console.error('');
323
+ console.error('Windows uses different package managers. Try these alternatives:');
324
+ console.error('');
325
+ console.error('For Chocolatey (if installed):');
326
+ console.error(' choco upgrade all -y # Upgrade all packages');
327
+ console.error('');
328
+ console.error('For winget (Windows Package Manager):');
329
+ console.error(' winget upgrade --all # Upgrade all packages');
330
+ console.error('');
331
+ console.error('Or use the devutils command:');
332
+ console.error(' u # Updates system packages');
333
+ process.exit(1);
334
+ }
335
+
336
+ /**
337
+ * Handle brewu command in Windows PowerShell.
338
+ *
339
+ * Homebrew is not available on Windows. This function informs the user
340
+ * and provides guidance for equivalent package manager update commands.
341
+ *
342
+ * @param {string[]} args - Command line arguments (unused)
343
+ * @returns {Promise<void>}
344
+ */
345
+ async function do_brewu_powershell(args) {
346
+ console.error('Error: Homebrew is not available on Windows.');
347
+ console.error('');
348
+ console.error('Windows uses different package managers. Try these alternatives:');
349
+ console.error('');
350
+ console.error('For Chocolatey (if installed):');
351
+ console.error(' choco upgrade all -y # Upgrade all packages');
352
+ console.error('');
353
+ console.error('For winget (Windows Package Manager):');
354
+ console.error(' winget upgrade --all # Upgrade all packages');
355
+ console.error('');
356
+ console.error('For Windows Update via PowerShell:');
357
+ console.error(' Install-Module PSWindowsUpdate -Force');
358
+ console.error(' Get-WindowsUpdate');
359
+ console.error(' Install-WindowsUpdate -AcceptAll');
360
+ console.error('');
361
+ console.error('Or use the devutils command:');
362
+ console.error(' u # Updates system packages');
363
+ process.exit(1);
364
+ }
365
+
366
+ /**
367
+ * Run brew update, upgrade, and cleanup from Git Bash on Windows.
368
+ *
369
+ * Git Bash runs on Windows where Homebrew is not natively available.
370
+ * However, if the user has installed Homebrew in WSL or another Linux
371
+ * environment, it may be accessible. This function checks for brew
372
+ * availability and provides appropriate guidance.
373
+ *
374
+ * @param {string[]} args - Command line arguments (currently unused)
375
+ * @returns {Promise<void>}
376
+ */
377
+ async function do_brewu_gitbash(args) {
378
+ // Check if Homebrew is available (unlikely in Git Bash, but possible via WSL interop)
379
+ if (isBrewInstalled()) {
380
+ // Brew is somehow available, run it
381
+ console.log('==> Updating Homebrew...');
382
+ const updateCode = runBrewCommand('update', ['--quiet']);
383
+ if (updateCode !== 0) {
384
+ console.error('Error: brew update failed with exit code', updateCode);
385
+ process.exit(updateCode);
386
+ }
387
+
388
+ console.log('');
389
+ console.log('==> Upgrading packages...');
390
+ const upgradeCode = runBrewCommand('upgrade');
391
+ if (upgradeCode !== 0) {
392
+ console.error('Error: brew upgrade failed with exit code', upgradeCode);
393
+ process.exit(upgradeCode);
394
+ }
395
+
396
+ console.log('');
397
+ console.log('==> Cleaning up...');
398
+ const cleanupCode = runBrewCommand('cleanup');
399
+ if (cleanupCode !== 0) {
400
+ console.error('Error: brew cleanup failed with exit code', cleanupCode);
401
+ process.exit(cleanupCode);
402
+ }
403
+
404
+ console.log('');
405
+ console.log('Homebrew maintenance complete!');
406
+ return;
407
+ }
408
+
409
+ // Homebrew not available, provide guidance
410
+ console.error('Error: Homebrew is not available in Git Bash on Windows.');
411
+ console.error('');
412
+ console.error('Git Bash runs on Windows which uses different package managers.');
413
+ console.error('');
414
+ console.error('Options:');
415
+ console.error('');
416
+ console.error('1. Use Chocolatey (from PowerShell or CMD):');
417
+ console.error(' choco upgrade all -y # Upgrade all packages');
418
+ console.error('');
419
+ console.error('2. Use winget (Windows Package Manager):');
420
+ console.error(' winget upgrade --all # Upgrade all packages');
421
+ console.error('');
422
+ console.error('3. If you have WSL installed, you can run brew commands there:');
423
+ console.error(' wsl brew update && wsl brew upgrade && wsl brew cleanup');
424
+ console.error('');
425
+ console.error('Or use the devutils command:');
426
+ console.error(' u # Updates system packages');
427
+ process.exit(1);
428
+ }
429
+
430
+ /**
431
+ * Main entry point - detects environment and executes appropriate implementation.
432
+ *
433
+ * Runs a full Homebrew maintenance cycle: update, upgrade, and cleanup.
434
+ * This is equivalent to running:
435
+ * brew update --quiet && brew upgrade && brew cleanup
436
+ *
437
+ * The update step fetches the latest package information from Homebrew's
438
+ * repository. The upgrade step updates all outdated packages to their
439
+ * latest versions. The cleanup step removes old versions of packages
440
+ * to free up disk space.
441
+ *
442
+ * On platforms where Homebrew is not available, provides guidance for
443
+ * equivalent update commands using the native package manager.
444
+ *
445
+ * @param {string[]} args - Command line arguments (currently unused)
446
+ * @returns {Promise<void>}
447
+ */
448
+ async function do_brewu(args) {
449
+ const platform = os.detect();
450
+
451
+ const handlers = {
452
+ 'macos': do_brewu_macos,
453
+ 'ubuntu': do_brewu_ubuntu,
454
+ 'raspbian': do_brewu_raspbian,
455
+ 'amazon_linux': do_brewu_amazon_linux,
456
+ 'cmd': do_brewu_cmd,
457
+ 'powershell': do_brewu_powershell,
458
+ 'gitbash': do_brewu_gitbash
459
+ };
460
+
461
+ const handler = handlers[platform.type];
462
+ if (!handler) {
463
+ // Handle other Linux distros that might have Homebrew
464
+ if (platform.type === 'debian' || platform.type === 'fedora' ||
465
+ platform.type === 'rhel' || platform.type === 'linux') {
466
+ // Try ubuntu handler as fallback for generic Linux
467
+ await do_brewu_ubuntu(args);
468
+ return;
469
+ }
470
+
471
+ // Handle Windows platform type
472
+ if (platform.type === 'windows') {
473
+ await do_brewu_cmd(args);
474
+ return;
475
+ }
476
+
477
+ console.error(`Platform '${platform.type}' is not supported for this command.`);
478
+ console.error('');
479
+ console.error('The brewu command is a shortcut for Homebrew maintenance:');
480
+ console.error(' brew update --quiet && brew upgrade && brew cleanup');
481
+ console.error('');
482
+ console.error('Homebrew is available on macOS and Linux.');
483
+ process.exit(1);
484
+ }
485
+
486
+ await handler(args);
17
487
  }
18
488
 
19
- module.exports = { main };
489
+ module.exports = {
490
+ main: do_brewu,
491
+ do_brewu,
492
+ do_brewu_nodejs,
493
+ do_brewu_macos,
494
+ do_brewu_ubuntu,
495
+ do_brewu_raspbian,
496
+ do_brewu_amazon_linux,
497
+ do_brewu_cmd,
498
+ do_brewu_powershell,
499
+ do_brewu_gitbash
500
+ };
20
501
 
21
502
  if (require.main === module) {
22
- main(process.argv.slice(2));
503
+ do_brewu(process.argv.slice(2));
23
504
  }