@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
@@ -0,0 +1,447 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * @fileoverview Install Chocolatey - a package manager for Windows.
5
+ *
6
+ * Chocolatey is a machine-level package manager for Windows that automates
7
+ * the software installation, configuration, upgrade, and uninstallation
8
+ * process. It uses NuGet infrastructure and PowerShell to wrap installers,
9
+ * executables, zips, and scripts into compiled packages.
10
+ *
11
+ * Key features of Chocolatey:
12
+ * - Simple installation with a single command (`choco install <package>`)
13
+ * - Silent installations with the `-y` flag for non-interactive operation
14
+ * - Automatic dependency management
15
+ * - Enterprise-ready with integration for SCCM, Puppet, Chef, Ansible
16
+ * - Access to thousands of community-maintained packages at chocolatey.org
17
+ *
18
+ * IMPORTANT: Chocolatey is a Windows-only tool. It does not run on macOS,
19
+ * Linux, or within WSL. For those platforms, use the native package manager
20
+ * (Homebrew for macOS, APT for Debian/Ubuntu, DNF/YUM for RHEL).
21
+ *
22
+ * @module installs/chocolatey
23
+ */
24
+
25
+ const os = require('../utils/common/os');
26
+ const shell = require('../utils/common/shell');
27
+ const windowsShell = require('../utils/windows/shell');
28
+
29
+ /**
30
+ * The official Chocolatey installation script URL.
31
+ * This URL hosts the PowerShell installation script from chocolatey.org.
32
+ */
33
+ const CHOCOLATEY_INSTALL_URL = 'https://community.chocolatey.org/install.ps1';
34
+
35
+ /**
36
+ * The default Chocolatey installation directory on Windows.
37
+ * This is where Chocolatey installs itself and stores packages.
38
+ */
39
+ const CHOCOLATEY_INSTALL_PATH = 'C:\\ProgramData\\chocolatey';
40
+
41
+ /**
42
+ * Check if Chocolatey is installed by looking for the 'choco' command.
43
+ *
44
+ * This is a quick synchronous check that works on both native Windows
45
+ * and Git Bash environments. Returns true if the 'choco' command is
46
+ * available in the system PATH.
47
+ *
48
+ * @returns {boolean} True if Chocolatey is installed, false otherwise
49
+ */
50
+ function isChocolateyInstalled() {
51
+ return shell.commandExists('choco');
52
+ }
53
+
54
+ /**
55
+ * Get the installed Chocolatey version.
56
+ *
57
+ * Executes 'choco --version' to retrieve the installed version number.
58
+ * Returns null if Chocolatey is not installed or if the version cannot
59
+ * be determined.
60
+ *
61
+ * @returns {Promise<string|null>} The version string (e.g., "2.4.1"), or null
62
+ */
63
+ async function getChocolateyVersion() {
64
+ if (!isChocolateyInstalled()) {
65
+ return null;
66
+ }
67
+
68
+ const result = await shell.exec('choco --version');
69
+ if (result.code === 0 && result.stdout) {
70
+ // Output is simply the version number, e.g., "2.4.1"
71
+ return result.stdout.trim();
72
+ }
73
+ return null;
74
+ }
75
+
76
+ /**
77
+ * Install Chocolatey on macOS.
78
+ *
79
+ * Chocolatey does not run on macOS because it is built on PowerShell
80
+ * and the Windows ecosystem. This function gracefully informs the user
81
+ * that Chocolatey is not available for this platform.
82
+ *
83
+ * @returns {Promise<void>}
84
+ */
85
+ async function install_macos() {
86
+ console.log('Chocolatey is not available for macOS.');
87
+ return;
88
+ }
89
+
90
+ /**
91
+ * Install Chocolatey on Ubuntu/Debian.
92
+ *
93
+ * Chocolatey does not run on Linux because it is built on PowerShell
94
+ * and the Windows ecosystem. This function gracefully informs the user
95
+ * that Chocolatey is not available for this platform.
96
+ *
97
+ * @returns {Promise<void>}
98
+ */
99
+ async function install_ubuntu() {
100
+ console.log('Chocolatey is not available for Ubuntu/Debian.');
101
+ return;
102
+ }
103
+
104
+ /**
105
+ * Install Chocolatey on Ubuntu running in WSL.
106
+ *
107
+ * Chocolatey does not run within WSL because WSL provides a Linux
108
+ * environment, not a Windows environment. This function gracefully
109
+ * informs the user that Chocolatey is not available within WSL.
110
+ *
111
+ * Note: If the user needs Chocolatey, they should install it on the
112
+ * Windows host (outside of WSL) using PowerShell.
113
+ *
114
+ * @returns {Promise<void>}
115
+ */
116
+ async function install_ubuntu_wsl() {
117
+ console.log('Chocolatey is not available for WSL.');
118
+ return;
119
+ }
120
+
121
+ /**
122
+ * Install Chocolatey on Raspberry Pi OS.
123
+ *
124
+ * Chocolatey does not run on Linux because it is built on PowerShell
125
+ * and the Windows ecosystem. This function gracefully informs the user
126
+ * that Chocolatey is not available for this platform.
127
+ *
128
+ * @returns {Promise<void>}
129
+ */
130
+ async function install_raspbian() {
131
+ console.log('Chocolatey is not available for Raspberry Pi OS.');
132
+ return;
133
+ }
134
+
135
+ /**
136
+ * Install Chocolatey on Amazon Linux/RHEL.
137
+ *
138
+ * Chocolatey does not run on Linux because it is built on PowerShell
139
+ * and the Windows ecosystem. This function gracefully informs the user
140
+ * that Chocolatey is not available for this platform.
141
+ *
142
+ * @returns {Promise<void>}
143
+ */
144
+ async function install_amazon_linux() {
145
+ console.log('Chocolatey is not available for Amazon Linux.');
146
+ return;
147
+ }
148
+
149
+ /**
150
+ * Install Chocolatey on Windows using PowerShell.
151
+ *
152
+ * This is the primary installation method for Chocolatey. The installation
153
+ * process uses PowerShell to download and execute the official installation
154
+ * script from chocolatey.org.
155
+ *
156
+ * Prerequisites:
157
+ * - Windows 7 SP1 or later (Windows 10/11 recommended)
158
+ * - PowerShell v3 or later (comes pre-installed on Windows 10/11)
159
+ * - .NET Framework 4.8 (installer handles this automatically if missing)
160
+ * - Administrator privileges
161
+ *
162
+ * The installation command performs the following operations:
163
+ * 1. Temporarily sets execution policy to Bypass for the current session
164
+ * 2. Enables TLS 1.2 for secure HTTPS downloads
165
+ * 3. Downloads and executes the official Chocolatey installation script
166
+ *
167
+ * After installation, Chocolatey creates:
168
+ * - The C:\ProgramData\chocolatey directory structure
169
+ * - The ChocolateyInstall environment variable
170
+ * - Adds Chocolatey to the system PATH
171
+ *
172
+ * @returns {Promise<void>}
173
+ */
174
+ async function install_windows() {
175
+ // Check if Chocolatey is already installed - this makes the function idempotent
176
+ if (isChocolateyInstalled()) {
177
+ const version = await getChocolateyVersion();
178
+ if (version) {
179
+ console.log(`Chocolatey ${version} is already installed, skipping...`);
180
+ } else {
181
+ console.log('Chocolatey is already installed, skipping...');
182
+ }
183
+ return;
184
+ }
185
+
186
+ // Verify that PowerShell is available (it should be on Windows 10/11)
187
+ const hasPowerShell = windowsShell.hasWindowsPowerShell() || windowsShell.hasPowerShellCore();
188
+ if (!hasPowerShell) {
189
+ console.log('PowerShell is required to install Chocolatey but was not found.');
190
+ console.log('PowerShell should be pre-installed on Windows 10 and later.');
191
+ return;
192
+ }
193
+
194
+ console.log('Installing Chocolatey via PowerShell...');
195
+ console.log('');
196
+ console.log('This requires Administrator privileges. If this script is not running');
197
+ console.log('as Administrator, the installation may fail.');
198
+ console.log('');
199
+
200
+ // Build the PowerShell installation command
201
+ // This is the official installation command from https://chocolatey.org/install
202
+ //
203
+ // Breaking down the command:
204
+ // - Set-ExecutionPolicy Bypass -Scope Process -Force
205
+ // Temporarily allows script execution for the current session only
206
+ // Does not permanently change the system execution policy
207
+ //
208
+ // - [System.Net.ServicePointManager]::SecurityProtocol = ... -bor 3072
209
+ // Enables TLS 1.2 for secure HTTPS downloads
210
+ // The value 3072 represents Tls12 in the SecurityProtocolType enum
211
+ //
212
+ // - iex ((New-Object System.Net.WebClient).DownloadString(...))
213
+ // Downloads and immediately executes the installation script
214
+ const installCommand = [
215
+ 'Set-ExecutionPolicy Bypass -Scope Process -Force;',
216
+ '[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;',
217
+ `iex ((New-Object System.Net.WebClient).DownloadString('${CHOCOLATEY_INSTALL_URL}'))`
218
+ ].join(' ');
219
+
220
+ // Execute the installation command via PowerShell
221
+ // We use powershell.exe (Windows PowerShell 5.x) for maximum compatibility
222
+ const result = await shell.exec(`powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "${installCommand}"`);
223
+
224
+ if (result.code !== 0) {
225
+ console.log('Failed to install Chocolatey.');
226
+ console.log('');
227
+ console.log('Common causes:');
228
+ console.log(' 1. Not running as Administrator');
229
+ console.log(' 2. Network/firewall blocking the download');
230
+ console.log(' 3. PowerShell execution policy restrictions');
231
+ console.log('');
232
+ console.log('To install manually, open an Administrator PowerShell and run:');
233
+ console.log(' Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString(\'https://community.chocolatey.org/install.ps1\'))');
234
+ console.log('');
235
+ if (result.stderr) {
236
+ console.log('Error details:');
237
+ console.log(result.stderr);
238
+ }
239
+ return;
240
+ }
241
+
242
+ // Verify the installation succeeded
243
+ // Note: The PATH may not be updated in the current session, so we check
244
+ // for the choco executable directly in the expected installation path
245
+ const verifyResult = await shell.exec(`powershell.exe -NoProfile -Command "Test-Path '${CHOCOLATEY_INSTALL_PATH}\\bin\\choco.exe'"`);
246
+ const isVerified = verifyResult.code === 0 && verifyResult.stdout.trim().toLowerCase() === 'true';
247
+
248
+ if (!isVerified) {
249
+ console.log('Installation may have failed: Chocolatey was not found after install.');
250
+ console.log('');
251
+ console.log('Please try installing manually from an Administrator PowerShell.');
252
+ return;
253
+ }
254
+
255
+ console.log('Chocolatey installed successfully.');
256
+ console.log('');
257
+ console.log('IMPORTANT: Close and reopen your terminal for PATH changes to take effect.');
258
+ console.log('');
259
+ console.log('Verify the installation by running:');
260
+ console.log(' choco --version');
261
+ console.log('');
262
+ console.log('Install your first package with:');
263
+ console.log(' choco install notepadplusplus -y');
264
+ }
265
+
266
+ /**
267
+ * Install Chocolatey from Git Bash on Windows.
268
+ *
269
+ * Git Bash runs on Windows, so Chocolatey can be installed on the Windows
270
+ * host. However, the installation must be performed via PowerShell because
271
+ * Git Bash cannot directly execute the PowerShell installation script.
272
+ *
273
+ * This function invokes PowerShell from Git Bash to perform the installation.
274
+ * After installation, Chocolatey commands will be available in Git Bash.
275
+ *
276
+ * Prerequisites:
277
+ * - Windows operating system with Git Bash installed
278
+ * - PowerShell available on the Windows host
279
+ * - Administrator privileges (run Git Bash as Administrator)
280
+ *
281
+ * @returns {Promise<void>}
282
+ */
283
+ async function install_gitbash() {
284
+ // Check if Chocolatey is already installed - this makes the function idempotent
285
+ if (isChocolateyInstalled()) {
286
+ const version = await getChocolateyVersion();
287
+ if (version) {
288
+ console.log(`Chocolatey ${version} is already installed, skipping...`);
289
+ } else {
290
+ console.log('Chocolatey is already installed, skipping...');
291
+ }
292
+ return;
293
+ }
294
+
295
+ console.log('Installing Chocolatey on the Windows host via PowerShell...');
296
+ console.log('');
297
+ console.log('This requires Administrator privileges. If Git Bash is not running');
298
+ console.log('as Administrator, the installation may fail.');
299
+ console.log('');
300
+
301
+ // Build the PowerShell installation command (same as install_windows)
302
+ const installCommand = [
303
+ 'Set-ExecutionPolicy Bypass -Scope Process -Force;',
304
+ '[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;',
305
+ `iex ((New-Object System.Net.WebClient).DownloadString('${CHOCOLATEY_INSTALL_URL}'))`
306
+ ].join(' ');
307
+
308
+ // Execute the installation command via PowerShell from Git Bash
309
+ // Git Bash can invoke Windows executables directly
310
+ const result = await shell.exec(`powershell.exe -NoProfile -ExecutionPolicy Bypass -Command "${installCommand}"`);
311
+
312
+ if (result.code !== 0) {
313
+ console.log('Failed to install Chocolatey.');
314
+ console.log('');
315
+ console.log('Common causes:');
316
+ console.log(' 1. Git Bash not running as Administrator');
317
+ console.log(' 2. Network/firewall blocking the download');
318
+ console.log(' 3. PowerShell execution policy restrictions');
319
+ console.log('');
320
+ console.log('To install manually:');
321
+ console.log(' 1. Close Git Bash');
322
+ console.log(' 2. Open an Administrator PowerShell window');
323
+ console.log(' 3. Run the Chocolatey installation command');
324
+ console.log(' 4. Close and reopen Git Bash');
325
+ console.log('');
326
+ if (result.stderr) {
327
+ console.log('Error details:');
328
+ console.log(result.stderr);
329
+ }
330
+ return;
331
+ }
332
+
333
+ // Verify the installation succeeded
334
+ const verifyResult = await shell.exec(`powershell.exe -NoProfile -Command "Test-Path '${CHOCOLATEY_INSTALL_PATH}\\bin\\choco.exe'"`);
335
+ const isVerified = verifyResult.code === 0 && verifyResult.stdout.trim().toLowerCase() === 'true';
336
+
337
+ if (!isVerified) {
338
+ console.log('Installation may have failed: Chocolatey was not found after install.');
339
+ console.log('');
340
+ console.log('Please try installing manually from an Administrator PowerShell.');
341
+ return;
342
+ }
343
+
344
+ console.log('Chocolatey installed successfully.');
345
+ console.log('');
346
+ console.log('IMPORTANT: Close and reopen Git Bash for PATH changes to take effect.');
347
+ console.log('');
348
+ console.log('If choco is not found after reopening, add Chocolatey to your PATH:');
349
+ console.log(' echo \'export PATH="$PATH:/c/ProgramData/chocolatey/bin"\' >> ~/.bashrc');
350
+ console.log(' source ~/.bashrc');
351
+ console.log('');
352
+ console.log('Verify the installation by running:');
353
+ console.log(' choco --version');
354
+ }
355
+
356
+ /**
357
+ * Check if Chocolatey is installed on the current platform.
358
+ *
359
+ * This function uses the internal isChocolateyInstalled helper to check if
360
+ * the 'choco' command exists in PATH.
361
+ *
362
+ * @returns {Promise<boolean>} True if Chocolatey is installed
363
+ */
364
+ async function isInstalled() {
365
+ return isChocolateyInstalled();
366
+ }
367
+
368
+ /**
369
+ * Check if this installer is supported on the current platform.
370
+ *
371
+ * Chocolatey can only be installed on:
372
+ * - Windows (native PowerShell)
373
+ * - Git Bash (Windows environment)
374
+ *
375
+ * Note: Chocolatey is a Windows-only tool and cannot run on macOS,
376
+ * Linux, or within WSL.
377
+ *
378
+ * @returns {boolean} True if installation is supported on this platform
379
+ */
380
+ function isEligible() {
381
+ const platform = os.detect();
382
+ return ['windows', 'gitbash'].includes(platform.type);
383
+ }
384
+
385
+ /**
386
+ * Main installation entry point - detects platform and runs appropriate installer.
387
+ *
388
+ * This function detects the current operating system and dispatches to the
389
+ * appropriate platform-specific installer function. Chocolatey is only
390
+ * supported on Windows and Git Bash (which runs on Windows).
391
+ *
392
+ * For all other platforms (macOS, Linux, WSL), the function gracefully
393
+ * returns with a message indicating that Chocolatey is not available.
394
+ *
395
+ * @returns {Promise<void>}
396
+ */
397
+ async function install() {
398
+ const platform = os.detect();
399
+
400
+ // Map platform types to their corresponding installer functions
401
+ // Only Windows and Git Bash have actual installation logic
402
+ // All other platforms gracefully return with a message
403
+ const installers = {
404
+ 'macos': install_macos,
405
+ 'ubuntu': install_ubuntu,
406
+ 'debian': install_ubuntu,
407
+ 'wsl': install_ubuntu_wsl,
408
+ 'raspbian': install_raspbian,
409
+ 'amazon_linux': install_amazon_linux,
410
+ 'fedora': install_amazon_linux,
411
+ 'rhel': install_amazon_linux,
412
+ 'windows': install_windows,
413
+ 'gitbash': install_gitbash,
414
+ };
415
+
416
+ // Look up the installer for the detected platform
417
+ const installer = installers[platform.type];
418
+
419
+ // If no installer exists for this platform, inform the user gracefully
420
+ if (!installer) {
421
+ console.log(`Chocolatey is not available for ${platform.type}.`);
422
+ return;
423
+ }
424
+
425
+ // Run the platform-specific installer
426
+ await installer();
427
+ }
428
+
429
+ module.exports = {
430
+ install,
431
+ isInstalled,
432
+ isEligible,
433
+ install_macos,
434
+ install_ubuntu,
435
+ install_ubuntu_wsl,
436
+ install_raspbian,
437
+ install_amazon_linux,
438
+ install_windows,
439
+ install_gitbash,
440
+ };
441
+
442
+ if (require.main === module) {
443
+ install().catch(err => {
444
+ console.error(err.message);
445
+ process.exit(1);
446
+ });
447
+ }