@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,24 +1,477 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * @fileoverview Search for packages via Homebrew.
4
+ * brews - Search for packages via the system package manager
5
+ *
6
+ * Migrated from legacy dotfiles alias.
7
+ * Original: alias brews="brew search"
8
+ *
9
+ * This script provides a cross-platform package search command.
10
+ * On macOS, it wraps Homebrew's search command. On other platforms,
11
+ * it uses the native package manager's search functionality:
12
+ * - macOS: brew search
13
+ * - Ubuntu/Debian: apt-cache search
14
+ * - Raspberry Pi OS: apt-cache search
15
+ * - Amazon Linux: dnf search / yum search
16
+ * - Windows: choco search / winget search
17
+ *
5
18
  * @module scripts/brews
6
19
  */
7
20
 
21
+ const os = require('../utils/common/os');
22
+ const shell = require('../utils/common/shell');
23
+
24
+ /**
25
+ * Pure Node.js implementation - not applicable for this script.
26
+ *
27
+ * Package searching requires shell-based package managers on all platforms,
28
+ * so there is no pure Node.js implementation. Each platform function must
29
+ * invoke the appropriate system package manager's search command.
30
+ *
31
+ * @param {string[]} args - Search term(s)
32
+ * @returns {Promise<void>}
33
+ * @throws {Error} Always throws - this function should not be called directly
34
+ */
35
+ async function do_brews_nodejs(args) {
36
+ // Package searching requires OS-specific package managers.
37
+ // There is no pure Node.js implementation for this functionality.
38
+ throw new Error(
39
+ 'do_brews_nodejs should not be called directly. ' +
40
+ 'Package searching requires platform-specific package managers.'
41
+ );
42
+ }
43
+
44
+ /**
45
+ * Search for packages using Homebrew on macOS.
46
+ *
47
+ * Runs `brew search <term>` to search for packages matching the specified term.
48
+ * Homebrew searches both formulae (CLI tools) and casks (GUI applications).
49
+ *
50
+ * @param {string[]} args - Search term(s) to look for
51
+ * @returns {Promise<void>}
52
+ *
53
+ * @example
54
+ * // Search for packages containing "node"
55
+ * do_brews_macos(['node'])
56
+ *
57
+ * @example
58
+ * // Search using a regex pattern
59
+ * do_brews_macos(['/^node/'])
60
+ */
61
+ async function do_brews_macos(args) {
62
+ // Validate that a search term was provided
63
+ if (args.length === 0) {
64
+ console.log('Usage: brews <search-term>');
65
+ console.log('');
66
+ console.log('Search for packages using Homebrew.');
67
+ console.log('');
68
+ console.log('Examples:');
69
+ console.log(' brews node # Search for packages containing "node"');
70
+ console.log(' brews /^node/ # Search using regex (packages starting with "node")');
71
+ console.log(' brews --cask chrome # Search only casks (GUI apps)');
72
+ console.log(' brews --formula wget # Search only formulae (CLI tools)');
73
+ process.exit(1);
74
+ }
75
+
76
+ // Check if Homebrew is installed
77
+ if (!shell.commandExists('brew')) {
78
+ console.error('Error: Homebrew is not installed.');
79
+ console.error('');
80
+ console.error('Install Homebrew first:');
81
+ console.error(' /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
82
+ console.error('');
83
+ console.error('Or use: dev install homebrew');
84
+ process.exit(1);
85
+ }
86
+
87
+ // Execute brew search with all provided arguments
88
+ // Arguments can include:
89
+ // - Search terms: brews node
90
+ // - Regex patterns: brews /^node/
91
+ // - Flags: brews --cask chrome
92
+ const { spawnSync } = require('child_process');
93
+
94
+ const result = spawnSync('brew', ['search', ...args], {
95
+ stdio: 'inherit', // Pass through stdin/stdout/stderr for real-time output
96
+ shell: false // Run brew directly without shell interpretation
97
+ });
98
+
99
+ // Exit with the same code as brew search
100
+ process.exit(result.status || 0);
101
+ }
102
+
103
+ /**
104
+ * Search for packages using APT on Ubuntu.
105
+ *
106
+ * Runs `apt-cache search <term>` to search for packages matching the specified term.
107
+ * APT searches package names and descriptions.
108
+ *
109
+ * @param {string[]} args - Search term(s) to look for
110
+ * @returns {Promise<void>}
111
+ *
112
+ * @example
113
+ * // Search for packages containing "node"
114
+ * do_brews_ubuntu(['node'])
115
+ */
116
+ async function do_brews_ubuntu(args) {
117
+ // Validate that a search term was provided
118
+ if (args.length === 0) {
119
+ console.log('Usage: brews <search-term>');
120
+ console.log('');
121
+ console.log('Search for packages using APT (Ubuntu equivalent of brew search).');
122
+ console.log('');
123
+ console.log('Examples:');
124
+ console.log(' brews node # Search for packages containing "node"');
125
+ console.log(' brews nodejs # Search for nodejs packages');
126
+ console.log('');
127
+ console.log('Tips:');
128
+ console.log(' apt-cache show <pkg> # Show detailed info about a package');
129
+ console.log(' apt-cache policy <pkg> # Show version and repository info');
130
+ process.exit(1);
131
+ }
132
+
133
+ // Check if apt-cache is available
134
+ if (!shell.commandExists('apt-cache')) {
135
+ console.error('Error: apt-cache is not available on this system.');
136
+ process.exit(1);
137
+ }
138
+
139
+ // Execute apt-cache search with all provided arguments
140
+ // apt-cache search joins multiple terms with AND logic
141
+ const { spawnSync } = require('child_process');
142
+
143
+ const result = spawnSync('apt-cache', ['search', ...args], {
144
+ stdio: 'inherit',
145
+ shell: false
146
+ });
147
+
148
+ // Exit with the same code as apt-cache
149
+ process.exit(result.status || 0);
150
+ }
151
+
8
152
  /**
9
- * Searches for packages matching the specified term using Homebrew.
10
- * Shorthand for `brew search`.
153
+ * Search for packages using APT on Raspberry Pi OS.
154
+ *
155
+ * Raspberry Pi OS is Debian-based, so it uses the same APT package manager
156
+ * as Ubuntu. This function delegates to the Ubuntu implementation.
11
157
  *
12
- * @param {string[]} args - Command line arguments
13
- * @param {string} args.0 - Search term
158
+ * @param {string[]} args - Search term(s) to look for
14
159
  * @returns {Promise<void>}
15
160
  */
16
- async function main(args) {
17
- // TODO: Implement brew search
161
+ async function do_brews_raspbian(args) {
162
+ // Raspbian uses the same APT package manager as Ubuntu
163
+ return do_brews_ubuntu(args);
164
+ }
165
+
166
+ /**
167
+ * Search for packages using DNF or YUM on Amazon Linux.
168
+ *
169
+ * Amazon Linux 2023 uses DNF, while Amazon Linux 2 uses YUM.
170
+ * This function detects which package manager is available and uses it.
171
+ *
172
+ * @param {string[]} args - Search term(s) to look for
173
+ * @returns {Promise<void>}
174
+ *
175
+ * @example
176
+ * // Search for packages containing "node"
177
+ * do_brews_amazon_linux(['node'])
178
+ */
179
+ async function do_brews_amazon_linux(args) {
180
+ // Validate that a search term was provided
181
+ if (args.length === 0) {
182
+ console.log('Usage: brews <search-term>');
183
+ console.log('');
184
+ console.log('Search for packages using DNF/YUM (Amazon Linux equivalent of brew search).');
185
+ console.log('');
186
+ console.log('Examples:');
187
+ console.log(' brews node # Search for packages containing "node"');
188
+ console.log(' brews nodejs # Search for nodejs packages');
189
+ console.log('');
190
+ console.log('Tips:');
191
+ console.log(' dnf info <pkg> # Show detailed info about a package');
192
+ console.log(' dnf repoquery <pkg> # Query repository for package info');
193
+ process.exit(1);
194
+ }
195
+
196
+ // Detect package manager (dnf for AL2023, yum for AL2)
197
+ const hasDnf = shell.commandExists('dnf');
198
+ const hasYum = shell.commandExists('yum');
199
+ const packageManager = hasDnf ? 'dnf' : (hasYum ? 'yum' : null);
200
+
201
+ if (!packageManager) {
202
+ console.error('Error: Neither dnf nor yum package manager found.');
203
+ console.error('This command supports Amazon Linux 2023 (dnf) and Amazon Linux 2 (yum).');
204
+ process.exit(1);
205
+ }
206
+
207
+ // Execute dnf/yum search with all provided arguments
208
+ const { spawnSync } = require('child_process');
209
+
210
+ const result = spawnSync(packageManager, ['search', ...args], {
211
+ stdio: 'inherit',
212
+ shell: false
213
+ });
214
+
215
+ // Exit with the same code as the package manager
216
+ process.exit(result.status || 0);
217
+ }
218
+
219
+ /**
220
+ * Search for packages using Chocolatey in Windows Command Prompt.
221
+ *
222
+ * Runs `choco search <term>` to search for packages matching the specified term.
223
+ * Chocolatey searches the Chocolatey Community Repository.
224
+ *
225
+ * @param {string[]} args - Search term(s) to look for
226
+ * @returns {Promise<void>}
227
+ *
228
+ * @example
229
+ * // Search for packages containing "node"
230
+ * do_brews_cmd(['node'])
231
+ */
232
+ async function do_brews_cmd(args) {
233
+ // Validate that a search term was provided
234
+ if (args.length === 0) {
235
+ console.log('Usage: brews <search-term>');
236
+ console.log('');
237
+ console.log('Search for packages using Chocolatey (Windows equivalent of brew search).');
238
+ console.log('');
239
+ console.log('Examples:');
240
+ console.log(' brews node # Search for packages containing "node"');
241
+ console.log(' brews nodejs # Search for nodejs packages');
242
+ console.log(' brews --exact nodejs # Search for exact package name match');
243
+ console.log('');
244
+ console.log('Tips:');
245
+ console.log(' choco info <pkg> # Show detailed info about a package');
246
+ process.exit(1);
247
+ }
248
+
249
+ // Check if Chocolatey is installed
250
+ if (!shell.commandExists('choco')) {
251
+ console.error('Error: Chocolatey is not installed.');
252
+ console.error('');
253
+ console.error('Install Chocolatey first (run as Administrator in PowerShell):');
254
+ console.error(' Set-ExecutionPolicy Bypass -Scope Process -Force;');
255
+ console.error(' [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;');
256
+ console.error(' iex ((New-Object System.Net.WebClient).DownloadString(\'https://community.chocolatey.org/install.ps1\'))');
257
+ console.error('');
258
+ console.error('Alternatively, you can use winget:');
259
+ console.error(' winget search <term>');
260
+ process.exit(1);
261
+ }
262
+
263
+ // Execute choco search with all provided arguments
264
+ const { spawnSync } = require('child_process');
265
+
266
+ const result = spawnSync('choco', ['search', ...args], {
267
+ stdio: 'inherit',
268
+ shell: false
269
+ });
270
+
271
+ // Exit with the same code as choco
272
+ process.exit(result.status || 0);
273
+ }
274
+
275
+ /**
276
+ * Search for packages using Chocolatey or winget in Windows PowerShell.
277
+ *
278
+ * Prefers Chocolatey if available, falls back to winget.
279
+ * This mirrors the macOS Homebrew experience.
280
+ *
281
+ * @param {string[]} args - Search term(s) to look for
282
+ * @returns {Promise<void>}
283
+ */
284
+ async function do_brews_powershell(args) {
285
+ // Validate that a search term was provided
286
+ if (args.length === 0) {
287
+ console.log('Usage: brews <search-term>');
288
+ console.log('');
289
+ console.log('Search for packages using Chocolatey or winget (Windows equivalent of brew search).');
290
+ console.log('');
291
+ console.log('Examples:');
292
+ console.log(' brews node # Search for packages containing "node"');
293
+ console.log(' brews nodejs # Search for nodejs packages');
294
+ console.log('');
295
+ console.log('Tips:');
296
+ console.log(' choco info <pkg> # Show detailed info (Chocolatey)');
297
+ console.log(' winget show <pkg> # Show detailed info (winget)');
298
+ process.exit(1);
299
+ }
300
+
301
+ // Prefer Chocolatey if available, fall back to winget
302
+ const hasChoco = shell.commandExists('choco');
303
+ const hasWinget = shell.commandExists('winget');
304
+
305
+ if (!hasChoco && !hasWinget) {
306
+ console.error('Error: Neither Chocolatey nor winget is available.');
307
+ console.error('');
308
+ console.error('Install Chocolatey (recommended):');
309
+ console.error(' Set-ExecutionPolicy Bypass -Scope Process -Force;');
310
+ console.error(' [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;');
311
+ console.error(' iex ((New-Object System.Net.WebClient).DownloadString(\'https://community.chocolatey.org/install.ps1\'))');
312
+ console.error('');
313
+ console.error('Or use winget (built into Windows 11 and Windows 10 21H2+).');
314
+ process.exit(1);
315
+ }
316
+
317
+ const { spawnSync } = require('child_process');
318
+ let result;
319
+
320
+ if (hasChoco) {
321
+ // Use Chocolatey search
322
+ result = spawnSync('choco', ['search', ...args], {
323
+ stdio: 'inherit',
324
+ shell: false
325
+ });
326
+ } else {
327
+ // Use winget search
328
+ result = spawnSync('winget', ['search', ...args], {
329
+ stdio: 'inherit',
330
+ shell: false
331
+ });
332
+ }
333
+
334
+ // Exit with the same code as the package manager
335
+ process.exit(result.status || 0);
336
+ }
337
+
338
+ /**
339
+ * Search for packages from Git Bash on Windows.
340
+ *
341
+ * Git Bash runs within Windows, so this function uses Chocolatey or winget
342
+ * via the Windows host. Prefers Chocolatey if available.
343
+ *
344
+ * @param {string[]} args - Search term(s) to look for
345
+ * @returns {Promise<void>}
346
+ */
347
+ async function do_brews_gitbash(args) {
348
+ // Validate that a search term was provided
349
+ if (args.length === 0) {
350
+ console.log('Usage: brews <search-term>');
351
+ console.log('');
352
+ console.log('Search for packages using Chocolatey or winget (Windows equivalent of brew search).');
353
+ console.log('');
354
+ console.log('Examples:');
355
+ console.log(' brews node # Search for packages containing "node"');
356
+ console.log(' brews nodejs # Search for nodejs packages');
357
+ process.exit(1);
358
+ }
359
+
360
+ // Check for Chocolatey via PowerShell (more reliable in Git Bash)
361
+ const chocoCheck = await shell.exec('powershell.exe -NoProfile -Command "Get-Command choco -ErrorAction SilentlyContinue"');
362
+ const hasChoco = chocoCheck.code === 0 && chocoCheck.stdout.includes('choco');
363
+
364
+ // Check for winget via PowerShell
365
+ const wingetCheck = await shell.exec('powershell.exe -NoProfile -Command "Get-Command winget -ErrorAction SilentlyContinue"');
366
+ const hasWinget = wingetCheck.code === 0 && wingetCheck.stdout.includes('winget');
367
+
368
+ if (!hasChoco && !hasWinget) {
369
+ console.error('Error: Neither Chocolatey nor winget is available.');
370
+ console.error('');
371
+ console.error('Install Chocolatey (run as Administrator in PowerShell):');
372
+ console.error(' Set-ExecutionPolicy Bypass -Scope Process -Force;');
373
+ console.error(' [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;');
374
+ console.error(' iex ((New-Object System.Net.WebClient).DownloadString(\'https://community.chocolatey.org/install.ps1\'))');
375
+ process.exit(1);
376
+ }
377
+
378
+ let command;
379
+ let packageManager;
380
+
381
+ if (hasChoco) {
382
+ // Use Chocolatey via PowerShell
383
+ packageManager = 'Chocolatey';
384
+ const searchTerms = args.join(' ');
385
+ command = `powershell.exe -NoProfile -Command "choco search ${searchTerms}"`;
386
+ } else {
387
+ // Use winget via PowerShell
388
+ packageManager = 'winget';
389
+ const searchTerms = args.join(' ');
390
+ command = `powershell.exe -NoProfile -Command "winget search ${searchTerms}"`;
391
+ }
392
+
393
+ // Execute the search command
394
+ const result = await shell.exec(command);
395
+
396
+ // Output the result
397
+ if (result.stdout) {
398
+ console.log(result.stdout);
399
+ }
400
+ if (result.stderr && result.code !== 0) {
401
+ console.error(result.stderr);
402
+ }
403
+
404
+ // Exit with the same code as the package manager
405
+ process.exit(result.code || 0);
406
+ }
407
+
408
+ /**
409
+ * Main entry point - detects environment and executes appropriate implementation.
410
+ *
411
+ * This script searches for packages using the platform's native package manager:
412
+ * - macOS: Homebrew (brew search)
413
+ * - Ubuntu/Debian: APT (apt-cache search)
414
+ * - Raspberry Pi OS: APT (apt-cache search)
415
+ * - Amazon Linux: DNF or YUM (dnf/yum search)
416
+ * - Windows CMD: Chocolatey (choco search)
417
+ * - Windows PowerShell: Chocolatey or winget (choco/winget search)
418
+ * - Git Bash: Chocolatey or winget via PowerShell
419
+ *
420
+ * @param {string[]} args - Search term(s) to look for
421
+ * @returns {Promise<void>}
422
+ */
423
+ async function do_brews(args) {
424
+ const platform = os.detect();
425
+
426
+ const handlers = {
427
+ 'macos': do_brews_macos,
428
+ 'ubuntu': do_brews_ubuntu,
429
+ 'debian': do_brews_ubuntu,
430
+ 'raspbian': do_brews_raspbian,
431
+ 'amazon_linux': do_brews_amazon_linux,
432
+ 'rhel': do_brews_amazon_linux,
433
+ 'fedora': do_brews_amazon_linux,
434
+ 'cmd': do_brews_cmd,
435
+ 'windows': do_brews_powershell,
436
+ 'powershell': do_brews_powershell,
437
+ 'gitbash': do_brews_gitbash,
438
+ 'wsl': do_brews_ubuntu
439
+ };
440
+
441
+ const handler = handlers[platform.type];
442
+ if (!handler) {
443
+ console.error(`Platform '${platform.type}' is not supported for this command.`);
444
+ console.error('');
445
+ console.error('Supported platforms:');
446
+ console.error(' - macOS (Homebrew)');
447
+ console.error(' - Ubuntu/Debian (APT)');
448
+ console.error(' - Raspberry Pi OS (APT)');
449
+ console.error(' - Amazon Linux/RHEL/Fedora (DNF/YUM)');
450
+ console.error(' - Windows (Chocolatey/winget)');
451
+ console.error(' - Git Bash (Chocolatey/winget)');
452
+ console.error(' - WSL (APT)');
453
+ process.exit(1);
454
+ }
455
+
456
+ await handler(args);
18
457
  }
19
458
 
20
- module.exports = { main };
459
+ module.exports = {
460
+ main: do_brews,
461
+ do_brews,
462
+ do_brews_nodejs,
463
+ do_brews_macos,
464
+ do_brews_ubuntu,
465
+ do_brews_raspbian,
466
+ do_brews_amazon_linux,
467
+ do_brews_cmd,
468
+ do_brews_powershell,
469
+ do_brews_gitbash
470
+ };
21
471
 
22
472
  if (require.main === module) {
23
- main(process.argv.slice(2));
473
+ do_brews(process.argv.slice(2)).catch(err => {
474
+ console.error(err.message);
475
+ process.exit(1);
476
+ });
24
477
  }