machineconfig 3.7__py3-none-any.whl → 7.69__py3-none-any.whl

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.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

Files changed (465) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +7 -21
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +128 -0
  34. machineconfig/jobs/{python_custom_installers → installer/custom}/hx.py +84 -18
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +86 -0
  36. machineconfig/jobs/installer/custom_dev/brave.py +82 -0
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +59 -0
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +63 -0
  40. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/cursor.py +7 -7
  41. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  42. machineconfig/jobs/installer/custom_dev/espanso.py +117 -0
  43. machineconfig/jobs/installer/custom_dev/goes.py +68 -0
  44. machineconfig/jobs/installer/custom_dev/lvim.py +89 -0
  45. machineconfig/jobs/installer/custom_dev/nerdfont.py +111 -0
  46. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +149 -0
  47. machineconfig/jobs/installer/custom_dev/redis.py +88 -0
  48. machineconfig/jobs/installer/custom_dev/sysabc.py +145 -0
  49. machineconfig/jobs/installer/custom_dev/wezterm.py +92 -0
  50. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/winget.py +2 -3
  51. machineconfig/jobs/installer/installer_data.json +3440 -0
  52. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/brave.sh +4 -14
  53. machineconfig/jobs/{python_custom_installers/scripts/linux/warp-cli.sh → installer/linux_scripts/cloudflare_warp_cli.sh} +5 -17
  54. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/docker.sh +6 -18
  55. machineconfig/jobs/installer/linux_scripts/docker_start.sh +37 -0
  56. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/edge.sh +3 -11
  57. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  58. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/nerdfont.sh +5 -17
  59. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  60. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  61. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  62. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/redis.sh +6 -17
  63. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/vscode.sh +5 -17
  64. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/wezterm.sh +4 -12
  65. machineconfig/jobs/installer/package_groups.py +255 -0
  66. machineconfig/logger.py +0 -1
  67. machineconfig/profile/backup.toml +49 -0
  68. machineconfig/profile/bash_shell_profiles.md +11 -0
  69. machineconfig/profile/create_helper.py +74 -0
  70. machineconfig/profile/create_links.py +288 -0
  71. machineconfig/profile/create_links_export.py +100 -0
  72. machineconfig/profile/create_shell_profile.py +136 -0
  73. machineconfig/profile/mapper.toml +258 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/{mcinit.py → initai.py} +3 -38
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +114 -0
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +88 -22
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/gemini/settings.json +1 -1
  89. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  90. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  91. machineconfig/scripts/python/cloud.py +29 -0
  92. machineconfig/scripts/python/croshell.py +129 -198
  93. machineconfig/scripts/python/define.py +31 -0
  94. machineconfig/scripts/python/devops.py +45 -131
  95. machineconfig/scripts/python/devops_navigator.py +6 -0
  96. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  97. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  98. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  99. machineconfig/scripts/python/fire_jobs.py +166 -235
  100. machineconfig/scripts/python/ftpx.py +164 -100
  101. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  102. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  109. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +52 -39
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +13 -18
  117. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +81 -0
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -1
  121. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +32 -20
  122. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  123. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  124. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  125. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  126. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  127. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  129. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  130. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  131. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  132. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  133. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  134. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  136. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  137. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  138. machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -2
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -89
  140. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  142. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  143. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  145. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  154. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  155. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  156. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  157. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  158. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  159. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  160. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  161. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  162. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  163. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  164. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  165. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  166. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  167. machineconfig/scripts/python/interactive.py +187 -0
  168. machineconfig/scripts/python/mcfg_entry.py +63 -0
  169. machineconfig/scripts/python/msearch.py +40 -0
  170. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  171. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  172. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  173. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  174. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  175. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  176. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  177. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  178. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  179. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -51
  180. machineconfig/scripts/python/nw/wsl_windows_transfer.py +67 -0
  181. machineconfig/scripts/python/sessions.py +167 -0
  182. machineconfig/scripts/python/terminal.py +127 -0
  183. machineconfig/scripts/python/utils.py +66 -0
  184. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  185. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  186. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  187. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  188. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  189. machineconfig/settings/broot/br.sh +0 -4
  190. machineconfig/settings/broot/conf.toml +1 -1
  191. machineconfig/settings/helix/config.toml +16 -0
  192. machineconfig/settings/helix/languages.toml +13 -4
  193. machineconfig/settings/helix/yazi-picker.sh +12 -0
  194. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  195. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  196. machineconfig/settings/lf/linux/lfrc +10 -12
  197. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  198. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  199. machineconfig/settings/lf/windows/lfrc +18 -38
  200. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  201. machineconfig/settings/linters/.ruff.toml +1 -1
  202. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  203. machineconfig/settings/marimo/marimo.toml +80 -0
  204. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  205. machineconfig/settings/pistol/pistol.conf +1 -1
  206. machineconfig/settings/shells/bash/init.sh +55 -31
  207. machineconfig/settings/shells/nushell/config.nu +1 -34
  208. machineconfig/settings/shells/nushell/init.nu +127 -0
  209. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  210. machineconfig/settings/shells/starship/starship.toml +16 -0
  211. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  212. machineconfig/settings/shells/wt/settings.json +32 -17
  213. machineconfig/settings/shells/zsh/init.sh +89 -0
  214. machineconfig/settings/svim/linux/init.toml +0 -4
  215. machineconfig/settings/svim/windows/init.toml +0 -3
  216. machineconfig/settings/yazi/init.lua +57 -0
  217. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  218. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  219. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  220. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  221. machineconfig/settings/yazi/yazi.toml +14 -1
  222. machineconfig/setup_linux/__init__.py +10 -0
  223. machineconfig/setup_linux/apps_desktop.sh +89 -0
  224. machineconfig/setup_linux/apps_gui.sh +64 -0
  225. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  226. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  227. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  228. machineconfig/setup_linux/uv.sh +15 -0
  229. machineconfig/setup_linux/web_shortcuts/interactive.sh +28 -203
  230. machineconfig/setup_mac/__init__.py +16 -0
  231. machineconfig/setup_mac/apps_gui.sh +248 -0
  232. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  233. machineconfig/setup_mac/uv.sh +36 -0
  234. machineconfig/setup_windows/__init__.py +8 -0
  235. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  236. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  237. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  239. machineconfig/setup_windows/uv.ps1 +17 -0
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -189
  241. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  242. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  243. machineconfig/utils/accessories.py +52 -12
  244. machineconfig/utils/cloud/onedrive/README.md +139 -0
  245. machineconfig/utils/code.py +140 -93
  246. machineconfig/utils/files/art/fat_croco.txt +10 -0
  247. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  248. machineconfig/utils/files/art/happy_croco.txt +22 -0
  249. machineconfig/utils/files/art/water_croco.txt +11 -0
  250. machineconfig/utils/files/ascii_art.py +118 -0
  251. machineconfig/utils/files/dbms.py +257 -0
  252. machineconfig/utils/files/headers.py +68 -0
  253. machineconfig/utils/files/ouch/decompress.py +45 -0
  254. machineconfig/utils/files/read.py +95 -0
  255. machineconfig/utils/installer_utils/github_release_bulk.py +188 -0
  256. machineconfig/utils/installer_utils/install_from_url.py +180 -0
  257. machineconfig/utils/installer_utils/installer_class.py +239 -316
  258. machineconfig/utils/installer_utils/installer_cli.py +186 -0
  259. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +90 -5
  260. machineconfig/utils/installer_utils/installer_runner.py +191 -0
  261. machineconfig/utils/io.py +77 -24
  262. machineconfig/utils/links.py +309 -100
  263. machineconfig/utils/meta.py +255 -0
  264. machineconfig/utils/notifications.py +1 -1
  265. machineconfig/utils/options.py +19 -47
  266. machineconfig/utils/path_extended.py +111 -121
  267. machineconfig/utils/path_helper.py +75 -22
  268. machineconfig/utils/procs.py +50 -74
  269. machineconfig/utils/scheduler.py +94 -97
  270. machineconfig/utils/scheduling.py +0 -3
  271. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  272. machineconfig/utils/schemas/installer/installer_types.py +28 -6
  273. machineconfig/utils/schemas/layouts/layout_types.py +34 -1
  274. machineconfig/utils/source_of_truth.py +3 -6
  275. machineconfig/utils/ssh.py +742 -254
  276. machineconfig/utils/ssh_utils/utils.py +0 -0
  277. machineconfig/utils/terminal.py +3 -140
  278. machineconfig/utils/tst.py +20 -0
  279. machineconfig/utils/upgrade_packages.py +109 -28
  280. machineconfig/utils/ve.py +13 -5
  281. machineconfig-7.69.dist-info/METADATA +124 -0
  282. machineconfig-7.69.dist-info/RECORD +454 -0
  283. machineconfig-7.69.dist-info/entry_points.txt +15 -0
  284. machineconfig/cluster/templates/cli_click.py +0 -102
  285. machineconfig/cluster/templates/cli_gooey.py +0 -115
  286. machineconfig/cluster/templates/utils.py +0 -51
  287. machineconfig/jobs/linux/msc/cli_agents.sh +0 -32
  288. machineconfig/jobs/python/create_bootable_media.py +0 -16
  289. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  290. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  291. machineconfig/jobs/python/tasks.py +0 -3
  292. machineconfig/jobs/python/vscode/api.py +0 -48
  293. machineconfig/jobs/python/vscode/link_ve.py +0 -63
  294. machineconfig/jobs/python/vscode/select_interpreter.py +0 -87
  295. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  296. machineconfig/jobs/python_custom_installers/archive/ngrok.py +0 -63
  297. machineconfig/jobs/python_custom_installers/dev/aider.py +0 -37
  298. machineconfig/jobs/python_custom_installers/dev/alacritty.py +0 -65
  299. machineconfig/jobs/python_custom_installers/dev/brave.py +0 -71
  300. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +0 -50
  301. machineconfig/jobs/python_custom_installers/dev/code.py +0 -51
  302. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -78
  303. machineconfig/jobs/python_custom_installers/dev/espanso.py +0 -90
  304. machineconfig/jobs/python_custom_installers/dev/goes.py +0 -55
  305. machineconfig/jobs/python_custom_installers/dev/lvim.py +0 -77
  306. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +0 -68
  307. machineconfig/jobs/python_custom_installers/dev/redis.py +0 -65
  308. machineconfig/jobs/python_custom_installers/dev/reverse_proxy.md +0 -31
  309. machineconfig/jobs/python_custom_installers/dev/wezterm.py +0 -70
  310. machineconfig/jobs/python_custom_installers/docker.py +0 -74
  311. machineconfig/jobs/python_custom_installers/gh.py +0 -97
  312. machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +0 -45
  313. machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +0 -49
  314. machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +0 -85
  315. machineconfig/jobs/python_custom_installers/warp-cli.py +0 -71
  316. machineconfig/jobs/python_generic_installers/config.json +0 -603
  317. machineconfig/jobs/python_generic_installers/config.json.bak +0 -414
  318. machineconfig/jobs/python_generic_installers/dev/config.archive.json +0 -18
  319. machineconfig/jobs/python_generic_installers/dev/config.json +0 -825
  320. machineconfig/jobs/python_generic_installers/dev/config.json.bak +0 -565
  321. machineconfig/jobs/python_linux_installers/archive/config.json +0 -18
  322. machineconfig/jobs/python_linux_installers/archive/config.json.bak +0 -10
  323. machineconfig/jobs/python_linux_installers/config.json +0 -145
  324. machineconfig/jobs/python_linux_installers/config.json.bak +0 -110
  325. machineconfig/jobs/python_linux_installers/dev/config.json +0 -276
  326. machineconfig/jobs/python_linux_installers/dev/config.json.bak +0 -206
  327. machineconfig/jobs/python_windows_installers/archive/file.json +0 -11
  328. machineconfig/jobs/python_windows_installers/config.json +0 -82
  329. machineconfig/jobs/python_windows_installers/config.json.bak +0 -56
  330. machineconfig/jobs/python_windows_installers/dev/config.json +0 -4
  331. machineconfig/jobs/python_windows_installers/dev/config.json.bak +0 -3
  332. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  333. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  334. machineconfig/jobs/windows/startup_file.cmd +0 -2
  335. machineconfig/profile/create.py +0 -169
  336. machineconfig/profile/shell.py +0 -176
  337. machineconfig/scripts/cloud/init.sh +0 -119
  338. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  339. machineconfig/scripts/linux/cloud_copy +0 -2
  340. machineconfig/scripts/linux/cloud_mount +0 -2
  341. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  342. machineconfig/scripts/linux/cloud_sync +0 -2
  343. machineconfig/scripts/linux/croshell +0 -3
  344. machineconfig/scripts/linux/devops +0 -2
  345. machineconfig/scripts/linux/fire +0 -2
  346. machineconfig/scripts/linux/fire_agents +0 -2
  347. machineconfig/scripts/linux/ftpx +0 -2
  348. machineconfig/scripts/linux/fzf2g +0 -21
  349. machineconfig/scripts/linux/fzffg +0 -25
  350. machineconfig/scripts/linux/gh_models +0 -2
  351. machineconfig/scripts/linux/kill_process +0 -2
  352. machineconfig/scripts/linux/mcinit +0 -2
  353. machineconfig/scripts/linux/programs +0 -21
  354. machineconfig/scripts/linux/repos +0 -2
  355. machineconfig/scripts/linux/scheduler +0 -2
  356. machineconfig/scripts/linux/share_smb +0 -1
  357. machineconfig/scripts/linux/start_slidev +0 -2
  358. machineconfig/scripts/linux/start_terminals +0 -3
  359. machineconfig/scripts/linux/warp-cli.sh +0 -122
  360. machineconfig/scripts/linux/wifi_conn +0 -2
  361. machineconfig/scripts/linux/z_ls +0 -104
  362. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  363. machineconfig/scripts/python/archive/im2text.py +0 -34
  364. machineconfig/scripts/python/archive/tmate_conn.py +0 -41
  365. machineconfig/scripts/python/archive/tmate_start.py +0 -44
  366. machineconfig/scripts/python/cloud_repo_sync.py +0 -192
  367. machineconfig/scripts/python/cloud_sync.py +0 -85
  368. machineconfig/scripts/python/devops_devapps_install.py +0 -202
  369. machineconfig/scripts/python/devops_update_repos.py +0 -180
  370. machineconfig/scripts/python/dotfile.py +0 -52
  371. machineconfig/scripts/python/fire_agents.py +0 -176
  372. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  373. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  374. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -84
  375. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -66
  376. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  377. machineconfig/scripts/python/gh_models.py +0 -104
  378. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  379. machineconfig/scripts/python/repos.py +0 -160
  380. machineconfig/scripts/python/snapshot.py +0 -25
  381. machineconfig/scripts/python/start_terminals.py +0 -121
  382. machineconfig/scripts/python/wsl_windows_transfer.py +0 -72
  383. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  384. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  385. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  386. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  387. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  388. machineconfig/scripts/windows/croshell.ps1 +0 -1
  389. machineconfig/scripts/windows/devops.ps1 +0 -1
  390. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  391. machineconfig/scripts/windows/fire.ps1 +0 -1
  392. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  393. machineconfig/scripts/windows/gpt.ps1 +0 -1
  394. machineconfig/scripts/windows/grep.ps1 +0 -2
  395. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  396. machineconfig/scripts/windows/mcinit.ps1 +0 -1
  397. machineconfig/scripts/windows/nano.ps1 +0 -3
  398. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  399. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  400. machineconfig/scripts/windows/repos.ps1 +0 -1
  401. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  402. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  403. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  404. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  405. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  406. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  407. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  408. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  409. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  410. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  411. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  412. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  413. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  414. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  415. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  416. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  417. machineconfig/setup_windows/wt_and_pwsh/install_nerd_fonts.py +0 -100
  418. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  419. machineconfig/utils/installer.py +0 -255
  420. machineconfig-3.7.dist-info/METADATA +0 -165
  421. machineconfig-3.7.dist-info/RECORD +0 -432
  422. machineconfig-3.7.dist-info/entry_points.txt +0 -18
  423. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  424. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  425. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  426. machineconfig/jobs/{python → installer}/__init__.py +0 -0
  427. machineconfig/jobs/{python_custom_installers → installer/custom_dev}/__init__.py +0 -0
  428. machineconfig/{setup_windows/wt_and_pwsh → jobs/installer/powershell_scripts}/install_fonts.ps1 +0 -0
  429. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  430. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  431. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  432. machineconfig/{jobs/python_generic_installers → scripts/python/helpers_agents}/__init__.py +0 -0
  433. machineconfig/{jobs/python_linux_installers → scripts/python/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  434. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  435. machineconfig/{jobs/python_linux_installers/dev → scripts/python/helpers_cloud}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  437. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  438. /machineconfig/{jobs/python_windows_installers → scripts/python/helpers_croshell}/__init__.py +0 -0
  439. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  440. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  441. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  442. /machineconfig/{jobs/python_windows_installers/archive → scripts/python/helpers_devops}/__init__.py +0 -0
  443. /machineconfig/{jobs/python_windows_installers/dev → scripts/python/helpers_devops/themes}/__init__.py +0 -0
  444. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  445. /machineconfig/scripts/python/{helpers → helpers_fire_command}/__init__.py +0 -0
  446. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  447. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  448. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  449. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  450. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  451. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_sessions/__init__.py} +0 -0
  452. /machineconfig/scripts/{windows/share_nfs.ps1 → python/nw/__init__.py} +0 -0
  453. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  454. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  455. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  456. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  457. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  458. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  459. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  460. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  461. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  462. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  463. /machineconfig/{settings/yazi/keymap.toml → utils/files/ouch/__init__.py} +0 -0
  464. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/WHEEL +0 -0
  465. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,137 @@
1
+ import typer
2
+ # import platform
3
+ # import sys
4
+ from typing import Annotated
5
+
6
+
7
+ def share_file_receive(code_args: Annotated[list[str], typer.Argument(help="Receive code or relay command. Examples: '7121-donor-olympic-bicycle' or '--relay 10.17.62.206:443 7121-donor-olympic-bicycle'")],
8
+ ) -> None:
9
+ """Receive a file using croc with relay server.
10
+ Usage examples:
11
+ devops network receive 7121-donor-olympic-bicycle
12
+ devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle
13
+ devops network receive -- croc --relay 10.17.62.206:443 7121-donor-olympic-bicycle
14
+ """
15
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
16
+ install_if_missing(which="croc")
17
+ import platform
18
+ import sys
19
+
20
+ is_windows = platform.system() == "Windows"
21
+
22
+ # If no args passed via typer, try to get them from sys.argv directly
23
+ # This handles the case where -- was used and arguments weren't parsed by typer
24
+ if not code_args or (len(code_args) == 1 and code_args[0] in ['--relay', 'croc']):
25
+ # Find the index of 'rx' or 'receive' in sys.argv and get everything after it
26
+ try:
27
+ for i, arg in enumerate(sys.argv):
28
+ if arg in ['rx', 'receive', 'r'] and i + 1 < len(sys.argv):
29
+ code_args = sys.argv[i + 1:]
30
+ break
31
+ except Exception:
32
+ pass
33
+
34
+ # Join all arguments
35
+ input_str = " ".join(code_args)
36
+ tokens = input_str.split()
37
+
38
+ # Parse input to extract relay server and secret code
39
+ relay_server: str | None = None
40
+ secret_code: str | None = None
41
+
42
+ # Remove 'croc' and 'export' from tokens if present
43
+ tokens = [t for t in tokens if t not in ['croc', 'export']]
44
+
45
+ # Look for --relay flag and capture next token
46
+ relay_idx = -1
47
+ for i, token in enumerate(tokens):
48
+ if token == '--relay' and i + 1 < len(tokens):
49
+ relay_server = tokens[i + 1]
50
+ relay_idx = i
51
+ break
52
+
53
+ # Look for CROC_SECRET= prefix in any token
54
+ for token in tokens:
55
+ if token.startswith('CROC_SECRET='):
56
+ secret_code = token.split('=', 1)[1].strip('"').strip("'")
57
+ break
58
+
59
+ # If no secret code found yet, look for tokens with dashes (typical pattern: number-word-word-word)
60
+ # Skip relay server and relay flag
61
+ if not secret_code:
62
+ for i, token in enumerate(tokens):
63
+ if '-' in token and not token.startswith('-') and token != relay_server:
64
+ if relay_idx >= 0 and (i == relay_idx or i == relay_idx + 1):
65
+ continue # Skip relay server parts
66
+ secret_code = token
67
+ break
68
+
69
+ if not secret_code and not relay_server:
70
+ typer.echo(f"❌ Error: Could not parse croc receive code from input: {input_str}", err=True)
71
+ typer.echo("Usage:", err=True)
72
+ typer.echo(" devops network receive 7121-donor-olympic-bicycle", err=True)
73
+ typer.echo(" devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle", err=True)
74
+ raise typer.Exit(code=1)
75
+
76
+ # Build the appropriate script for current OS
77
+ if is_windows:
78
+ # Windows PowerShell format: croc --relay server:port secret-code --yes
79
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
80
+ code_arg = f"{secret_code}" if secret_code else ""
81
+ script = f"""croc {relay_arg} {code_arg} --yes""".strip()
82
+ else:
83
+ # Linux/macOS Bash format: CROC_SECRET="secret-code" croc --relay server:port --yes
84
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
85
+ if secret_code:
86
+ script = f"""export CROC_SECRET="{secret_code}"
87
+ croc {relay_arg} --yes""".strip()
88
+ else:
89
+ script = f"""croc {relay_arg} --yes""".strip()
90
+
91
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
92
+ print_code(code=script, desc="🚀 Receiving file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
93
+ exit_then_run_shell_script(script=script, strict=False)
94
+
95
+
96
+ def share_file_send(path: Annotated[str, typer.Argument(help="Path to the file or directory to send")],
97
+ zip_folder: Annotated[bool, typer.Option("--zip", help="Zip folder before sending")] = False,
98
+ code: Annotated[str | None, typer.Option("--code", "-c", help="Codephrase used to connect to relay")] = None,
99
+ text: Annotated[str | None, typer.Option("--text", "-t", help="Send some text")] = None,
100
+ qrcode: Annotated[bool, typer.Option("--qrcode", "--qr", help="Show receive code as a qrcode")] = False,
101
+ ) -> None:
102
+ """Send a file using croc with relay server."""
103
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
104
+ install_if_missing(which="croc")
105
+ # Get relay server IP from environment or use default
106
+ import socket
107
+ import platform
108
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
109
+ s.connect(('8.8.8.8',80))
110
+ local_ip_v4 = s.getsockname()[0]
111
+ s.close()
112
+ relay_port = "443"
113
+ is_windows = platform.system() == "Windows"
114
+
115
+ # Build command parts
116
+ relay_arg = f"--relay {local_ip_v4}:{relay_port} --ip {local_ip_v4}:{relay_port}"
117
+ zip_arg = "--zip" if zip_folder else ""
118
+ text_arg = f"--text '{text}'" if text else ""
119
+ qrcode_arg = "--qrcode" if qrcode else ""
120
+ path_arg = f"{path}" if not text else ""
121
+
122
+ if is_windows:
123
+ # Windows PowerShell format
124
+ code_arg = f"--code {code}" if code else ""
125
+ script = f"""croc {relay_arg} send {zip_arg} {code_arg} {qrcode_arg} {text_arg} {path_arg}"""
126
+ else:
127
+ # Linux/macOS Bash format
128
+ if code:
129
+ script = f"""export CROC_SECRET="{code}"
130
+ croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
131
+ else:
132
+ script = f"""croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
133
+
134
+ typer.echo(f"🚀 Sending file: {path}. Use: devops network receive")
135
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
136
+ print_code(code=script, desc="🚀 sending file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
137
+ exit_then_run_shell_script(script=script, strict=False)
@@ -0,0 +1,141 @@
1
+ from pathlib import Path
2
+ from typing import Optional, Annotated
3
+ from machineconfig.scripts.python.helpers_devops.cli_share_file import share_file_receive, share_file_send
4
+ import typer
5
+
6
+
7
+ def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
8
+ """Display a flashy, unmissable share URL announcement."""
9
+ from rich.console import Console
10
+ from rich.panel import Panel
11
+ from rich.text import Text
12
+ from rich.align import Align
13
+ console = Console()
14
+ # Create the main message with styling
15
+ url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
16
+ message = Text.assemble(
17
+ ("🚀 ", "bright_red"),
18
+ ("Share server is now accessible at: ", "bright_white bold"),
19
+ url_text,
20
+ (" 🚀", "bright_red")
21
+ )
22
+ # Create a fancy panel with borders and styling
23
+ panel = Panel(
24
+ Align.center(message),
25
+ title="[bold bright_green]🌐 SHARE SERVER READY 🌐[/bold bright_green]",
26
+ subtitle="[italic bright_yellow]⚡ Click the link above to access your shared files! ⚡[/italic bright_yellow]",
27
+ border_style="bright_magenta",
28
+ padding=(1, 2),
29
+ expand=False
30
+ )
31
+ # Print with extra spacing and attention-grabbing elements
32
+ console.print(panel)
33
+
34
+
35
+ def web_file_explorer(
36
+ path: Annotated[str, typer.Argument(help="Path to the file or directory to share")],
37
+ port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the share server on (default: 8080)")] = None,
38
+ username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for share access (default: current user)")] = None,
39
+ password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for share access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
40
+ over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the share server over the internet using ngrok")] = False,
41
+ backend: Annotated[str, typer.Option("--backend", "-b", help="Backend to use: filebrowser (default), miniserve, or easy-sharing")] = "filebrowser"
42
+ ) -> None:
43
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
44
+
45
+ if backend not in ["filebrowser", "miniserve", "easy-sharing"]:
46
+ typer.echo(f"❌ ERROR: Invalid backend '{backend}'. Must be one of: filebrowser, miniserve, easy-sharing", err=True)
47
+ raise typer.Exit(code=1)
48
+
49
+ install_if_missing(which=backend)
50
+ if over_internet:
51
+ install_if_missing(which="ngrok")
52
+
53
+ if username is None:
54
+ import getpass
55
+ username = getpass.getuser()
56
+
57
+ if password is None:
58
+ pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
59
+ if pwd_path.exists():
60
+ password = pwd_path.read_text(encoding="utf-8").strip()
61
+ else:
62
+ typer.echo(f"⚠️ WARNING: Password not provided and default password file does not exist.\nPath: {pwd_path}\nUsing default password: 'quick_password' (insecure!)", err=True)
63
+ raise typer.Exit(code=1)
64
+
65
+ if port is None:
66
+ port = 8080
67
+
68
+ import socket
69
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
70
+ s.connect(('8.8.8.8', 80))
71
+ local_ip_v4 = s.getsockname()[0]
72
+ s.close()
73
+
74
+ protocol = "http"
75
+ display_share_url(local_ip_v4, port, protocol)
76
+
77
+ path_obj = Path(path).resolve()
78
+ if not path_obj.exists():
79
+ typer.echo(f"❌ ERROR: Path does not exist: {path}", err=True)
80
+ raise typer.Exit(code=1)
81
+
82
+ if backend == "filebrowser":
83
+ db_path = Path.home().joinpath(".config/filebrowser/filebrowser.db")
84
+ db_path.parent.mkdir(parents=True, exist_ok=True)
85
+ command = f"""
86
+ filebrowser users add {username} "{password}" --database {db_path}
87
+ filebrowser --address 0.0.0.0 --port {port} --root "{path_obj}" --database {db_path}
88
+ """
89
+ elif backend == "miniserve":
90
+ command = f"""miniserve --port {port} --interfaces 0.0.0.0 --auth {username}:{password} --upload-files --mkdir --enable-tar --enable-tar-gz --enable-zip --qrcode "{path_obj}" """
91
+ elif backend == "easy-sharing":
92
+ command = f"""easy-sharing --port {port} --username {username} --password "{password}" "{path_obj}" """
93
+ else:
94
+ typer.echo(f"❌ ERROR: Unknown backend '{backend}'", err=True)
95
+ raise typer.Exit(code=1)
96
+
97
+ from machineconfig.utils.code import exit_then_run_shell_script
98
+ exit_then_run_shell_script(script=command, strict=False)
99
+ # import subprocess
100
+ # import time
101
+ # server_process: subprocess.Popen[bytes]
102
+ # server_process = subprocess.Popen(command, shell=True)
103
+ # processes = [server_process]
104
+ # if over_internet:
105
+ # ngrok_process = subprocess.Popen(f"ngrok http {port}", shell=True)
106
+ # processes.append(ngrok_process)
107
+ # time.sleep(3)
108
+ # try:
109
+ # import requests
110
+ # response = requests.get("http://localhost:4040/api/tunnels")
111
+ # data = response.json()
112
+ # public_url = data['tunnels'][0]['public_url']
113
+ # print(f"🌐 Ngrok tunnel ready: {public_url}")
114
+ # except Exception as e:
115
+ # print(f"Could not retrieve ngrok URL: {e}")
116
+
117
+ # try:
118
+ # while True:
119
+ # print(f"Share server ({backend}) is running. Press Ctrl+C to stop.")
120
+ # time.sleep(2)
121
+ # except KeyboardInterrupt:
122
+ # print("\nTerminating processes...")
123
+ # for p in processes:
124
+ # p.terminate()
125
+ # p.wait()
126
+
127
+
128
+ def get_share_file_app():
129
+ app = typer.Typer(name="share-file", help="Send or receive files using croc with relay server.")
130
+ app.command(name="send", no_args_is_help=True, hidden=False, help="[s] send files from here.")(share_file_send)
131
+ app.command(name="s", no_args_is_help=True, hidden=True, help="[s] send files from here.")(share_file_send)
132
+ app.command(name="receive", no_args_is_help=True, hidden=False, help="[r] receive files to here.")(share_file_receive)
133
+ app.command(name="r", no_args_is_help=True, hidden=True, help="[r] receive files to here.")(share_file_receive)
134
+ return app
135
+
136
+ def main_with_parser():
137
+ typer.run(web_file_explorer)
138
+
139
+
140
+ if __name__ == "__main__":
141
+ pass
@@ -0,0 +1,156 @@
1
+ from pathlib import Path
2
+ from typing import Optional, Annotated
3
+ import typer
4
+ import subprocess
5
+ import time
6
+
7
+
8
+
9
+ """
10
+ reference:
11
+ # https://github.com/tsl0922/ttyd/wiki/Serving-web-fonts
12
+ # -t "fontFamily=CaskaydiaCove" bash
13
+ # --terminal-type xterm-kitty
14
+
15
+ """
16
+
17
+
18
+ def display_terminal_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
19
+ """Display a flashy, unmissable terminal URL announcement."""
20
+
21
+ from rich.console import Console
22
+ from rich.panel import Panel
23
+ from rich.text import Text
24
+ from rich.align import Align
25
+ console = Console()
26
+
27
+ # Create the main message with styling
28
+ url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
29
+ message = Text.assemble(
30
+ ("🚀 ", "bright_red"),
31
+ ("Terminal is now accessible at: ", "bright_white bold"),
32
+ url_text,
33
+ (" 🚀", "bright_red")
34
+ )
35
+
36
+ # Create a fancy panel with borders and styling
37
+ panel = Panel(
38
+ Align.center(message),
39
+ title="[bold bright_green]🌐 WEB TERMINAL READY 🌐[/bold bright_green]",
40
+ subtitle="[italic bright_yellow]⚡ Click the link above to access your terminal! ⚡[/italic bright_yellow]",
41
+ border_style="bright_magenta",
42
+ padding=(1, 2),
43
+ expand=False
44
+ )
45
+
46
+ # Print with extra spacing and attention-grabbing elements
47
+ # console.print("\n" + "🔥" * 60 + "\n", style="bright_red bold")
48
+ console.print(panel)
49
+ # console.print("🔥" * 60 + "\n", style="bright_red bold")
50
+
51
+
52
+ def main(
53
+ port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the terminal server on (default: 7681)")] = None,
54
+ username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for terminal access (default: current user)")] = None,
55
+ password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for terminal access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
56
+ start_command: Annotated[Optional[str], typer.Option("--start-command", "-s", help="Command to run on terminal start (default: bash/powershell)")] = None,
57
+ ssl: Annotated[bool, typer.Option("--ssl", "-S", help="Enable SSL")] = False,
58
+ ssl_cert: Annotated[Optional[str], typer.Option("--ssl-cert", "-C", help="SSL certificate file path")] = None,
59
+ ssl_key: Annotated[Optional[str], typer.Option("--ssl-key", "-K", help="SSL key file path")] = None,
60
+ ssl_ca: Annotated[Optional[str], typer.Option("--ssl-ca", "-A", help="SSL CA file path for client certificate verification")] = None,
61
+ over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the terminal over the internet using ngrok")] = False
62
+ ) -> None:
63
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
64
+ install_if_missing("ttyd")
65
+ if over_internet: install_if_missing("ngrok")
66
+
67
+ if username is None:
68
+ import getpass
69
+ username = getpass.getuser()
70
+ if password is None:
71
+ pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
72
+ if pwd_path.exists():
73
+ password = pwd_path.read_text(encoding="utf-8").strip()
74
+ else:
75
+ raise ValueError("Password not provided and default password file does not exist.")
76
+
77
+ if port is None:
78
+ port = 7681 # Default port for ttyd
79
+
80
+ # Handle SSL certificate defaults
81
+ if ssl:
82
+ if ssl_cert is None:
83
+ ssl_cert = str(Path.home().joinpath("dotfiles/creds/passwords/ssl/origin_server/cert.pem"))
84
+ if ssl_key is None:
85
+ ssl_key = str(Path.home().joinpath("dotfiles/creds/passwords/ssl/origin_server/key.pem"))
86
+
87
+ # Verify SSL files exist
88
+ cert_path = Path(ssl_cert)
89
+ key_path = Path(ssl_key)
90
+
91
+ if not cert_path.exists():
92
+ raise FileNotFoundError(f"SSL certificate file not found: {ssl_cert}")
93
+ if not key_path.exists():
94
+ raise FileNotFoundError(f"SSL key file not found: {ssl_key}")
95
+
96
+ if ssl_ca and not Path(ssl_ca).exists():
97
+ raise FileNotFoundError(f"SSL CA file not found: {ssl_ca}")
98
+
99
+ import socket
100
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
101
+ s.connect(('8.8.8.8',80))
102
+ local_ip_v4 = s.getsockname()[0]
103
+ s.close()
104
+
105
+ # Display the flashy terminal announcement
106
+ protocol = "https" if ssl else "http"
107
+ display_terminal_url(local_ip_v4, port, protocol)
108
+
109
+ # Build ttyd command with SSL options
110
+ ssl_args = ""
111
+ if ssl:
112
+ ssl_args = f"--ssl --ssl-cert {ssl_cert} --ssl-key {ssl_key}"
113
+ if ssl_ca:
114
+ ssl_args += f" --ssl-ca {ssl_ca}"
115
+
116
+ if start_command is None:
117
+ import platform
118
+ if platform.system().lower() == "windows":
119
+ start_command = "powershell"
120
+ else:
121
+ start_command = "bash"
122
+
123
+ ttyd_cmd = f"ttyd --writable -t enableSixel=true {ssl_args} --port {port} --credential \"{username}:{password}\" -t 'theme={{\"background\": \"black\"}}' {start_command}"
124
+ ttyd_process = subprocess.Popen(ttyd_cmd, shell=True)
125
+ processes = [ttyd_process]
126
+
127
+ if over_internet:
128
+ ngrok_process = subprocess.Popen(f"ngrok http {port}", shell=True)
129
+ processes.append(ngrok_process)
130
+ time.sleep(3)
131
+ try:
132
+ import requests
133
+ response = requests.get("http://localhost:4040/api/tunnels")
134
+ data = response.json()
135
+ public_url = data['tunnels'][0]['public_url']
136
+ print(f"🌐 Ngrok tunnel ready: {public_url}")
137
+ except Exception as e:
138
+ print(f"Could not retrieve ngrok URL: {e}")
139
+
140
+ try:
141
+ while True:
142
+ print("Terminal server is running. Press Ctrl+C to stop.")
143
+ time.sleep(2)
144
+ except KeyboardInterrupt:
145
+ print("\nTerminating processes...")
146
+ for p in processes:
147
+ p.terminate()
148
+ p.wait()
149
+
150
+
151
+ def main_with_parser():
152
+ typer.run(main)
153
+
154
+
155
+ if __name__ == "__main__":
156
+ pass
@@ -0,0 +1,96 @@
1
+
2
+
3
+ import typer
4
+ from typing import Annotated, Optional
5
+
6
+
7
+ def merge_pdfs(
8
+ pdfs: Annotated[list[str], typer.Argument(..., help="Paths to the PDF files to merge.")],
9
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output merged PDF file path.")] = None,
10
+ compress: Annotated[bool, typer.Option("--compress", "-c", help="Compress the output PDF.")] = False,
11
+ ) -> None:
12
+ def merge_pdfs_internal(pdfs: list[str], output: str | None, compress: bool) -> None:
13
+ from pypdf import PdfReader, PdfWriter
14
+ writer = PdfWriter()
15
+ for pdf_path in pdfs:
16
+ reader = PdfReader(pdf_path)
17
+ for page in reader.pages:
18
+ writer.add_page(page)
19
+ output_path = output if output else "merged.pdf"
20
+ if compress:
21
+ try:
22
+ for p in writer.pages:
23
+ try:
24
+ # PageObject.compress_content_streams exists in pypdf
25
+ p.compress_content_streams()
26
+ except Exception:
27
+ # best-effort: ignore per-page compression failures
28
+ continue
29
+ except Exception:
30
+ pass
31
+ try:
32
+ writer.compress_identical_objects()
33
+ except Exception:
34
+ # non-fatal if this fails
35
+ pass
36
+ writer.write(output_path)
37
+ print(f"✅ Merged PDF saved to: {output_path}")
38
+ from machineconfig.utils.meta import lambda_to_python_script
39
+ code = lambda_to_python_script(lambda : merge_pdfs_internal(pdfs=pdfs, output=output, compress=compress),
40
+ in_global=True, import_module=False)
41
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
42
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pypdf"], uv_project_dir=None)
43
+ run_shell_script(uv_command)
44
+
45
+
46
+ def compress_pdf(
47
+ pdf_input: Annotated[str, typer.Argument(..., help="Path to the input PDF file to compress.")],
48
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output compressed PDF file path.")] = None,
49
+ quality: Annotated[int, typer.Option("--quality", "-q", help="JPEG quality for image compression (0-100, 0=no change, 100=best).")] = 85,
50
+ image_dpi: Annotated[int, typer.Option("--image-dpi", "-d", help="Target DPI for image resampling. If set, images above this DPI will be downsampled.")] = 0,
51
+ # remove_images: Annotated[bool, typer.Option("--remove-images", "-r", help="Remove all images from the PDF.")] = False,
52
+ compress_streams: Annotated[bool, typer.Option("--compress-streams", "-c", help="Compress uncompressed streams.")] = True,
53
+ use_objstms: Annotated[bool, typer.Option("--object-streams", "-s", help="Use object streams for additional compression.")] = True,
54
+ ) -> None:
55
+ def compress_pdf_internal(pdf_input: str, output: str | None, quality: int, image_dpi: int, compress_streams: bool, use_objstms: bool) -> None:
56
+ import pymupdf
57
+ from pathlib import Path
58
+ output_path = output if output else pdf_input.replace(".pdf", "_compressed.pdf")
59
+ doc = pymupdf.open(pdf_input)
60
+ try:
61
+ # if remove_images:
62
+ # for page in doc:
63
+ # page.remove_images()
64
+ if quality > 0 or image_dpi > 0:
65
+ doc.rewrite_images(
66
+ dpi_threshold=image_dpi if image_dpi > 0 else None,
67
+ dpi_target=max(72, image_dpi - 10) if image_dpi > 72 else 72,
68
+ quality=quality,
69
+ lossy=True,
70
+ lossless=True,
71
+ )
72
+ doc.save(
73
+ output_path,
74
+ deflate=compress_streams,
75
+ garbage=3,
76
+ use_objstms=1 if use_objstms else 0,
77
+ )
78
+ input_size = Path(pdf_input).stat().st_size
79
+ output_size = Path(output_path).stat().st_size
80
+ ratio = (1 - output_size / input_size) * 100
81
+ print(f"✅ Compressed PDF saved to: {output_path}")
82
+ print(f" Original: {input_size / 1024 / 1024:.2f} MB")
83
+ print(f" Compressed: {output_size / 1024 / 1024:.2f} MB")
84
+ print(f" Reduction: {ratio:.1f}%")
85
+ finally:
86
+ doc.close()
87
+ from machineconfig.utils.meta import lambda_to_python_script
88
+ code = lambda_to_python_script(
89
+ lambda: compress_pdf_internal(pdf_input=pdf_input, output=output, quality=quality, image_dpi=image_dpi, compress_streams=compress_streams, use_objstms=use_objstms),
90
+ in_global=True,
91
+ import_module=False,
92
+ )
93
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
94
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pymupdf"], uv_project_dir=None)
95
+ run_shell_script(uv_command)
96
+
@@ -2,33 +2,30 @@
2
2
 
3
3
  # import subprocess
4
4
  from machineconfig.utils.io import read_ini
5
- from machineconfig.utils.path_extended import PathExtended as PathExtended
6
5
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT, DEFAULTS_PATH
7
6
  from machineconfig.utils.code import print_code
8
7
  from machineconfig.utils.options import choose_cloud_interactively, choose_from_options
9
- from machineconfig.scripts.python.helpers.helpers2 import ES
8
+ from machineconfig.scripts.python.helpers_cloud.helpers2 import ES
10
9
  from platform import system
11
10
  from typing import Any, Literal, Optional
12
11
  from rich.console import Console
13
12
  from rich.panel import Panel
13
+ from pathlib import Path
14
14
  import tomllib
15
15
 
16
16
 
17
17
  OPTIONS = Literal["BACKUP", "RETRIEVE"]
18
18
 
19
19
 
20
- def main_backup_retrieve(direction: OPTIONS, which: Optional[str] = None) -> None:
20
+ def main_backup_retrieve(direction: OPTIONS, which: Optional[str], cloud: Optional[str]) -> None:
21
21
  console = Console()
22
-
23
22
  try:
24
- cloud: str = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
23
+ cloud = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
25
24
  console.print(Panel(f"⚠️ DEFAULT CLOUD CONFIGURATION\n🌥️ Using default cloud: {cloud}", title="[bold blue]Cloud Configuration[/bold blue]", border_style="blue"))
26
25
  except (FileNotFoundError, KeyError, IndexError):
27
26
  console.print(Panel("🔍 DEFAULT CLOUD NOT FOUND\n🔄 Please select a cloud configuration from the options below", title="[bold red]Error: Cloud Not Found[/bold red]", border_style="red"))
28
27
  cloud = choose_cloud_interactively()
29
-
30
28
  bu_file: dict[str, Any] = tomllib.loads(LIBRARY_ROOT.joinpath("profile/backup.toml").read_text(encoding="utf-8"))
31
-
32
29
  console.print(Panel(f"🧰 LOADING BACKUP CONFIGURATION\n📄 File: {LIBRARY_ROOT.joinpath('profile/backup.toml')}", title="[bold blue]Backup Configuration[/bold blue]", border_style="blue"))
33
30
 
34
31
  if system() == "Linux":
@@ -59,13 +56,13 @@ def main_backup_retrieve(direction: OPTIONS, which: Optional[str] = None) -> Non
59
56
  flags += "e" if item["encrypt"] == "True" else ""
60
57
  flags += "r" if item["rel2home"] == "True" else ""
61
58
  flags += "o" if system().lower() in item_name else ""
62
- console.print(Panel(f"📦 PROCESSING: {item_name}\n📂 Path: {PathExtended(item['path']).as_posix()}\n🏳️ Flags: {flags or 'None'}", title=f"[bold blue]Processing Item: {item_name}[/bold blue]", border_style="blue"))
59
+ console.print(Panel(f"📦 PROCESSING: {item_name}\n📂 Path: {Path(item['path']).as_posix()}\n🏳️ Flags: {flags or 'None'}", title=f"[bold blue]Processing Item: {item_name}[/bold blue]", border_style="blue"))
63
60
  if flags:
64
61
  flags = "-" + flags
65
62
  if direction == "BACKUP":
66
- program += f"""\ncloud_copy "{PathExtended(item["path"]).as_posix()}" $cloud {flags}\n"""
63
+ program += f"""\ncloud_copy "{Path(item["path"]).as_posix()}" $cloud {flags}\n"""
67
64
  elif direction == "RETRIEVE":
68
- program += f"""\ncloud_copy $cloud "{PathExtended(item["path"]).as_posix()}" {flags}\n"""
65
+ program += f"""\ncloud_copy $cloud "{Path(item["path"]).as_posix()}" {flags}\n"""
69
66
  else:
70
67
  console.print(Panel('❌ ERROR: INVALID DIRECTION\n⚠️ Direction must be either "BACKUP" or "RETRIEVE"', title="[bold red]Error: Invalid Direction[/bold red]", border_style="red"))
71
68
  raise RuntimeError(f"Unknown direction: {direction}")