@fredlackey/devutils 0.0.18 → 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 -1028
  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 -261
  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,847 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * @fileoverview Install Messenger (via Caprine, the cross-platform Facebook Messenger client).
5
- * @module installs/messenger
6
- *
7
- * Messenger is Meta's instant messaging platform. Since Meta does not provide official
8
- * desktop applications for all platforms, this installer uses Caprine, an open-source,
9
- * privacy-focused Facebook Messenger client that provides a native desktop experience.
10
- *
11
- * Caprine offers additional privacy features not available in the official app:
12
- * - Block read receipts
13
- * - Block typing indicators
14
- * - Link tracking prevention
15
- * - Dark mode support
16
- *
17
- * PLATFORM SUPPORT:
18
- * - macOS: Caprine via Homebrew cask
19
- * - Ubuntu/Debian: Caprine via Snap
20
- * - Raspberry Pi OS: Caprine via Pi-Apps (ARM-compatible build)
21
- * - Amazon Linux: Caprine via AppImage (requires FUSE)
22
- * - Windows: Caprine via winget
23
- * - WSL: Recommends Windows installation or opens web interface
24
- * - Git Bash: Caprine via winget on Windows host
25
- */
26
-
27
- const os = require('../utils/common/os');
28
- const shell = require('../utils/common/shell');
29
- const brew = require('../utils/macos/brew');
30
- const macosApps = require('../utils/macos/apps');
31
- const snap = require('../utils/ubuntu/snap');
32
- const winget = require('../utils/windows/winget');
33
-
34
- /**
35
- * Whether this installer requires a desktop environment to function.
36
- * Messenger (Caprine) is a GUI messaging application.
37
- */
38
- const REQUIRES_DESKTOP = true;
39
-
40
- /**
41
- * The Homebrew cask name for Caprine on macOS.
42
- * This is the official package name in the Homebrew cask repository.
43
- */
44
- const HOMEBREW_CASK_NAME = 'caprine';
45
-
46
- /**
47
- * The Snap package name for Caprine on Ubuntu/Debian.
48
- * This is the official package name in the Snap store.
49
- */
50
- const SNAP_PACKAGE_NAME = 'caprine';
51
-
52
- /**
53
- * The winget package ID for Caprine on Windows.
54
- * Using the full package ID ensures the correct package is installed.
55
- */
56
- const WINGET_PACKAGE_ID = 'Caprine.Caprine';
57
-
58
- /**
59
- * The macOS application bundle name.
60
- * Used to verify installation by checking /Applications folder.
61
- */
62
- const MACOS_APP_NAME = 'Caprine';
63
-
64
- /**
65
- * The path where Caprine is installed by Pi-Apps on Raspberry Pi OS.
66
- * Pi-Apps installs applications to /opt by default.
67
- */
68
- const PIAPPS_CAPRINE_PATH = '/opt/Caprine/caprine';
69
-
70
- /**
71
- * The URL for downloading Caprine AppImage on Amazon Linux.
72
- * Using a specific version for stability; update as needed.
73
- */
74
- const APPIMAGE_VERSION = '2.61.0';
75
- const APPIMAGE_URL = `https://github.com/sindresorhus/caprine/releases/download/v${APPIMAGE_VERSION}/Caprine-${APPIMAGE_VERSION}.AppImage`;
76
-
77
- /**
78
- * Check if Caprine is installed on macOS.
79
- *
80
- * Checks for the Caprine.app bundle in standard application directories
81
- * (/Applications and ~/Applications).
82
- *
83
- * @returns {boolean} True if Caprine is installed, false otherwise
84
- */
85
- function isCaprineInstalledMacOS() {
86
- return macosApps.isAppInstalled(MACOS_APP_NAME);
87
- }
88
-
89
- /**
90
- * Check if Caprine is installed via Snap on Linux.
91
- *
92
- * Uses the snap list command to verify Caprine is in the list of installed snaps.
93
- *
94
- * @returns {Promise<boolean>} True if Caprine is installed via Snap
95
- */
96
- async function isCaprineInstalledSnap() {
97
- return await snap.isSnapInstalled(SNAP_PACKAGE_NAME);
98
- }
99
-
100
- /**
101
- * Check if Caprine is installed via Pi-Apps on Raspberry Pi OS.
102
- *
103
- * Checks for the existence of the Caprine executable in the Pi-Apps
104
- * installation directory (/opt/Caprine/).
105
- *
106
- * @returns {boolean} True if Caprine is installed via Pi-Apps
107
- */
108
- function isCaprineInstalledPiApps() {
109
- const fs = require('fs');
110
- return fs.existsSync(PIAPPS_CAPRINE_PATH);
111
- }
112
-
113
- /**
114
- * Check if Caprine AppImage is installed on Amazon Linux.
115
- *
116
- * Checks for the AppImage file in the user's ~/.local/bin directory.
117
- *
118
- * @returns {boolean} True if Caprine AppImage exists
119
- */
120
- function isCaprineInstalledAppImage() {
121
- const fs = require('fs');
122
- const path = require('path');
123
- const homeDir = os.getHomeDir();
124
- const appImagePath = path.join(homeDir, '.local', 'bin', 'Caprine.AppImage');
125
- return fs.existsSync(appImagePath);
126
- }
127
-
128
- /**
129
- * Check if Caprine is installed on Windows via winget.
130
- *
131
- * Queries winget to check if the Caprine package is in the installed list.
132
- *
133
- * @returns {Promise<boolean>} True if Caprine is installed via winget
134
- */
135
- async function isCaprineInstalledWindows() {
136
- return await winget.isPackageInstalled(WINGET_PACKAGE_ID);
137
- }
138
-
139
- /**
140
- * Install Caprine on macOS using Homebrew.
141
- *
142
- * Prerequisites:
143
- * - macOS 12 (Monterey) or later
144
- * - Homebrew package manager installed
145
- * - Apple Silicon (M1/M2/M3/M4) or Intel processor
146
- *
147
- * The installation uses the Homebrew cask 'caprine' which downloads and installs
148
- * Caprine to /Applications/Caprine.app.
149
- *
150
- * NOTE: On first launch, macOS may display a security warning. Users should
151
- * right-click the app and select "Open" to bypass Gatekeeper, or clear the
152
- * quarantine flag with: xattr -cr /Applications/Caprine.app
153
- *
154
- * @returns {Promise<void>}
155
- * @throws {Error} If Homebrew is not installed or installation fails
156
- */
157
- async function install_macos() {
158
- console.log('Checking if Caprine (Messenger) is already installed...');
159
-
160
- // Check if Caprine is already installed via Homebrew cask
161
- const caskInstalled = await brew.isCaskInstalled(HOMEBREW_CASK_NAME);
162
- if (caskInstalled) {
163
- console.log('Caprine is already installed via Homebrew, skipping installation.');
164
- console.log('');
165
- console.log('To launch Caprine, open it from Applications or run: open -a Caprine');
166
- return;
167
- }
168
-
169
- // Also check if the app exists in Applications (may have been installed manually)
170
- if (isCaprineInstalledMacOS()) {
171
- console.log('Caprine is already installed in Applications, skipping installation.');
172
- console.log('');
173
- console.log('To launch Caprine, open it from Applications or run: open -a Caprine');
174
- return;
175
- }
176
-
177
- // Verify Homebrew is available
178
- if (!brew.isInstalled()) {
179
- throw new Error(
180
- 'Homebrew is not installed. Please install Homebrew first using:\n' +
181
- ' dev install homebrew\n' +
182
- 'Then retry installing Messenger (Caprine).'
183
- );
184
- }
185
-
186
- console.log('Installing Caprine (Messenger) via Homebrew...');
187
-
188
- // Install Caprine cask
189
- const result = await brew.installCask(HOMEBREW_CASK_NAME);
190
-
191
- if (!result.success) {
192
- throw new Error(
193
- `Failed to install Caprine via Homebrew.\n` +
194
- `Output: ${result.output}\n\n` +
195
- `Troubleshooting:\n` +
196
- ` 1. Run 'brew update && brew cleanup' and retry\n` +
197
- ` 2. If you see a quarantine warning, run:\n` +
198
- ` xattr -cr /Applications/Caprine.app\n` +
199
- ` 3. Try manual installation: brew reinstall --cask caprine`
200
- );
201
- }
202
-
203
- console.log('Caprine (Messenger) installed successfully.');
204
- console.log('');
205
- console.log('To get started:');
206
- console.log(' 1. Launch Caprine from Applications or run: open -a Caprine');
207
- console.log(' 2. Log in with your Facebook account');
208
- console.log(' 3. Configure privacy settings in Caprine > Preferences (Cmd + ,)');
209
- console.log('');
210
- console.log('Privacy features available in Caprine:');
211
- console.log(' - Block read receipts (prevents others from seeing when you read messages)');
212
- console.log(' - Block typing indicator (hides when you are typing)');
213
- console.log(' - Dark mode (Cmd + D to toggle)');
214
- }
215
-
216
- /**
217
- * Install Caprine on Ubuntu/Debian using Snap.
218
- *
219
- * Prerequisites:
220
- * - Ubuntu 18.04 or later, or Debian 10 or later (64-bit x86_64)
221
- * - snapd service installed and running (pre-installed on Ubuntu 16.04+)
222
- * - sudo privileges
223
- *
224
- * Snap handles all dependencies automatically and provides automatic updates.
225
- *
226
- * NOTE: After installation, users may need to log out and log back in, or
227
- * restart their terminal, for the application to appear in the application menu.
228
- *
229
- * @returns {Promise<void>}
230
- * @throws {Error} If Snap is not available or installation fails
231
- */
232
- async function install_ubuntu() {
233
- console.log('Checking if Caprine (Messenger) is already installed...');
234
-
235
- // Check if Caprine is already installed via Snap
236
- const isInstalled = await isCaprineInstalledSnap();
237
- if (isInstalled) {
238
- console.log('Caprine is already installed via Snap, skipping installation.');
239
- console.log('');
240
- console.log('To launch Caprine, run: caprine &');
241
- console.log('Or find "Caprine" in your application menu under Internet.');
242
- return;
243
- }
244
-
245
- // Verify Snap is available
246
- if (!snap.isInstalled()) {
247
- throw new Error(
248
- 'Snap package manager is not installed.\n\n' +
249
- 'Install snapd first using:\n' +
250
- ' sudo apt-get update && sudo apt-get install -y snapd\n\n' +
251
- 'Then restart your terminal and retry installing Messenger (Caprine).'
252
- );
253
- }
254
-
255
- console.log('Installing Caprine (Messenger) via Snap...');
256
-
257
- // Install Caprine snap
258
- const result = await snap.install(SNAP_PACKAGE_NAME);
259
-
260
- if (!result.success) {
261
- throw new Error(
262
- `Failed to install Caprine via Snap.\n` +
263
- `Output: ${result.output}\n\n` +
264
- `Troubleshooting:\n` +
265
- ` 1. Ensure snapd is running: sudo systemctl status snapd\n` +
266
- ` 2. Try manual installation: sudo snap install caprine\n` +
267
- ` 3. If you see architecture errors, note that Snap only supports amd64 (x86_64)`
268
- );
269
- }
270
-
271
- console.log('Caprine (Messenger) installed successfully.');
272
- console.log('');
273
- console.log('To get started:');
274
- console.log(' 1. Launch Caprine: caprine &');
275
- console.log(' Or find "Caprine" in your application menu under Internet');
276
- console.log(' 2. Log in with your Facebook account');
277
- console.log(' 3. Configure privacy settings in File > Preferences');
278
- console.log('');
279
- console.log('NOTE: You may need to log out and log back in for the app');
280
- console.log(' to appear in your application menu.');
281
- console.log('');
282
- console.log('To enable notifications, run:');
283
- console.log(' snap connect caprine:desktop');
284
- console.log(' snap connect caprine:desktop-legacy');
285
- }
286
-
287
- /**
288
- * Install Caprine on Raspberry Pi OS using Pi-Apps.
289
- *
290
- * Prerequisites:
291
- * - Raspberry Pi OS (64-bit recommended) - Bookworm or Bullseye
292
- * - Raspberry Pi 4 or later with 2GB+ RAM (4GB recommended)
293
- * - sudo privileges
294
- * - Desktop environment configured
295
- *
296
- * The Snap version of Caprine only supports amd64 (x86_64) architecture and
297
- * will not work on Raspberry Pi. Pi-Apps provides ARM-compatible builds.
298
- *
299
- * NOTE: Electron apps like Caprine may be resource-intensive on Raspberry Pi.
300
- * Close other applications if you experience slow performance.
301
- *
302
- * @returns {Promise<void>}
303
- * @throws {Error} If Pi-Apps installation fails
304
- */
305
- async function install_raspbian() {
306
- console.log('Checking if Caprine (Messenger) is already installed...');
307
-
308
- // Check if Caprine is already installed via Pi-Apps
309
- if (isCaprineInstalledPiApps()) {
310
- console.log('Caprine is already installed via Pi-Apps, skipping installation.');
311
- console.log('');
312
- console.log('To launch Caprine, run: /opt/Caprine/caprine &');
313
- console.log('Or find "Caprine" in your application menu under Internet.');
314
- return;
315
- }
316
-
317
- // Check architecture and provide guidance
318
- const archResult = await shell.exec('uname -m');
319
- const arch = archResult.stdout.trim();
320
- console.log(`Detected architecture: ${arch}`);
321
-
322
- if (arch !== 'aarch64' && arch !== 'armv7l') {
323
- throw new Error(
324
- `Unsupported architecture: ${arch}\n` +
325
- 'Caprine installation via Pi-Apps requires ARM architecture (aarch64 or armv7l).'
326
- );
327
- }
328
-
329
- // Check if Pi-Apps is installed
330
- const fs = require('fs');
331
- const path = require('path');
332
- const homeDir = os.getHomeDir();
333
- const piAppsPath = path.join(homeDir, 'pi-apps', 'manage');
334
- const piAppsInstalled = fs.existsSync(piAppsPath);
335
-
336
- if (!piAppsInstalled) {
337
- console.log('Pi-Apps is not installed. Installing Pi-Apps first...');
338
- console.log('');
339
-
340
- // Install Pi-Apps
341
- const piAppsInstallResult = await shell.exec(
342
- 'wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash'
343
- );
344
-
345
- if (piAppsInstallResult.code !== 0) {
346
- throw new Error(
347
- `Failed to install Pi-Apps.\n` +
348
- `Output: ${piAppsInstallResult.stderr}\n\n` +
349
- `Troubleshooting:\n` +
350
- ` 1. Check your internet connection\n` +
351
- ` 2. Ensure git is installed: sudo apt-get install -y git\n` +
352
- ` 3. Try manual installation:\n` +
353
- ` wget -qO- https://raw.githubusercontent.com/Botspot/pi-apps/master/install | bash`
354
- );
355
- }
356
-
357
- console.log('Pi-Apps installed successfully.');
358
- }
359
-
360
- console.log('Installing Caprine (Messenger) via Pi-Apps...');
361
- console.log('This may take several minutes on Raspberry Pi...');
362
-
363
- // Install Caprine via Pi-Apps CLI
364
- const installResult = await shell.exec(
365
- `${path.join(homeDir, 'pi-apps', 'manage')} install Caprine`
366
- );
367
-
368
- if (installResult.code !== 0) {
369
- throw new Error(
370
- `Failed to install Caprine via Pi-Apps.\n` +
371
- `Output: ${installResult.stderr}\n\n` +
372
- `Troubleshooting:\n` +
373
- ` 1. Try running Pi-Apps graphically from the start menu\n` +
374
- ` 2. Navigate to Internet > Communication > Caprine\n` +
375
- ` 3. Check Pi-Apps logs in ~/pi-apps/logs/`
376
- );
377
- }
378
-
379
- // Verify installation
380
- if (!isCaprineInstalledPiApps()) {
381
- throw new Error(
382
- 'Installation appeared to complete but Caprine was not found at /opt/Caprine/caprine.\n\n' +
383
- 'Please try installing Caprine manually through the Pi-Apps GUI.'
384
- );
385
- }
386
-
387
- console.log('Caprine (Messenger) installed successfully.');
388
- console.log('');
389
- console.log('To get started:');
390
- console.log(' 1. Launch Caprine: /opt/Caprine/caprine &');
391
- console.log(' Or find "Caprine" in your application menu under Internet');
392
- console.log(' 2. Log in with your Facebook account');
393
- console.log('');
394
- console.log('Performance tips for Raspberry Pi:');
395
- console.log(' - Close other applications to free up memory');
396
- console.log(' - If graphics issues occur, try: /opt/Caprine/caprine --disable-gpu &');
397
- console.log(' - Ensure you have at least 2GB RAM (4GB recommended)');
398
- }
399
-
400
- /**
401
- * Install Caprine on Amazon Linux using AppImage.
402
- *
403
- * Prerequisites:
404
- * - Amazon Linux 2023 (AL2023) or Amazon Linux 2 (AL2)
405
- * - Desktop environment installed (GNOME, MATE, or similar)
406
- * - FUSE installed (required for AppImage)
407
- * - sudo privileges
408
- *
409
- * Amazon Linux is typically used as a server OS. If you need a graphical
410
- * Messenger client, ensure you have a desktop environment installed first.
411
- *
412
- * The AppImage is downloaded to ~/.local/bin/ and made executable.
413
- *
414
- * @returns {Promise<void>}
415
- * @throws {Error} If installation fails
416
- */
417
- async function install_amazon_linux() {
418
- console.log('Checking if Caprine (Messenger) is already installed...');
419
-
420
- // Check if Caprine AppImage is already installed
421
- if (isCaprineInstalledAppImage()) {
422
- console.log('Caprine AppImage is already installed, skipping installation.');
423
- console.log('');
424
- console.log('To launch Caprine, run: ~/.local/bin/Caprine.AppImage &');
425
- return;
426
- }
427
-
428
- // Detect package manager (dnf for AL2023, yum for AL2)
429
- const hasDnf = shell.commandExists('dnf');
430
- const hasYum = shell.commandExists('yum');
431
- const packageManager = hasDnf ? 'dnf' : (hasYum ? 'yum' : null);
432
-
433
- if (!packageManager) {
434
- throw new Error(
435
- 'Neither dnf nor yum package manager found.\n' +
436
- 'This installer supports Amazon Linux 2023 (dnf) and Amazon Linux 2 (yum).'
437
- );
438
- }
439
-
440
- // Check for and install FUSE (required for AppImage)
441
- console.log('Checking for FUSE (required for AppImage)...');
442
-
443
- const fuseCheckResult = await shell.exec('which fusermount');
444
- if (fuseCheckResult.code !== 0) {
445
- console.log('Installing FUSE...');
446
-
447
- const fuseInstallResult = await shell.exec(
448
- `sudo ${packageManager} install -y fuse fuse-libs`
449
- );
450
-
451
- if (fuseInstallResult.code !== 0) {
452
- console.log('Warning: Could not install FUSE. AppImage may not run correctly.');
453
- console.log('You can install FUSE manually: sudo ' + packageManager + ' install -y fuse fuse-libs');
454
- }
455
- }
456
-
457
- // Create ~/.local/bin directory if it doesn't exist
458
- const fs = require('fs');
459
- const path = require('path');
460
- const homeDir = os.getHomeDir();
461
- const binDir = path.join(homeDir, '.local', 'bin');
462
-
463
- if (!fs.existsSync(binDir)) {
464
- console.log(`Creating directory: ${binDir}`);
465
- fs.mkdirSync(binDir, { recursive: true });
466
- }
467
-
468
- const appImagePath = path.join(binDir, 'Caprine.AppImage');
469
-
470
- console.log('Downloading Caprine AppImage...');
471
- console.log(`Source: ${APPIMAGE_URL}`);
472
-
473
- // Download the AppImage
474
- const downloadResult = await shell.exec(
475
- `curl -L -o "${appImagePath}" "${APPIMAGE_URL}"`
476
- );
477
-
478
- if (downloadResult.code !== 0) {
479
- throw new Error(
480
- `Failed to download Caprine AppImage.\n` +
481
- `Output: ${downloadResult.stderr}\n\n` +
482
- `Troubleshooting:\n` +
483
- ` 1. Check your internet connection\n` +
484
- ` 2. Try downloading manually:\n` +
485
- ` curl -L -o ~/.local/bin/Caprine.AppImage "${APPIMAGE_URL}"`
486
- );
487
- }
488
-
489
- // Make the AppImage executable
490
- console.log('Making AppImage executable...');
491
- const chmodResult = await shell.exec(`chmod +x "${appImagePath}"`);
492
-
493
- if (chmodResult.code !== 0) {
494
- throw new Error(
495
- `Failed to make AppImage executable.\n` +
496
- `Run: chmod +x ~/.local/bin/Caprine.AppImage`
497
- );
498
- }
499
-
500
- // Verify the file exists
501
- if (!fs.existsSync(appImagePath)) {
502
- throw new Error(
503
- 'Installation appeared to complete but AppImage was not found.\n' +
504
- `Expected location: ${appImagePath}`
505
- );
506
- }
507
-
508
- // Check if ~/.local/bin is in PATH
509
- const pathEnv = process.env.PATH || '';
510
- const binDirInPath = pathEnv.includes(binDir);
511
-
512
- console.log('Caprine (Messenger) installed successfully.');
513
- console.log('');
514
- console.log(`Location: ${appImagePath}`);
515
- console.log('');
516
- console.log('To launch Caprine, run: ~/.local/bin/Caprine.AppImage &');
517
- console.log('');
518
-
519
- if (!binDirInPath) {
520
- console.log('NOTE: ~/.local/bin is not in your PATH.');
521
- console.log('Add it to your PATH by adding this line to ~/.bashrc:');
522
- console.log(' export PATH="$HOME/.local/bin:$PATH"');
523
- console.log('');
524
- console.log('Then run: source ~/.bashrc');
525
- console.log('');
526
- }
527
-
528
- console.log('If the AppImage fails to run, you may need to extract it:');
529
- console.log(' ~/.local/bin/Caprine.AppImage --appimage-extract');
530
- console.log(' ~/squashfs-root/caprine &');
531
- }
532
-
533
- /**
534
- * Install Caprine on Windows using winget.
535
- *
536
- * Prerequisites:
537
- * - Windows 10 version 1809 or later, or Windows 11
538
- * - winget package manager (pre-installed on Windows 10 1809+ and Windows 11)
539
- * - Administrator privileges recommended
540
- *
541
- * Meta has deprecated the traditional Windows desktop Messenger app in favor of
542
- * a Progressive Web App (PWA). Caprine provides a native desktop experience
543
- * with additional privacy features.
544
- *
545
- * @returns {Promise<void>}
546
- * @throws {Error} If winget is not available or installation fails
547
- */
548
- async function install_windows() {
549
- console.log('Checking if Caprine (Messenger) is already installed...');
550
-
551
- // Check if Caprine is already installed via winget
552
- const isInstalled = await isCaprineInstalledWindows();
553
- if (isInstalled) {
554
- console.log('Caprine is already installed, skipping installation.');
555
- console.log('');
556
- console.log('To launch Caprine, search for "Caprine" in the Start Menu.');
557
- return;
558
- }
559
-
560
- // Verify winget is available
561
- if (!winget.isInstalled()) {
562
- throw new Error(
563
- 'winget is not installed or not available.\n\n' +
564
- 'winget should be pre-installed on Windows 10 1809+ and Windows 11.\n' +
565
- 'If missing, install "App Installer" from the Microsoft Store:\n' +
566
- ' Start > Microsoft Store > Search "App Installer"\n\n' +
567
- 'After installation, open a new terminal window and retry.'
568
- );
569
- }
570
-
571
- console.log('Installing Caprine (Messenger) via winget...');
572
-
573
- // Install Caprine
574
- const result = await winget.install(WINGET_PACKAGE_ID);
575
-
576
- if (!result.success) {
577
- throw new Error(
578
- `Failed to install Caprine via winget.\n` +
579
- `Output: ${result.output}\n\n` +
580
- `Troubleshooting:\n` +
581
- ` 1. Try running as Administrator\n` +
582
- ` 2. Update winget sources: winget source update\n` +
583
- ` 3. Try manual installation:\n` +
584
- ` winget install --id Caprine.Caprine --silent --accept-package-agreements --accept-source-agreements`
585
- );
586
- }
587
-
588
- console.log('Caprine (Messenger) installed successfully.');
589
- console.log('');
590
- console.log('To get started:');
591
- console.log(' 1. Search for "Caprine" in the Start Menu and launch it');
592
- console.log(' 2. Log in with your Facebook account');
593
- console.log(' 3. Configure privacy settings in Help > Preferences');
594
- console.log('');
595
- console.log('Privacy features available in Caprine:');
596
- console.log(' - Block read receipts (Ctrl + ,)');
597
- console.log(' - Block typing indicator');
598
- console.log(' - Dark mode (Ctrl + D to toggle)');
599
- }
600
-
601
- /**
602
- * Handle Messenger installation on Ubuntu running in WSL.
603
- *
604
- * WSL (Windows Subsystem for Linux) requires special handling for GUI applications.
605
- * This function recommends using the Windows installation of Caprine or the web
606
- * interface, as GUI apps in WSL require WSLg (Windows 11) or an X server.
607
- *
608
- * For WSL 2 with WSLg on Windows 11, the Linux Snap version can be installed,
609
- * but this requires systemd to be enabled in WSL.
610
- *
611
- * @returns {Promise<void>}
612
- */
613
- async function install_ubuntu_wsl() {
614
- console.log('Detected Ubuntu running in WSL (Windows Subsystem for Linux).');
615
- console.log('');
616
- console.log('For the best experience with Messenger in WSL, you have two options:');
617
- console.log('');
618
- console.log('OPTION 1: Install Caprine on Windows (Recommended)');
619
- console.log(' From PowerShell or Command Prompt, run:');
620
- console.log(' winget install --id Caprine.Caprine --silent --accept-package-agreements --accept-source-agreements');
621
- console.log('');
622
- console.log('OPTION 2: Use the web interface');
623
- console.log(' Open Messenger in your Windows browser by running:');
624
- console.log(' wslview https://messenger.com');
625
- console.log('');
626
-
627
- // Check if wslview is available
628
- const wslviewCheck = shell.commandExists('wslview');
629
-
630
- if (wslviewCheck) {
631
- console.log('Opening Messenger in your Windows browser...');
632
- await shell.exec('wslview https://messenger.com');
633
- } else {
634
- console.log('To install wslu utilities (for wslview command):');
635
- console.log(' sudo apt-get update && sudo apt-get install -y wslu');
636
- console.log('');
637
- console.log('Then you can open Messenger with: wslview https://messenger.com');
638
- }
639
-
640
- console.log('');
641
- console.log('NOTE: If you want to run Linux GUI apps in WSL (Windows 11 with WSLg):');
642
- console.log(' 1. Enable systemd in /etc/wsl.conf:');
643
- console.log(' [boot]');
644
- console.log(' systemd=true');
645
- console.log(' 2. Restart WSL: wsl --shutdown (from PowerShell)');
646
- console.log(' 3. Install Caprine via Snap: sudo snap install caprine');
647
- }
648
-
649
- /**
650
- * Install Caprine from Git Bash on Windows.
651
- *
652
- * Git Bash runs within the Windows environment, so this function installs
653
- * Caprine on the Windows host using winget via the winget.exe command.
654
- *
655
- * Prerequisites:
656
- * - Windows 10 version 1809 or later, or Windows 11
657
- * - Git Bash installed (comes with Git for Windows)
658
- * - winget available on Windows
659
- *
660
- * @returns {Promise<void>}
661
- * @throws {Error} If installation fails
662
- */
663
- async function install_gitbash() {
664
- console.log('Detected Git Bash on Windows.');
665
- console.log('Installing Caprine (Messenger) on the Windows host...');
666
- console.log('');
667
-
668
- // Check if Caprine is already installed
669
- const checkResult = await shell.exec(
670
- 'winget.exe list --id Caprine.Caprine'
671
- );
672
-
673
- if (checkResult.code === 0 && checkResult.stdout.includes('Caprine')) {
674
- console.log('Caprine is already installed, skipping installation.');
675
- console.log('');
676
- console.log('To launch Caprine, search for "Caprine" in the Start Menu.');
677
- console.log('Or from Git Bash: start "" "Caprine"');
678
- return;
679
- }
680
-
681
- // Check if winget is available
682
- const wingetCheck = await shell.exec('winget.exe --version');
683
- if (wingetCheck.code !== 0) {
684
- throw new Error(
685
- 'winget.exe is not available from Git Bash.\n\n' +
686
- 'Ensure winget is installed on Windows:\n' +
687
- ' 1. Open PowerShell as Administrator\n' +
688
- ' 2. If winget is missing, install "App Installer" from Microsoft Store\n\n' +
689
- 'Then retry the installation from Git Bash.'
690
- );
691
- }
692
-
693
- console.log('Installing Caprine via winget...');
694
-
695
- const installResult = await shell.exec(
696
- 'winget.exe install --id Caprine.Caprine --silent --accept-package-agreements --accept-source-agreements'
697
- );
698
-
699
- if (installResult.code !== 0) {
700
- throw new Error(
701
- `Failed to install Caprine.\n` +
702
- `Output: ${installResult.stdout || installResult.stderr}\n\n` +
703
- `Troubleshooting:\n` +
704
- ` 1. Try running Git Bash as Administrator\n` +
705
- ` 2. Install from PowerShell instead:\n` +
706
- ` winget install --id Caprine.Caprine --silent --accept-package-agreements --accept-source-agreements`
707
- );
708
- }
709
-
710
- console.log('Caprine (Messenger) installed successfully.');
711
- console.log('');
712
- console.log('To get started:');
713
- console.log(' 1. Search for "Caprine" in the Windows Start Menu');
714
- console.log(' 2. Or from Git Bash: start "" "Caprine"');
715
- console.log(' 3. Log in with your Facebook account');
716
- console.log('');
717
- console.log('To open the web interface instead:');
718
- console.log(' start https://messenger.com');
719
- }
720
-
721
- /**
722
- * Check if Messenger (Caprine) is installed on the current platform.
723
- *
724
- * On macOS, checks if Caprine cask is installed via Homebrew.
725
- * On Windows, checks if Caprine is installed via winget.
726
- * On Ubuntu/Debian, checks if Caprine is installed via Snap.
727
- * On Raspberry Pi, checks if Caprine is installed via Pi-Apps.
728
- * On Amazon Linux, checks for AppImage.
729
- *
730
- * @returns {Promise<boolean>} True if installed, false otherwise
731
- */
732
- async function isInstalled() {
733
- const platform = os.detect();
734
-
735
- if (platform.type === 'macos') {
736
- return brew.isCaskInstalled(HOMEBREW_CASK_NAME);
737
- }
738
-
739
- if (platform.type === 'windows' || platform.type === 'gitbash') {
740
- return winget.isPackageInstalled(WINGET_PACKAGE_ID);
741
- }
742
-
743
- if (platform.type === 'ubuntu' || platform.type === 'debian') {
744
- return snap.isSnapInstalled(SNAP_PACKAGE_NAME);
745
- }
746
-
747
- if (platform.type === 'raspbian') {
748
- return isCaprineInstalledPiApps();
749
- }
750
-
751
- if (platform.type === 'amazon_linux' || platform.type === 'rhel' || platform.type === 'fedora') {
752
- return isCaprineInstalledAppImage();
753
- }
754
-
755
- // WSL: Check for Snap installation
756
- if (platform.type === 'wsl') {
757
- return snap.isSnapInstalled(SNAP_PACKAGE_NAME);
758
- }
759
-
760
- return false;
761
- }
762
-
763
- /**
764
- * Check if this installer is supported on the current platform.
765
- * Messenger (Caprine) is supported on all major platforms.
766
- * @returns {boolean} True if installation is supported on this platform
767
- */
768
- function isEligible() {
769
- const platform = os.detect();
770
- const supportedPlatforms = ['macos', 'ubuntu', 'debian', 'wsl', 'raspbian', 'amazon_linux', 'rhel', 'fedora', 'windows', 'gitbash'];
771
- if (!supportedPlatforms.includes(platform.type)) {
772
- return false;
773
- }
774
- if (REQUIRES_DESKTOP && !os.isDesktopAvailable()) {
775
- return false;
776
- }
777
- return true;
778
- }
779
-
780
- /**
781
- * Main installation entry point.
782
- *
783
- * Detects the current platform and runs the appropriate installer function.
784
- * Handles platform-specific mappings to ensure all supported platforms
785
- * have appropriate installation logic.
786
- *
787
- * Supported platforms:
788
- * - macOS: Caprine via Homebrew cask
789
- * - Ubuntu/Debian: Caprine via Snap
790
- * - Raspberry Pi OS: Caprine via Pi-Apps
791
- * - Amazon Linux/RHEL: Caprine via AppImage
792
- * - Windows: Caprine via winget
793
- * - WSL (Ubuntu): Recommends Windows installation or web interface
794
- * - Git Bash: Caprine via winget on Windows host
795
- *
796
- * @returns {Promise<void>}
797
- */
798
- async function install() {
799
- const platform = os.detect();
800
-
801
- // Map platform types to their installer functions
802
- // This mapping handles aliases (e.g., debian maps to ubuntu for Snap installation)
803
- const installers = {
804
- 'macos': install_macos,
805
- 'ubuntu': install_ubuntu,
806
- 'debian': install_ubuntu,
807
- 'wsl': install_ubuntu_wsl,
808
- 'raspbian': install_raspbian,
809
- 'amazon_linux': install_amazon_linux,
810
- 'rhel': install_amazon_linux,
811
- 'fedora': install_amazon_linux,
812
- 'windows': install_windows,
813
- 'gitbash': install_gitbash
814
- };
815
-
816
- const installer = installers[platform.type];
817
-
818
- if (!installer) {
819
- console.log(`Messenger (Caprine) is not available for ${platform.type}.`);
820
- return;
821
- }
822
-
823
- await installer();
824
- }
825
-
826
- // Export all functions for use as a module and for testing
827
- module.exports = {
828
- REQUIRES_DESKTOP,
829
- install,
830
- isInstalled,
831
- isEligible,
832
- install_macos,
833
- install_ubuntu,
834
- install_ubuntu_wsl,
835
- install_raspbian,
836
- install_amazon_linux,
837
- install_windows,
838
- install_gitbash
839
- };
840
-
841
- // Allow direct execution: node messenger.js
842
- if (require.main === module) {
843
- install().catch(err => {
844
- console.error(err.message);
845
- process.exit(1);
846
- });
847
- }