@fredlackey/devutils 0.0.18 → 0.1.0

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 (447) hide show
  1. package/README.md +214 -141
  2. package/package.json +8 -83
  3. package/src/api/loader.js +229 -0
  4. package/src/api/registry.json +62 -0
  5. package/src/cli.js +293 -60
  6. package/src/commands/ai/index.js +16 -0
  7. package/src/commands/ai/launch.js +112 -0
  8. package/src/commands/ai/list.js +54 -0
  9. package/src/commands/ai/resume.js +70 -0
  10. package/src/commands/ai/sessions.js +121 -0
  11. package/src/commands/ai/set.js +131 -0
  12. package/src/commands/ai/show.js +74 -0
  13. package/src/commands/ai/tools.js +46 -0
  14. package/src/commands/alias/add.js +93 -0
  15. package/src/commands/alias/helpers.js +107 -0
  16. package/src/commands/alias/index.js +14 -0
  17. package/src/commands/alias/list.js +55 -0
  18. package/src/commands/alias/remove.js +62 -0
  19. package/src/commands/alias/sync.js +109 -0
  20. package/src/commands/api/disable.js +73 -0
  21. package/src/commands/api/enable.js +148 -0
  22. package/src/commands/api/index.js +15 -0
  23. package/src/commands/api/list.js +66 -0
  24. package/src/commands/api/update.js +87 -0
  25. package/src/commands/auth/index.js +15 -0
  26. package/src/commands/auth/list.js +49 -0
  27. package/src/commands/auth/login.js +384 -0
  28. package/src/commands/auth/logout.js +111 -0
  29. package/src/commands/auth/refresh.js +184 -0
  30. package/src/commands/auth/services.js +169 -0
  31. package/src/commands/auth/status.js +104 -0
  32. package/src/commands/config/export.js +224 -0
  33. package/src/commands/config/get.js +52 -0
  34. package/src/commands/config/import.js +308 -0
  35. package/src/commands/config/index.js +17 -0
  36. package/src/commands/config/init.js +143 -0
  37. package/src/commands/config/reset.js +57 -0
  38. package/src/commands/config/set.js +93 -0
  39. package/src/commands/config/show.js +35 -0
  40. package/src/commands/help.js +338 -0
  41. package/src/commands/identity/add.js +133 -0
  42. package/src/commands/identity/index.js +17 -0
  43. package/src/commands/identity/link.js +76 -0
  44. package/src/commands/identity/list.js +48 -0
  45. package/src/commands/identity/remove.js +72 -0
  46. package/src/commands/identity/show.js +65 -0
  47. package/src/commands/identity/sync.js +172 -0
  48. package/src/commands/identity/unlink.js +57 -0
  49. package/src/commands/ignore/add.js +165 -0
  50. package/src/commands/ignore/index.js +14 -0
  51. package/src/commands/ignore/list.js +89 -0
  52. package/src/commands/ignore/markers.js +43 -0
  53. package/src/commands/ignore/remove.js +164 -0
  54. package/src/commands/ignore/show.js +169 -0
  55. package/src/commands/machine/detect.js +122 -0
  56. package/src/commands/machine/index.js +14 -0
  57. package/src/commands/machine/list.js +74 -0
  58. package/src/commands/machine/set.js +106 -0
  59. package/src/commands/machine/show.js +35 -0
  60. package/src/commands/schema.js +152 -0
  61. package/src/commands/search/collections.js +134 -0
  62. package/src/commands/search/get.js +71 -0
  63. package/src/commands/search/index-cmd.js +54 -0
  64. package/src/commands/search/index.js +21 -0
  65. package/src/commands/search/keyword.js +60 -0
  66. package/src/commands/search/qmd.js +70 -0
  67. package/src/commands/search/query.js +64 -0
  68. package/src/commands/search/semantic.js +62 -0
  69. package/src/commands/search/status.js +46 -0
  70. package/src/commands/status.js +224 -171
  71. package/src/commands/tools/check.js +79 -0
  72. package/src/commands/tools/index.js +14 -0
  73. package/src/commands/tools/install.js +110 -0
  74. package/src/commands/tools/list.js +91 -0
  75. package/src/commands/tools/search.js +60 -0
  76. package/src/commands/update.js +83 -112
  77. package/src/commands/util/add.js +151 -0
  78. package/src/commands/util/index.js +15 -0
  79. package/src/commands/util/list.js +97 -0
  80. package/src/commands/util/remove.js +76 -0
  81. package/src/commands/util/run.js +79 -0
  82. package/src/commands/util/show.js +67 -0
  83. package/src/commands/version.js +21 -88
  84. package/src/installers/_template.js +104 -0
  85. package/src/installers/git.js +150 -0
  86. package/src/installers/homebrew.js +190 -0
  87. package/src/installers/node.js +223 -0
  88. package/src/installers/registry.json +29 -0
  89. package/src/lib/config.js +125 -0
  90. package/src/lib/detect.js +74 -0
  91. package/src/lib/errors.js +114 -0
  92. package/src/lib/github.js +315 -0
  93. package/src/lib/installer.js +225 -0
  94. package/src/lib/output.js +239 -0
  95. package/src/lib/platform.js +112 -0
  96. package/src/lib/platforms/amazon-linux.js +41 -0
  97. package/src/lib/platforms/gitbash.js +46 -0
  98. package/src/lib/platforms/macos.js +45 -0
  99. package/src/lib/platforms/raspbian.js +41 -0
  100. package/src/lib/platforms/ubuntu.js +39 -0
  101. package/src/lib/platforms/windows.js +45 -0
  102. package/src/lib/prompt.js +161 -0
  103. package/src/lib/schema.js +211 -0
  104. package/src/lib/shell.js +75 -0
  105. package/src/patterns/gitignore/claude-code.txt +25 -0
  106. package/src/patterns/gitignore/docker.txt +15 -0
  107. package/src/patterns/gitignore/go.txt +24 -0
  108. package/src/patterns/gitignore/java.txt +38 -0
  109. package/src/patterns/gitignore/jetbrains.txt +26 -0
  110. package/src/patterns/gitignore/linux.txt +18 -0
  111. package/src/patterns/gitignore/macos.txt +27 -0
  112. package/src/patterns/gitignore/node.txt +51 -0
  113. package/src/patterns/gitignore/python.txt +55 -0
  114. package/src/patterns/gitignore/rust.txt +14 -0
  115. package/src/patterns/gitignore/terraform.txt +30 -0
  116. package/src/patterns/gitignore/vscode.txt +15 -0
  117. package/src/patterns/gitignore/windows.txt +25 -0
  118. package/src/utils/clone/index.js +165 -0
  119. package/src/utils/git-push/index.js +230 -0
  120. package/src/utils/git-status/index.js +116 -0
  121. package/src/utils/git-status/unix.sh +75 -0
  122. package/src/utils/registry.json +41 -0
  123. package/bin/dev.js +0 -16
  124. package/files/README.md +0 -0
  125. package/files/claude/.claude/commands/setup-context.md +0 -3
  126. package/files/monorepos/_archive/README.md +0 -36
  127. package/files/monorepos/_legacy/README.md +0 -36
  128. package/files/monorepos/ai-docs/README.md +0 -33
  129. package/files/monorepos/apps/README.md +0 -24
  130. package/files/monorepos/docs/README.md +0 -40
  131. package/files/monorepos/packages/README.md +0 -25
  132. package/files/monorepos/research/README.md +0 -29
  133. package/files/monorepos/scripts/README.md +0 -24
  134. package/src/commands/README.md +0 -41
  135. package/src/commands/configure.js +0 -199
  136. package/src/commands/identity.js +0 -1630
  137. package/src/commands/ignore.js +0 -247
  138. package/src/commands/install.js +0 -526
  139. package/src/commands/setup.js +0 -246
  140. package/src/completion.js +0 -284
  141. package/src/constants.js +0 -45
  142. package/src/ignore/claude-code.txt +0 -10
  143. package/src/ignore/docker.txt +0 -18
  144. package/src/ignore/linux.txt +0 -23
  145. package/src/ignore/macos.txt +0 -36
  146. package/src/ignore/node.txt +0 -55
  147. package/src/ignore/terraform.txt +0 -37
  148. package/src/ignore/vscode.txt +0 -18
  149. package/src/ignore/windows.txt +0 -35
  150. package/src/index.js +0 -0
  151. package/src/installs/README.md +0 -399
  152. package/src/installs/adobe-creative-cloud.js +0 -546
  153. package/src/installs/adobe-creative-cloud.md +0 -605
  154. package/src/installs/appcleaner.js +0 -321
  155. package/src/installs/appcleaner.md +0 -699
  156. package/src/installs/apt-transport-https.js +0 -390
  157. package/src/installs/apt-transport-https.md +0 -678
  158. package/src/installs/atomicparsley.js +0 -642
  159. package/src/installs/atomicparsley.md +0 -795
  160. package/src/installs/aws-cli.js +0 -797
  161. package/src/installs/aws-cli.md +0 -727
  162. package/src/installs/balena-etcher.js +0 -710
  163. package/src/installs/balena-etcher.md +0 -761
  164. package/src/installs/bambu-studio.js +0 -1143
  165. package/src/installs/bambu-studio.md +0 -780
  166. package/src/installs/bash-completion.js +0 -575
  167. package/src/installs/bash-completion.md +0 -833
  168. package/src/installs/bash.js +0 -417
  169. package/src/installs/bash.md +0 -993
  170. package/src/installs/beyond-compare.js +0 -603
  171. package/src/installs/beyond-compare.md +0 -813
  172. package/src/installs/brave-browser.js +0 -968
  173. package/src/installs/brave-browser.md +0 -650
  174. package/src/installs/build-essential.js +0 -529
  175. package/src/installs/build-essential.md +0 -977
  176. package/src/installs/ca-certificates.js +0 -618
  177. package/src/installs/ca-certificates.md +0 -937
  178. package/src/installs/caffeine.js +0 -508
  179. package/src/installs/caffeine.md +0 -839
  180. package/src/installs/camtasia.js +0 -596
  181. package/src/installs/camtasia.md +0 -762
  182. package/src/installs/chatgpt.js +0 -476
  183. package/src/installs/chatgpt.md +0 -814
  184. package/src/installs/chocolatey.js +0 -456
  185. package/src/installs/chocolatey.md +0 -661
  186. package/src/installs/chrome-canary.js +0 -419
  187. package/src/installs/chrome-canary.md +0 -641
  188. package/src/installs/chromium.js +0 -667
  189. package/src/installs/chromium.md +0 -838
  190. package/src/installs/claude-code.js +0 -576
  191. package/src/installs/claude-code.md +0 -1173
  192. package/src/installs/cloudflare-warp.js +0 -900
  193. package/src/installs/cloudflare-warp.md +0 -1047
  194. package/src/installs/comet-browser.js +0 -588
  195. package/src/installs/comet-browser.md +0 -731
  196. package/src/installs/curl.js +0 -379
  197. package/src/installs/curl.md +0 -714
  198. package/src/installs/cursor.js +0 -579
  199. package/src/installs/cursor.md +0 -970
  200. package/src/installs/dbeaver.js +0 -924
  201. package/src/installs/dbeaver.md +0 -939
  202. package/src/installs/dbschema.js +0 -692
  203. package/src/installs/dbschema.md +0 -925
  204. package/src/installs/dependencies.md +0 -453
  205. package/src/installs/development-tools.js +0 -600
  206. package/src/installs/development-tools.md +0 -977
  207. package/src/installs/docker.js +0 -1029
  208. package/src/installs/docker.md +0 -1109
  209. package/src/installs/drawio.js +0 -1019
  210. package/src/installs/drawio.md +0 -795
  211. package/src/installs/elmedia-player.js +0 -347
  212. package/src/installs/elmedia-player.md +0 -556
  213. package/src/installs/ffmpeg.js +0 -889
  214. package/src/installs/ffmpeg.md +0 -852
  215. package/src/installs/file.js +0 -464
  216. package/src/installs/file.md +0 -987
  217. package/src/installs/gemini-cli.js +0 -811
  218. package/src/installs/gemini-cli.md +0 -1153
  219. package/src/installs/git.js +0 -400
  220. package/src/installs/git.md +0 -907
  221. package/src/installs/gitego.js +0 -949
  222. package/src/installs/gitego.md +0 -1172
  223. package/src/installs/go.js +0 -931
  224. package/src/installs/go.md +0 -958
  225. package/src/installs/google-antigravity.js +0 -913
  226. package/src/installs/google-antigravity.md +0 -1075
  227. package/src/installs/google-chrome.js +0 -833
  228. package/src/installs/google-chrome.md +0 -862
  229. package/src/installs/gpg.js +0 -480
  230. package/src/installs/gpg.md +0 -1056
  231. package/src/installs/homebrew.js +0 -1028
  232. package/src/installs/homebrew.md +0 -988
  233. package/src/installs/imageoptim.js +0 -968
  234. package/src/installs/imageoptim.md +0 -1119
  235. package/src/installs/installers.json +0 -4032
  236. package/src/installs/installers.json.tmp +0 -3953
  237. package/src/installs/jq.js +0 -400
  238. package/src/installs/jq.md +0 -809
  239. package/src/installs/keyboard-maestro.js +0 -719
  240. package/src/installs/keyboard-maestro.md +0 -825
  241. package/src/installs/kiro.js +0 -864
  242. package/src/installs/kiro.md +0 -1015
  243. package/src/installs/latex.js +0 -789
  244. package/src/installs/latex.md +0 -1095
  245. package/src/installs/lftp.js +0 -356
  246. package/src/installs/lftp.md +0 -907
  247. package/src/installs/lsb-release.js +0 -346
  248. package/src/installs/lsb-release.md +0 -814
  249. package/src/installs/messenger.js +0 -847
  250. package/src/installs/messenger.md +0 -900
  251. package/src/installs/microsoft-office.js +0 -568
  252. package/src/installs/microsoft-office.md +0 -760
  253. package/src/installs/microsoft-teams.js +0 -801
  254. package/src/installs/microsoft-teams.md +0 -886
  255. package/src/installs/moom.js +0 -326
  256. package/src/installs/moom.md +0 -570
  257. package/src/installs/node.js +0 -904
  258. package/src/installs/node.md +0 -1153
  259. package/src/installs/nordpass.js +0 -716
  260. package/src/installs/nordpass.md +0 -921
  261. package/src/installs/nordvpn.js +0 -892
  262. package/src/installs/nordvpn.md +0 -1052
  263. package/src/installs/nvm.js +0 -995
  264. package/src/installs/nvm.md +0 -1057
  265. package/src/installs/ohmyzsh.js +0 -529
  266. package/src/installs/ohmyzsh.md +0 -1094
  267. package/src/installs/openssh.js +0 -804
  268. package/src/installs/openssh.md +0 -1056
  269. package/src/installs/pandoc.js +0 -662
  270. package/src/installs/pandoc.md +0 -1036
  271. package/src/installs/parallels-desktop.js +0 -431
  272. package/src/installs/parallels-desktop.md +0 -446
  273. package/src/installs/pinentry.js +0 -510
  274. package/src/installs/pinentry.md +0 -1142
  275. package/src/installs/pngyu.js +0 -869
  276. package/src/installs/pngyu.md +0 -896
  277. package/src/installs/postman.js +0 -799
  278. package/src/installs/postman.md +0 -940
  279. package/src/installs/procps.js +0 -425
  280. package/src/installs/procps.md +0 -851
  281. package/src/installs/safari-tech-preview.js +0 -374
  282. package/src/installs/safari-tech-preview.md +0 -533
  283. package/src/installs/sfnt2woff.js +0 -658
  284. package/src/installs/sfnt2woff.md +0 -795
  285. package/src/installs/shellcheck.js +0 -481
  286. package/src/installs/shellcheck.md +0 -1005
  287. package/src/installs/slack.js +0 -741
  288. package/src/installs/slack.md +0 -865
  289. package/src/installs/snagit.js +0 -585
  290. package/src/installs/snagit.md +0 -844
  291. package/src/installs/software-properties-common.js +0 -372
  292. package/src/installs/software-properties-common.md +0 -805
  293. package/src/installs/spotify.js +0 -877
  294. package/src/installs/spotify.md +0 -901
  295. package/src/installs/studio-3t.js +0 -823
  296. package/src/installs/studio-3t.md +0 -918
  297. package/src/installs/sublime-text.js +0 -804
  298. package/src/installs/sublime-text.md +0 -914
  299. package/src/installs/superwhisper.js +0 -706
  300. package/src/installs/superwhisper.md +0 -630
  301. package/src/installs/tailscale.js +0 -745
  302. package/src/installs/tailscale.md +0 -1100
  303. package/src/installs/tar.js +0 -389
  304. package/src/installs/tar.md +0 -946
  305. package/src/installs/termius.js +0 -798
  306. package/src/installs/termius.md +0 -844
  307. package/src/installs/terraform.js +0 -779
  308. package/src/installs/terraform.md +0 -899
  309. package/src/installs/tfenv.js +0 -778
  310. package/src/installs/tfenv.md +0 -1091
  311. package/src/installs/tidal.js +0 -771
  312. package/src/installs/tidal.md +0 -864
  313. package/src/installs/tmux.js +0 -346
  314. package/src/installs/tmux.md +0 -1030
  315. package/src/installs/tree.js +0 -411
  316. package/src/installs/tree.md +0 -833
  317. package/src/installs/unzip.js +0 -460
  318. package/src/installs/unzip.md +0 -879
  319. package/src/installs/vim.js +0 -421
  320. package/src/installs/vim.md +0 -1040
  321. package/src/installs/vlc.js +0 -821
  322. package/src/installs/vlc.md +0 -927
  323. package/src/installs/vscode.js +0 -843
  324. package/src/installs/vscode.md +0 -1002
  325. package/src/installs/wget.js +0 -420
  326. package/src/installs/wget.md +0 -791
  327. package/src/installs/whatsapp.js +0 -729
  328. package/src/installs/whatsapp.md +0 -854
  329. package/src/installs/winpty.js +0 -352
  330. package/src/installs/winpty.md +0 -620
  331. package/src/installs/woff2.js +0 -553
  332. package/src/installs/woff2.md +0 -977
  333. package/src/installs/wsl.js +0 -572
  334. package/src/installs/wsl.md +0 -699
  335. package/src/installs/xcode-clt.js +0 -520
  336. package/src/installs/xcode-clt.md +0 -351
  337. package/src/installs/xcode.js +0 -560
  338. package/src/installs/xcode.md +0 -573
  339. package/src/installs/yarn.js +0 -824
  340. package/src/installs/yarn.md +0 -1074
  341. package/src/installs/yq.js +0 -654
  342. package/src/installs/yq.md +0 -944
  343. package/src/installs/yt-dlp.js +0 -701
  344. package/src/installs/yt-dlp.md +0 -946
  345. package/src/installs/yum-utils.js +0 -297
  346. package/src/installs/yum-utils.md +0 -648
  347. package/src/installs/zoom.js +0 -759
  348. package/src/installs/zoom.md +0 -884
  349. package/src/installs/zsh.js +0 -455
  350. package/src/installs/zsh.md +0 -1008
  351. package/src/scripts/README.md +0 -617
  352. package/src/scripts/STATUS.md +0 -208
  353. package/src/scripts/afk.js +0 -411
  354. package/src/scripts/backup-all.js +0 -746
  355. package/src/scripts/backup-source.js +0 -727
  356. package/src/scripts/brewd.js +0 -389
  357. package/src/scripts/brewi.js +0 -520
  358. package/src/scripts/brewr.js +0 -527
  359. package/src/scripts/brews.js +0 -477
  360. package/src/scripts/brewu.js +0 -504
  361. package/src/scripts/c.js +0 -201
  362. package/src/scripts/ccurl.js +0 -341
  363. package/src/scripts/certbot-crontab-init.js +0 -504
  364. package/src/scripts/certbot-init.js +0 -657
  365. package/src/scripts/ch.js +0 -355
  366. package/src/scripts/claude-danger.js +0 -268
  367. package/src/scripts/clean-dev.js +0 -435
  368. package/src/scripts/clear-dns-cache.js +0 -541
  369. package/src/scripts/clone.js +0 -435
  370. package/src/scripts/code-all.js +0 -437
  371. package/src/scripts/count-files.js +0 -211
  372. package/src/scripts/count-folders.js +0 -211
  373. package/src/scripts/count.js +0 -264
  374. package/src/scripts/d.js +0 -219
  375. package/src/scripts/datauri.js +0 -389
  376. package/src/scripts/delete-files.js +0 -380
  377. package/src/scripts/docker-clean.js +0 -426
  378. package/src/scripts/dp.js +0 -442
  379. package/src/scripts/e.js +0 -390
  380. package/src/scripts/empty-trash.js +0 -513
  381. package/src/scripts/evm.js +0 -444
  382. package/src/scripts/fetch-github-repos.js +0 -456
  383. package/src/scripts/get-channel.js +0 -345
  384. package/src/scripts/get-course.js +0 -399
  385. package/src/scripts/get-dependencies.js +0 -306
  386. package/src/scripts/get-folder.js +0 -799
  387. package/src/scripts/get-tunes.js +0 -426
  388. package/src/scripts/get-video.js +0 -367
  389. package/src/scripts/git-backup.js +0 -577
  390. package/src/scripts/git-clone.js +0 -493
  391. package/src/scripts/git-pup.js +0 -319
  392. package/src/scripts/git-push.js +0 -396
  393. package/src/scripts/h.js +0 -622
  394. package/src/scripts/hide-desktop-icons.js +0 -499
  395. package/src/scripts/hide-hidden-files.js +0 -538
  396. package/src/scripts/install-dependencies-from.js +0 -456
  397. package/src/scripts/ips.js +0 -663
  398. package/src/scripts/iso.js +0 -370
  399. package/src/scripts/killni.js +0 -577
  400. package/src/scripts/ll.js +0 -467
  401. package/src/scripts/local-ip.js +0 -325
  402. package/src/scripts/m.js +0 -524
  403. package/src/scripts/map.js +0 -309
  404. package/src/scripts/mkd.js +0 -351
  405. package/src/scripts/ncu-update-all.js +0 -457
  406. package/src/scripts/nginx-init.js +0 -718
  407. package/src/scripts/npmi.js +0 -382
  408. package/src/scripts/o.js +0 -511
  409. package/src/scripts/org-by-date.js +0 -338
  410. package/src/scripts/p.js +0 -224
  411. package/src/scripts/packages.js +0 -330
  412. package/src/scripts/path.js +0 -225
  413. package/src/scripts/ports.js +0 -597
  414. package/src/scripts/q.js +0 -305
  415. package/src/scripts/refresh-files.js +0 -394
  416. package/src/scripts/remove-smaller-files.js +0 -516
  417. package/src/scripts/rename-files-with-date.js +0 -533
  418. package/src/scripts/resize-image.js +0 -539
  419. package/src/scripts/rm-safe.js +0 -669
  420. package/src/scripts/s.js +0 -540
  421. package/src/scripts/set-git-public.js +0 -365
  422. package/src/scripts/show-desktop-icons.js +0 -475
  423. package/src/scripts/show-hidden-files.js +0 -472
  424. package/src/scripts/tpa.js +0 -280
  425. package/src/scripts/tpo.js +0 -280
  426. package/src/scripts/u.js +0 -505
  427. package/src/scripts/vpush.js +0 -437
  428. package/src/scripts/y.js +0 -283
  429. package/src/utils/README.md +0 -95
  430. package/src/utils/common/apps.js +0 -143
  431. package/src/utils/common/display.js +0 -157
  432. package/src/utils/common/network.js +0 -185
  433. package/src/utils/common/os.js +0 -294
  434. package/src/utils/common/package-manager.js +0 -301
  435. package/src/utils/common/privileges.js +0 -138
  436. package/src/utils/common/shell.js +0 -261
  437. package/src/utils/macos/apps.js +0 -228
  438. package/src/utils/macos/brew.js +0 -315
  439. package/src/utils/ubuntu/apt.js +0 -307
  440. package/src/utils/ubuntu/desktop.js +0 -292
  441. package/src/utils/ubuntu/snap.js +0 -344
  442. package/src/utils/ubuntu/systemd.js +0 -286
  443. package/src/utils/windows/choco.js +0 -465
  444. package/src/utils/windows/env.js +0 -246
  445. package/src/utils/windows/registry.js +0 -269
  446. package/src/utils/windows/shell.js +0 -240
  447. 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
- }