@fredlackey/devutils 0.0.17 → 0.0.19

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 (331) hide show
  1. package/README.md +32 -150
  2. package/package.json +5 -82
  3. package/bin/dev.js +0 -16
  4. package/files/README.md +0 -0
  5. package/files/claude/.claude/commands/setup-context.md +0 -3
  6. package/files/monorepos/_archive/README.md +0 -36
  7. package/files/monorepos/_legacy/README.md +0 -36
  8. package/files/monorepos/ai-docs/README.md +0 -33
  9. package/files/monorepos/apps/README.md +0 -24
  10. package/files/monorepos/docs/README.md +0 -40
  11. package/files/monorepos/packages/README.md +0 -25
  12. package/files/monorepos/research/README.md +0 -29
  13. package/files/monorepos/scripts/README.md +0 -24
  14. package/src/cli.js +0 -72
  15. package/src/commands/README.md +0 -41
  16. package/src/commands/configure.js +0 -199
  17. package/src/commands/identity.js +0 -1630
  18. package/src/commands/ignore.js +0 -247
  19. package/src/commands/install.js +0 -526
  20. package/src/commands/setup.js +0 -246
  21. package/src/commands/status.js +0 -223
  22. package/src/commands/update.js +0 -142
  23. package/src/commands/version.js +0 -100
  24. package/src/completion.js +0 -284
  25. package/src/constants.js +0 -45
  26. package/src/ignore/claude-code.txt +0 -10
  27. package/src/ignore/docker.txt +0 -18
  28. package/src/ignore/linux.txt +0 -23
  29. package/src/ignore/macos.txt +0 -36
  30. package/src/ignore/node.txt +0 -55
  31. package/src/ignore/terraform.txt +0 -37
  32. package/src/ignore/vscode.txt +0 -18
  33. package/src/ignore/windows.txt +0 -35
  34. package/src/index.js +0 -0
  35. package/src/installs/README.md +0 -399
  36. package/src/installs/adobe-creative-cloud.js +0 -546
  37. package/src/installs/adobe-creative-cloud.md +0 -605
  38. package/src/installs/appcleaner.js +0 -321
  39. package/src/installs/appcleaner.md +0 -699
  40. package/src/installs/apt-transport-https.js +0 -390
  41. package/src/installs/apt-transport-https.md +0 -678
  42. package/src/installs/atomicparsley.js +0 -642
  43. package/src/installs/atomicparsley.md +0 -795
  44. package/src/installs/aws-cli.js +0 -797
  45. package/src/installs/aws-cli.md +0 -727
  46. package/src/installs/balena-etcher.js +0 -710
  47. package/src/installs/balena-etcher.md +0 -761
  48. package/src/installs/bambu-studio.js +0 -1143
  49. package/src/installs/bambu-studio.md +0 -780
  50. package/src/installs/bash-completion.js +0 -575
  51. package/src/installs/bash-completion.md +0 -833
  52. package/src/installs/bash.js +0 -417
  53. package/src/installs/bash.md +0 -993
  54. package/src/installs/beyond-compare.js +0 -603
  55. package/src/installs/beyond-compare.md +0 -813
  56. package/src/installs/brave-browser.js +0 -968
  57. package/src/installs/brave-browser.md +0 -650
  58. package/src/installs/build-essential.js +0 -529
  59. package/src/installs/build-essential.md +0 -977
  60. package/src/installs/ca-certificates.js +0 -618
  61. package/src/installs/ca-certificates.md +0 -937
  62. package/src/installs/caffeine.js +0 -508
  63. package/src/installs/caffeine.md +0 -839
  64. package/src/installs/camtasia.js +0 -596
  65. package/src/installs/camtasia.md +0 -762
  66. package/src/installs/chatgpt.js +0 -476
  67. package/src/installs/chatgpt.md +0 -814
  68. package/src/installs/chocolatey.js +0 -456
  69. package/src/installs/chocolatey.md +0 -661
  70. package/src/installs/chrome-canary.js +0 -419
  71. package/src/installs/chrome-canary.md +0 -641
  72. package/src/installs/chromium.js +0 -667
  73. package/src/installs/chromium.md +0 -838
  74. package/src/installs/claude-code.js +0 -576
  75. package/src/installs/claude-code.md +0 -1173
  76. package/src/installs/cloudflare-warp.js +0 -900
  77. package/src/installs/cloudflare-warp.md +0 -1047
  78. package/src/installs/comet-browser.js +0 -588
  79. package/src/installs/comet-browser.md +0 -731
  80. package/src/installs/curl.js +0 -379
  81. package/src/installs/curl.md +0 -714
  82. package/src/installs/cursor.js +0 -579
  83. package/src/installs/cursor.md +0 -970
  84. package/src/installs/dbeaver.js +0 -924
  85. package/src/installs/dbeaver.md +0 -939
  86. package/src/installs/dbschema.js +0 -692
  87. package/src/installs/dbschema.md +0 -925
  88. package/src/installs/dependencies.md +0 -453
  89. package/src/installs/development-tools.js +0 -600
  90. package/src/installs/development-tools.md +0 -977
  91. package/src/installs/docker.js +0 -1029
  92. package/src/installs/docker.md +0 -1109
  93. package/src/installs/drawio.js +0 -1019
  94. package/src/installs/drawio.md +0 -795
  95. package/src/installs/elmedia-player.js +0 -347
  96. package/src/installs/elmedia-player.md +0 -556
  97. package/src/installs/ffmpeg.js +0 -889
  98. package/src/installs/ffmpeg.md +0 -852
  99. package/src/installs/file.js +0 -464
  100. package/src/installs/file.md +0 -987
  101. package/src/installs/gemini-cli.js +0 -811
  102. package/src/installs/gemini-cli.md +0 -1153
  103. package/src/installs/git.js +0 -400
  104. package/src/installs/git.md +0 -907
  105. package/src/installs/gitego.js +0 -949
  106. package/src/installs/gitego.md +0 -1172
  107. package/src/installs/go.js +0 -931
  108. package/src/installs/go.md +0 -958
  109. package/src/installs/google-antigravity.js +0 -913
  110. package/src/installs/google-antigravity.md +0 -1075
  111. package/src/installs/google-chrome.js +0 -833
  112. package/src/installs/google-chrome.md +0 -862
  113. package/src/installs/gpg.js +0 -480
  114. package/src/installs/gpg.md +0 -1056
  115. package/src/installs/homebrew.js +0 -1033
  116. package/src/installs/homebrew.md +0 -988
  117. package/src/installs/imageoptim.js +0 -968
  118. package/src/installs/imageoptim.md +0 -1119
  119. package/src/installs/installers.json +0 -4032
  120. package/src/installs/installers.json.tmp +0 -3953
  121. package/src/installs/jq.js +0 -400
  122. package/src/installs/jq.md +0 -809
  123. package/src/installs/keyboard-maestro.js +0 -719
  124. package/src/installs/keyboard-maestro.md +0 -825
  125. package/src/installs/kiro.js +0 -864
  126. package/src/installs/kiro.md +0 -1015
  127. package/src/installs/latex.js +0 -789
  128. package/src/installs/latex.md +0 -1095
  129. package/src/installs/lftp.js +0 -356
  130. package/src/installs/lftp.md +0 -907
  131. package/src/installs/lsb-release.js +0 -346
  132. package/src/installs/lsb-release.md +0 -814
  133. package/src/installs/messenger.js +0 -847
  134. package/src/installs/messenger.md +0 -900
  135. package/src/installs/microsoft-office.js +0 -568
  136. package/src/installs/microsoft-office.md +0 -760
  137. package/src/installs/microsoft-teams.js +0 -801
  138. package/src/installs/microsoft-teams.md +0 -886
  139. package/src/installs/moom.js +0 -326
  140. package/src/installs/moom.md +0 -570
  141. package/src/installs/node.js +0 -904
  142. package/src/installs/node.md +0 -1153
  143. package/src/installs/nordpass.js +0 -716
  144. package/src/installs/nordpass.md +0 -921
  145. package/src/installs/nordvpn.js +0 -892
  146. package/src/installs/nordvpn.md +0 -1052
  147. package/src/installs/nvm.js +0 -995
  148. package/src/installs/nvm.md +0 -1057
  149. package/src/installs/ohmyzsh.js +0 -529
  150. package/src/installs/ohmyzsh.md +0 -1094
  151. package/src/installs/openssh.js +0 -804
  152. package/src/installs/openssh.md +0 -1056
  153. package/src/installs/pandoc.js +0 -662
  154. package/src/installs/pandoc.md +0 -1036
  155. package/src/installs/parallels-desktop.js +0 -431
  156. package/src/installs/parallels-desktop.md +0 -446
  157. package/src/installs/pinentry.js +0 -510
  158. package/src/installs/pinentry.md +0 -1142
  159. package/src/installs/pngyu.js +0 -869
  160. package/src/installs/pngyu.md +0 -896
  161. package/src/installs/postman.js +0 -799
  162. package/src/installs/postman.md +0 -940
  163. package/src/installs/procps.js +0 -425
  164. package/src/installs/procps.md +0 -851
  165. package/src/installs/safari-tech-preview.js +0 -374
  166. package/src/installs/safari-tech-preview.md +0 -533
  167. package/src/installs/sfnt2woff.js +0 -658
  168. package/src/installs/sfnt2woff.md +0 -795
  169. package/src/installs/shellcheck.js +0 -481
  170. package/src/installs/shellcheck.md +0 -1005
  171. package/src/installs/slack.js +0 -741
  172. package/src/installs/slack.md +0 -865
  173. package/src/installs/snagit.js +0 -585
  174. package/src/installs/snagit.md +0 -844
  175. package/src/installs/software-properties-common.js +0 -372
  176. package/src/installs/software-properties-common.md +0 -805
  177. package/src/installs/spotify.js +0 -877
  178. package/src/installs/spotify.md +0 -901
  179. package/src/installs/studio-3t.js +0 -823
  180. package/src/installs/studio-3t.md +0 -918
  181. package/src/installs/sublime-text.js +0 -804
  182. package/src/installs/sublime-text.md +0 -914
  183. package/src/installs/superwhisper.js +0 -706
  184. package/src/installs/superwhisper.md +0 -630
  185. package/src/installs/tailscale.js +0 -745
  186. package/src/installs/tailscale.md +0 -1100
  187. package/src/installs/tar.js +0 -389
  188. package/src/installs/tar.md +0 -946
  189. package/src/installs/termius.js +0 -798
  190. package/src/installs/termius.md +0 -844
  191. package/src/installs/terraform.js +0 -779
  192. package/src/installs/terraform.md +0 -899
  193. package/src/installs/tfenv.js +0 -778
  194. package/src/installs/tfenv.md +0 -1091
  195. package/src/installs/tidal.js +0 -771
  196. package/src/installs/tidal.md +0 -864
  197. package/src/installs/tmux.js +0 -346
  198. package/src/installs/tmux.md +0 -1030
  199. package/src/installs/tree.js +0 -411
  200. package/src/installs/tree.md +0 -833
  201. package/src/installs/unzip.js +0 -460
  202. package/src/installs/unzip.md +0 -879
  203. package/src/installs/vim.js +0 -421
  204. package/src/installs/vim.md +0 -1040
  205. package/src/installs/vlc.js +0 -821
  206. package/src/installs/vlc.md +0 -927
  207. package/src/installs/vscode.js +0 -843
  208. package/src/installs/vscode.md +0 -1002
  209. package/src/installs/wget.js +0 -420
  210. package/src/installs/wget.md +0 -791
  211. package/src/installs/whatsapp.js +0 -729
  212. package/src/installs/whatsapp.md +0 -854
  213. package/src/installs/winpty.js +0 -352
  214. package/src/installs/winpty.md +0 -620
  215. package/src/installs/woff2.js +0 -553
  216. package/src/installs/woff2.md +0 -977
  217. package/src/installs/wsl.js +0 -572
  218. package/src/installs/wsl.md +0 -699
  219. package/src/installs/xcode-clt.js +0 -520
  220. package/src/installs/xcode-clt.md +0 -351
  221. package/src/installs/xcode.js +0 -560
  222. package/src/installs/xcode.md +0 -573
  223. package/src/installs/yarn.js +0 -824
  224. package/src/installs/yarn.md +0 -1074
  225. package/src/installs/yq.js +0 -654
  226. package/src/installs/yq.md +0 -944
  227. package/src/installs/yt-dlp.js +0 -701
  228. package/src/installs/yt-dlp.md +0 -946
  229. package/src/installs/yum-utils.js +0 -297
  230. package/src/installs/yum-utils.md +0 -648
  231. package/src/installs/zoom.js +0 -759
  232. package/src/installs/zoom.md +0 -884
  233. package/src/installs/zsh.js +0 -455
  234. package/src/installs/zsh.md +0 -1008
  235. package/src/scripts/README.md +0 -617
  236. package/src/scripts/STATUS.md +0 -208
  237. package/src/scripts/afk.js +0 -411
  238. package/src/scripts/backup-all.js +0 -746
  239. package/src/scripts/backup-source.js +0 -727
  240. package/src/scripts/brewd.js +0 -389
  241. package/src/scripts/brewi.js +0 -520
  242. package/src/scripts/brewr.js +0 -527
  243. package/src/scripts/brews.js +0 -477
  244. package/src/scripts/brewu.js +0 -504
  245. package/src/scripts/c.js +0 -201
  246. package/src/scripts/ccurl.js +0 -341
  247. package/src/scripts/certbot-crontab-init.js +0 -504
  248. package/src/scripts/certbot-init.js +0 -657
  249. package/src/scripts/ch.js +0 -355
  250. package/src/scripts/claude-danger.js +0 -268
  251. package/src/scripts/clean-dev.js +0 -435
  252. package/src/scripts/clear-dns-cache.js +0 -541
  253. package/src/scripts/clone.js +0 -435
  254. package/src/scripts/code-all.js +0 -437
  255. package/src/scripts/count-files.js +0 -211
  256. package/src/scripts/count-folders.js +0 -211
  257. package/src/scripts/count.js +0 -264
  258. package/src/scripts/d.js +0 -219
  259. package/src/scripts/datauri.js +0 -389
  260. package/src/scripts/delete-files.js +0 -380
  261. package/src/scripts/docker-clean.js +0 -426
  262. package/src/scripts/dp.js +0 -442
  263. package/src/scripts/e.js +0 -390
  264. package/src/scripts/empty-trash.js +0 -513
  265. package/src/scripts/evm.js +0 -444
  266. package/src/scripts/fetch-github-repos.js +0 -456
  267. package/src/scripts/get-channel.js +0 -345
  268. package/src/scripts/get-course.js +0 -399
  269. package/src/scripts/get-dependencies.js +0 -306
  270. package/src/scripts/get-folder.js +0 -799
  271. package/src/scripts/get-tunes.js +0 -426
  272. package/src/scripts/get-video.js +0 -367
  273. package/src/scripts/git-backup.js +0 -577
  274. package/src/scripts/git-clone.js +0 -493
  275. package/src/scripts/git-pup.js +0 -319
  276. package/src/scripts/git-push.js +0 -396
  277. package/src/scripts/h.js +0 -622
  278. package/src/scripts/hide-desktop-icons.js +0 -499
  279. package/src/scripts/hide-hidden-files.js +0 -538
  280. package/src/scripts/install-dependencies-from.js +0 -456
  281. package/src/scripts/ips.js +0 -663
  282. package/src/scripts/iso.js +0 -370
  283. package/src/scripts/killni.js +0 -577
  284. package/src/scripts/ll.js +0 -467
  285. package/src/scripts/local-ip.js +0 -325
  286. package/src/scripts/m.js +0 -524
  287. package/src/scripts/map.js +0 -309
  288. package/src/scripts/mkd.js +0 -351
  289. package/src/scripts/ncu-update-all.js +0 -457
  290. package/src/scripts/nginx-init.js +0 -718
  291. package/src/scripts/npmi.js +0 -382
  292. package/src/scripts/o.js +0 -511
  293. package/src/scripts/org-by-date.js +0 -338
  294. package/src/scripts/p.js +0 -224
  295. package/src/scripts/packages.js +0 -330
  296. package/src/scripts/path.js +0 -225
  297. package/src/scripts/ports.js +0 -597
  298. package/src/scripts/q.js +0 -305
  299. package/src/scripts/refresh-files.js +0 -394
  300. package/src/scripts/remove-smaller-files.js +0 -516
  301. package/src/scripts/rename-files-with-date.js +0 -533
  302. package/src/scripts/resize-image.js +0 -539
  303. package/src/scripts/rm-safe.js +0 -669
  304. package/src/scripts/s.js +0 -540
  305. package/src/scripts/set-git-public.js +0 -365
  306. package/src/scripts/show-desktop-icons.js +0 -475
  307. package/src/scripts/show-hidden-files.js +0 -472
  308. package/src/scripts/tpa.js +0 -280
  309. package/src/scripts/tpo.js +0 -280
  310. package/src/scripts/u.js +0 -505
  311. package/src/scripts/vpush.js +0 -437
  312. package/src/scripts/y.js +0 -283
  313. package/src/utils/README.md +0 -95
  314. package/src/utils/common/apps.js +0 -143
  315. package/src/utils/common/display.js +0 -157
  316. package/src/utils/common/network.js +0 -185
  317. package/src/utils/common/os.js +0 -294
  318. package/src/utils/common/package-manager.js +0 -301
  319. package/src/utils/common/privileges.js +0 -138
  320. package/src/utils/common/shell.js +0 -216
  321. package/src/utils/macos/apps.js +0 -228
  322. package/src/utils/macos/brew.js +0 -315
  323. package/src/utils/ubuntu/apt.js +0 -307
  324. package/src/utils/ubuntu/desktop.js +0 -292
  325. package/src/utils/ubuntu/snap.js +0 -344
  326. package/src/utils/ubuntu/systemd.js +0 -286
  327. package/src/utils/windows/choco.js +0 -465
  328. package/src/utils/windows/env.js +0 -246
  329. package/src/utils/windows/registry.js +0 -269
  330. package/src/utils/windows/shell.js +0 -240
  331. package/src/utils/windows/winget.js +0 -489
@@ -1,520 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * @fileoverview Install Xcode Command Line Tools on macOS.
5
- *
6
- * Xcode is Apple's integrated development environment (IDE) for developing software
7
- * for all Apple platforms including iOS, macOS, watchOS, tvOS, and visionOS.
8
- *
9
- * This installer focuses on the Xcode Command Line Tools - a lightweight package
10
- * (~2.5 GB) containing essential development utilities (compilers, git, make, etc.)
11
- * needed by most developers and required by package managers like Homebrew.
12
- *
13
- * IMPORTANT PLATFORM LIMITATION:
14
- * Xcode and Xcode Command Line Tools are Apple-exclusive products and ONLY run
15
- * on macOS. There is no legitimate way to install or run Xcode on Windows, Linux,
16
- * or other operating systems.
17
- *
18
- * What this installer provides:
19
- * - Non-interactive installation of Xcode Command Line Tools via softwareupdate
20
- * - Verification of existing installation to ensure idempotency
21
- * - Graceful handling of unsupported platforms
22
- *
23
- * @module installs/xcode-clt
24
- */
25
-
26
- const os = require('../utils/common/os');
27
- const shell = require('../utils/common/shell');
28
- const fs = require('fs');
29
- const path = require('path');
30
-
31
- /**
32
- * The path where Xcode Command Line Tools are installed on macOS.
33
- * This is the standard location Apple uses for CLT installations.
34
- */
35
- const CLT_INSTALL_PATH = '/Library/Developer/CommandLineTools';
36
-
37
- /**
38
- * The path to the placeholder file used to make CLT appear in softwareupdate.
39
- * Creating this file triggers macOS to list CLT as an available update.
40
- */
41
- const CLT_PLACEHOLDER_FILE = '/tmp/.com.apple.dt.CommandLineTools.installondemand.in-progress';
42
-
43
- /**
44
- * Check if Xcode Command Line Tools are already installed.
45
- *
46
- * This function uses two methods to verify CLT installation:
47
- * 1. Checks if the xcode-select command reports a valid developer directory
48
- * 2. Verifies that the CLT directory structure exists on disk
49
- *
50
- * Both checks are necessary because:
51
- * - xcode-select -p can report a path even if CLT is partially installed
52
- * - The directory might exist but CLT might not be fully functional
53
- *
54
- * @returns {Promise<boolean>} True if CLT is fully installed and functional, false otherwise
55
- */
56
- async function isCommandLineToolsInstalled() {
57
- // First check: Use xcode-select to verify the developer directory is set
58
- // This is the most reliable way to check if CLT is properly configured
59
- const xcodeSelectResult = await shell.exec('xcode-select -p');
60
-
61
- // If xcode-select returns an error code, CLT is not installed or not configured
62
- if (xcodeSelectResult.code !== 0) {
63
- return false;
64
- }
65
-
66
- const developerPath = xcodeSelectResult.stdout.trim();
67
-
68
- // xcode-select -p returns the developer directory path
69
- // For CLT-only installs: /Library/Developer/CommandLineTools
70
- // For full Xcode: /Applications/Xcode.app/Contents/Developer
71
- // An empty response or error indicates no installation
72
- if (!developerPath) {
73
- return false;
74
- }
75
-
76
- // Second check: Verify the reported path actually exists on disk
77
- // This catches cases where xcode-select has a stale configuration
78
- const pathExists = fs.existsSync(developerPath);
79
- if (!pathExists) {
80
- return false;
81
- }
82
-
83
- // Third check: Verify a core CLT binary exists (clang compiler)
84
- // This ensures CLT is not just partially installed
85
- // Check for clang in both possible locations
86
- const cltClangPath = path.join(CLT_INSTALL_PATH, 'usr', 'bin', 'clang');
87
- const xcodeClangPath = '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang';
88
-
89
- const hasCltClang = fs.existsSync(cltClangPath);
90
- const hasXcodeClang = fs.existsSync(xcodeClangPath);
91
-
92
- return hasCltClang || hasXcodeClang;
93
- }
94
-
95
- /**
96
- * Get the currently installed Xcode or Command Line Tools version.
97
- *
98
- * This function attempts to retrieve version information from xcode-select.
99
- * The output format varies depending on whether CLT or full Xcode is installed.
100
- *
101
- * @returns {Promise<string|null>} The version string if available, null otherwise
102
- */
103
- async function getInstalledVersion() {
104
- // Try xcode-select --version first
105
- const versionResult = await shell.exec('xcode-select --version');
106
- if (versionResult.code === 0 && versionResult.stdout) {
107
- // Output format: "xcode-select version 2397."
108
- const versionMatch = versionResult.stdout.match(/version\s+(\d+)/);
109
- if (versionMatch) {
110
- return `xcode-select ${versionMatch[1]}`;
111
- }
112
- return versionResult.stdout.trim();
113
- }
114
-
115
- // If xcode-select version fails, try checking if full Xcode is installed
116
- const xcodebuildResult = await shell.exec('xcodebuild -version 2>/dev/null');
117
- if (xcodebuildResult.code === 0 && xcodebuildResult.stdout) {
118
- // Output format: "Xcode 26.2\nBuild version 26B104"
119
- const firstLine = xcodebuildResult.stdout.trim().split('\n')[0];
120
- if (firstLine) {
121
- return firstLine;
122
- }
123
- }
124
-
125
- return null;
126
- }
127
-
128
- /**
129
- * Find the Command Line Tools package name from softwareupdate.
130
- *
131
- * This function queries softwareupdate for available updates and extracts
132
- * the specific CLT package name. The package name includes a version number
133
- * that changes with each macOS release, so we need to find it dynamically.
134
- *
135
- * Example package names:
136
- * - "Command Line Tools for Xcode-26.0"
137
- * - "Command Line Tools for Xcode-15.4"
138
- *
139
- * @returns {Promise<string|null>} The full package name if found, null otherwise
140
- */
141
- async function findCLTPackageName() {
142
- // Create the placeholder file that tells macOS to include CLT in the update list
143
- // This is the same technique used by the official Apple documentation
144
- try {
145
- fs.writeFileSync(CLT_PLACEHOLDER_FILE, '');
146
- } catch (error) {
147
- console.log('Warning: Could not create placeholder file. Continuing anyway...');
148
- }
149
-
150
- // Query softwareupdate for the list of available updates
151
- // The -l flag lists available updates without installing them
152
- console.log('Checking for available Command Line Tools...');
153
- const listResult = await shell.exec('softwareupdate -l 2>&1', { timeout: 120000 });
154
-
155
- if (listResult.code !== 0 && !listResult.stdout) {
156
- console.log('Warning: softwareupdate returned an error. Output:', listResult.stderr);
157
- return null;
158
- }
159
-
160
- // Combine stdout and stderr as softwareupdate sometimes writes to stderr
161
- const output = listResult.stdout + '\n' + listResult.stderr;
162
-
163
- // Look for the Command Line Tools package in the output
164
- // The format can vary, so we try multiple patterns
165
- // Pattern 1: "* Label: Command Line Tools for Xcode-XX.X"
166
- // Pattern 2: "Command Line Tools for Xcode-XX.X" (on a single line)
167
- const patterns = [
168
- /\*\s+Label:\s+(Command Line Tools for Xcode-[\d.]+)/,
169
- /^\s*(Command Line Tools for Xcode-[\d.]+)/m,
170
- /(Command Line Tools for Xcode-[\d.]+)/
171
- ];
172
-
173
- for (const pattern of patterns) {
174
- const match = output.match(pattern);
175
- if (match && match[1]) {
176
- return match[1];
177
- }
178
- }
179
-
180
- return null;
181
- }
182
-
183
- /**
184
- * Clean up the placeholder file used for softwareupdate.
185
- *
186
- * This function removes the temporary placeholder file that was created
187
- * to make CLT appear in the softwareupdate list. It should be called
188
- * after installation completes (success or failure) to avoid leaving
189
- * temporary files on the system.
190
- */
191
- function cleanupPlaceholderFile() {
192
- try {
193
- if (fs.existsSync(CLT_PLACEHOLDER_FILE)) {
194
- fs.unlinkSync(CLT_PLACEHOLDER_FILE);
195
- }
196
- } catch (error) {
197
- // Silently ignore cleanup failures - the file is in /tmp and will be
198
- // automatically cleaned up on reboot anyway
199
- }
200
- }
201
-
202
- /**
203
- * Install Xcode Command Line Tools on macOS.
204
- *
205
- * This function installs CLT using the non-interactive softwareupdate method,
206
- * which is the recommended approach for automated installations. It avoids
207
- * the GUI dialog that xcode-select --install would trigger.
208
- *
209
- * Installation process:
210
- * 1. Check if CLT is already installed (idempotency)
211
- * 2. Create a placeholder file to make CLT appear in softwareupdate
212
- * 3. Find the CLT package name from softwareupdate
213
- * 4. Install CLT using sudo softwareupdate -i
214
- * 5. Clean up the placeholder file
215
- * 6. Verify the installation succeeded
216
- *
217
- * Note: This function requires sudo privileges for the actual installation.
218
- * The user will be prompted for their password by the softwareupdate command.
219
- *
220
- * @returns {Promise<void>}
221
- */
222
- async function install_macos() {
223
- console.log('Checking if Xcode Command Line Tools are already installed...');
224
-
225
- // Check if CLT is already installed - this ensures idempotency
226
- const alreadyInstalled = await isCommandLineToolsInstalled();
227
- if (alreadyInstalled) {
228
- const version = await getInstalledVersion();
229
- if (version) {
230
- console.log(`Xcode Command Line Tools are already installed (${version}), skipping...`);
231
- } else {
232
- console.log('Xcode Command Line Tools are already installed, skipping...');
233
- }
234
- return;
235
- }
236
-
237
- console.log('Xcode Command Line Tools are not installed. Starting installation...');
238
- console.log('');
239
- console.log('This will install:');
240
- console.log(' - Compilers (clang, clang++)');
241
- console.log(' - Git version control');
242
- console.log(' - Make and other build tools');
243
- console.log(' - System headers and libraries');
244
- console.log('');
245
- console.log('The installation requires approximately 2.5 GB of disk space.');
246
- console.log('');
247
-
248
- // Find the CLT package name
249
- const packageName = await findCLTPackageName();
250
-
251
- if (!packageName) {
252
- // Clean up placeholder file before exiting
253
- cleanupPlaceholderFile();
254
-
255
- console.log('Could not find Command Line Tools in available software updates.');
256
- console.log('');
257
- console.log('This can happen if:');
258
- console.log(' 1. Command Line Tools are already installed but not detected');
259
- console.log(' 2. Your macOS version does not support the latest CLT');
260
- console.log(' 3. Network issues prevented checking for updates');
261
- console.log('');
262
- console.log('Try running manually:');
263
- console.log(' xcode-select --install');
264
- console.log('');
265
- console.log('Or download directly from:');
266
- console.log(' https://developer.apple.com/download/all/');
267
- return;
268
- }
269
-
270
- console.log(`Found package: ${packageName}`);
271
- console.log('');
272
- console.log('Installing... This may take several minutes depending on your');
273
- console.log('internet connection and disk speed.');
274
- console.log('');
275
- console.log('You may be prompted for your password (sudo is required).');
276
- console.log('');
277
-
278
- // Install CLT using softwareupdate
279
- // The --verbose flag provides progress output
280
- // We use a longer timeout because the download can be slow
281
- const installResult = await shell.exec(
282
- `sudo softwareupdate -i "${packageName}" --verbose`,
283
- { timeout: 600000 } // 10 minute timeout
284
- );
285
-
286
- // Clean up the placeholder file regardless of success/failure
287
- cleanupPlaceholderFile();
288
-
289
- // Check if installation succeeded
290
- if (installResult.code !== 0) {
291
- console.log('');
292
- console.log('Installation encountered an issue.');
293
- console.log('');
294
-
295
- // Check if it actually installed despite the error code
296
- // (softwareupdate sometimes returns non-zero even on success)
297
- const nowInstalled = await isCommandLineToolsInstalled();
298
- if (nowInstalled) {
299
- console.log('However, Command Line Tools appear to be installed successfully.');
300
- const version = await getInstalledVersion();
301
- if (version) {
302
- console.log(`Installed version: ${version}`);
303
- }
304
- console.log('');
305
- console.log('Installation completed successfully.');
306
- return;
307
- }
308
-
309
- console.log('Error output:');
310
- console.log(installResult.stderr || installResult.stdout || 'No error details available');
311
- console.log('');
312
- console.log('Troubleshooting steps:');
313
- console.log(' 1. Try running: xcode-select --install');
314
- console.log(' 2. Ensure you have a stable internet connection');
315
- console.log(' 3. Check available disk space (need ~2.5 GB free)');
316
- console.log(' 4. Download manually from: https://developer.apple.com/download/all/');
317
- return;
318
- }
319
-
320
- // Verify the installation succeeded
321
- const verified = await isCommandLineToolsInstalled();
322
- if (!verified) {
323
- console.log('');
324
- console.log('Installation completed but verification failed.');
325
- console.log('');
326
- console.log('The softwareupdate command finished, but Command Line Tools');
327
- console.log('were not detected in the expected location.');
328
- console.log('');
329
- console.log('Try restarting your terminal and running:');
330
- console.log(' xcode-select -p');
331
- console.log(' clang --version');
332
- return;
333
- }
334
-
335
- // Get and display the installed version
336
- const installedVersion = await getInstalledVersion();
337
- console.log('');
338
- if (installedVersion) {
339
- console.log(`Xcode Command Line Tools installed successfully (${installedVersion}).`);
340
- } else {
341
- console.log('Xcode Command Line Tools installed successfully.');
342
- }
343
- console.log('');
344
- console.log('You can verify the installation by running:');
345
- console.log(' xcode-select -p');
346
- console.log(' clang --version');
347
- console.log(' git --version');
348
- }
349
-
350
- /**
351
- * Handle Xcode CLT installation request on Ubuntu/Debian.
352
- *
353
- * Xcode CLT is an Apple-exclusive product and is NOT available for Ubuntu or Debian.
354
- * This function returns gracefully with a simple informational message.
355
- *
356
- * @returns {Promise<void>}
357
- */
358
- async function install_ubuntu() {
359
- console.log('Xcode CLT is not available for Ubuntu.');
360
- return;
361
- }
362
-
363
- /**
364
- * Handle Xcode CLT installation request on Ubuntu running in WSL.
365
- *
366
- * Xcode CLT is an Apple-exclusive product and cannot run in WSL. WSL runs a Linux
367
- * kernel, not macOS, and cannot run macOS applications.
368
- *
369
- * @returns {Promise<void>}
370
- */
371
- async function install_ubuntu_wsl() {
372
- console.log('Xcode CLT is not available for WSL.');
373
- return;
374
- }
375
-
376
- /**
377
- * Handle Xcode CLT installation request on Raspberry Pi OS.
378
- *
379
- * Xcode CLT is an Apple-exclusive product and is NOT available for Raspberry Pi OS.
380
- * The ARM architecture of Raspberry Pi is not compatible with Xcode CLT, which only
381
- * runs on macOS with Apple Silicon or Intel processors.
382
- *
383
- * @returns {Promise<void>}
384
- */
385
- async function install_raspbian() {
386
- console.log('Xcode CLT is not available for Raspberry Pi OS.');
387
- return;
388
- }
389
-
390
- /**
391
- * Handle Xcode CLT installation request on Amazon Linux/RHEL.
392
- *
393
- * Xcode CLT is an Apple-exclusive product and is NOT available for Amazon Linux
394
- * or RHEL. Apple does not provide Xcode CLT for any Linux distribution.
395
- *
396
- * @returns {Promise<void>}
397
- */
398
- async function install_amazon_linux() {
399
- console.log('Xcode CLT is not available for Amazon Linux.');
400
- return;
401
- }
402
-
403
- /**
404
- * Handle Xcode CLT installation request on Windows.
405
- *
406
- * Xcode CLT is an Apple-exclusive product and is NOT available for Windows.
407
- * Apple does not provide Xcode CLT for Windows, and there is no legitimate way
408
- * to run Xcode CLT on Windows.
409
- *
410
- * @returns {Promise<void>}
411
- */
412
- async function install_windows() {
413
- console.log('Xcode CLT is not available for Windows.');
414
- return;
415
- }
416
-
417
- /**
418
- * Handle Xcode CLT installation request in Git Bash.
419
- *
420
- * Xcode CLT is an Apple-exclusive product and is NOT available for Git Bash on
421
- * Windows. Git Bash provides a Unix-like shell environment on Windows but
422
- * cannot run macOS applications.
423
- *
424
- * @returns {Promise<void>}
425
- */
426
- async function install_gitbash() {
427
- console.log('Xcode CLT is not available for Git Bash.');
428
- return;
429
- }
430
-
431
- /**
432
- * Check if Xcode Command Line Tools are installed on the current system.
433
- * @returns {Promise<boolean>} True if Xcode CLT is installed
434
- */
435
- async function isInstalled() {
436
- const platform = os.detect();
437
- if (platform.type === 'macos') {
438
- return isCommandLineToolsInstalled();
439
- }
440
- return false;
441
- }
442
-
443
- /**
444
- * Check if this installer is supported on the current platform.
445
- * Xcode Command Line Tools are ONLY available on macOS.
446
- * @returns {boolean} True if installation is supported on this platform
447
- */
448
- function isEligible() {
449
- const platform = os.detect();
450
- return platform.type === 'macos';
451
- }
452
-
453
- /**
454
- * Main installation entry point - detects platform and runs appropriate installer.
455
- *
456
- * This function automatically detects the current operating system and invokes
457
- * the corresponding platform-specific installation function. Since Xcode CLT is
458
- * macOS-only, all non-macOS platforms receive a polite informational message.
459
- *
460
- * Supported platforms:
461
- * - macOS: Full Xcode Command Line Tools installation
462
- *
463
- * Unsupported platforms (returns gracefully with message):
464
- * - Ubuntu/Debian
465
- * - Ubuntu on WSL
466
- * - Raspberry Pi OS
467
- * - Amazon Linux/RHEL/Fedora
468
- * - Windows (native)
469
- * - Git Bash
470
- *
471
- * @returns {Promise<void>}
472
- */
473
- async function install() {
474
- const platform = os.detect();
475
-
476
- // Map platform types to their corresponding installer functions
477
- // All non-macOS platforms will receive a "not available" message
478
- const installers = {
479
- 'macos': install_macos,
480
- 'ubuntu': install_ubuntu,
481
- 'debian': install_ubuntu,
482
- 'wsl': install_ubuntu_wsl,
483
- 'raspbian': install_raspbian,
484
- 'amazon_linux': install_amazon_linux,
485
- 'fedora': install_amazon_linux,
486
- 'rhel': install_amazon_linux,
487
- 'windows': install_windows,
488
- 'gitbash': install_gitbash,
489
- };
490
-
491
- const installer = installers[platform.type];
492
-
493
- // Handle unknown platforms gracefully without throwing an error
494
- if (!installer) {
495
- console.log(`Xcode CLT is not available for ${platform.type}.`);
496
- return;
497
- }
498
-
499
- await installer();
500
- }
501
-
502
- module.exports = {
503
- install,
504
- isInstalled,
505
- isEligible,
506
- install_macos,
507
- install_ubuntu,
508
- install_ubuntu_wsl,
509
- install_raspbian,
510
- install_amazon_linux,
511
- install_windows,
512
- install_gitbash,
513
- };
514
-
515
- if (require.main === module) {
516
- install().catch(err => {
517
- console.error(err.message);
518
- process.exit(1);
519
- });
520
- }