machineconfig 3.99__py3-none-any.whl → 7.66__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 (418) 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 +2 -16
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +69 -53
  34. machineconfig/jobs/installer/custom/hx.py +77 -20
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
  36. machineconfig/jobs/installer/custom_dev/brave.py +43 -35
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +33 -21
  40. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  41. machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
  42. machineconfig/jobs/installer/custom_dev/goes.py +41 -36
  43. machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
  44. machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
  45. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
  46. machineconfig/jobs/installer/custom_dev/redis.py +51 -33
  47. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  48. machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
  49. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  50. machineconfig/jobs/installer/installer_data.json +3406 -0
  51. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  52. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  53. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  54. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  55. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  56. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  57. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  58. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  59. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  60. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  61. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  62. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  63. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  64. machineconfig/jobs/installer/package_groups.py +255 -0
  65. machineconfig/logger.py +0 -1
  66. machineconfig/profile/backup.toml +49 -0
  67. machineconfig/profile/bash_shell_profiles.md +11 -0
  68. machineconfig/profile/create_helper.py +74 -0
  69. machineconfig/profile/create_links.py +288 -0
  70. machineconfig/profile/create_links_export.py +100 -0
  71. machineconfig/profile/create_shell_profile.py +136 -0
  72. machineconfig/profile/mapper.toml +258 -0
  73. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -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/initai.py +3 -28
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  89. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  90. machineconfig/scripts/python/cloud.py +29 -0
  91. machineconfig/scripts/python/croshell.py +117 -181
  92. machineconfig/scripts/python/define.py +31 -0
  93. machineconfig/scripts/python/devops.py +44 -124
  94. machineconfig/scripts/python/devops_navigator.py +10 -0
  95. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  96. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  97. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  98. machineconfig/scripts/python/explore.py +49 -0
  99. machineconfig/scripts/python/fire_jobs.py +106 -244
  100. machineconfig/scripts/python/ftpx.py +125 -68
  101. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  102. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  103. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  106. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  107. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  108. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  109. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  110. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  111. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  112. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  113. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
  114. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  115. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  116. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  117. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
  118. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  119. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  120. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  121. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  122. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  123. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  124. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  125. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  126. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  127. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  128. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  129. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  130. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  131. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  132. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  133. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  134. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  135. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
  136. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  137. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  138. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  139. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  140. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  141. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  142. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  143. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  144. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  145. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  146. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  147. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  148. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  149. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  150. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  151. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  152. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  153. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  154. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  155. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  156. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  157. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  158. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  159. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  160. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  161. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  162. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  163. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  164. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  165. machineconfig/scripts/python/interactive.py +79 -160
  166. machineconfig/scripts/python/machineconfig.py +63 -0
  167. machineconfig/scripts/python/msearch.py +21 -0
  168. machineconfig/scripts/python/nw/__init__.py +0 -0
  169. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  170. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  171. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  172. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  173. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  174. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  175. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  176. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  177. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  178. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  179. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
  180. machineconfig/scripts/python/sessions.py +167 -0
  181. machineconfig/scripts/python/terminal.py +127 -0
  182. machineconfig/scripts/python/utils.py +66 -0
  183. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  184. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  185. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  186. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  187. machineconfig/settings/broot/br.sh +0 -4
  188. machineconfig/settings/broot/conf.toml +1 -1
  189. machineconfig/settings/helix/config.toml +16 -0
  190. machineconfig/settings/helix/languages.toml +13 -4
  191. machineconfig/settings/helix/yazi-picker.sh +12 -0
  192. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  193. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  194. machineconfig/settings/lf/linux/lfrc +10 -12
  195. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  196. machineconfig/settings/lf/windows/lfrc +18 -38
  197. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  198. machineconfig/settings/linters/.ruff.toml +1 -1
  199. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  200. machineconfig/settings/marimo/marimo.toml +80 -0
  201. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  202. machineconfig/settings/pistol/pistol.conf +1 -1
  203. machineconfig/settings/shells/bash/init.sh +55 -31
  204. machineconfig/settings/shells/nushell/config.nu +1 -34
  205. machineconfig/settings/shells/nushell/init.nu +127 -0
  206. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  207. machineconfig/settings/shells/starship/starship.toml +16 -0
  208. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  209. machineconfig/settings/shells/wt/settings.json +32 -17
  210. machineconfig/settings/shells/zsh/init.sh +89 -0
  211. machineconfig/settings/svim/linux/init.toml +0 -4
  212. machineconfig/settings/svim/windows/init.toml +0 -3
  213. machineconfig/settings/yazi/init.lua +57 -0
  214. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  215. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  216. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  217. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  218. machineconfig/settings/yazi/yazi.toml +13 -0
  219. machineconfig/setup_linux/__init__.py +10 -0
  220. machineconfig/setup_linux/apps_desktop.sh +89 -0
  221. machineconfig/setup_linux/apps_gui.sh +64 -0
  222. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  223. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  224. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  225. machineconfig/setup_linux/uv.sh +15 -0
  226. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  227. machineconfig/setup_mac/__init__.py +16 -0
  228. machineconfig/setup_mac/apps_gui.sh +248 -0
  229. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  230. machineconfig/setup_mac/uv.sh +36 -0
  231. machineconfig/setup_windows/__init__.py +8 -0
  232. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  233. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  234. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  235. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  236. machineconfig/setup_windows/uv.ps1 +10 -0
  237. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
  238. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  239. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  240. machineconfig/utils/accessories.py +7 -5
  241. machineconfig/utils/cloud/onedrive/README.md +139 -0
  242. machineconfig/utils/code.py +140 -93
  243. machineconfig/utils/files/art/fat_croco.txt +10 -0
  244. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  245. machineconfig/utils/files/art/happy_croco.txt +22 -0
  246. machineconfig/utils/files/art/water_croco.txt +11 -0
  247. machineconfig/utils/files/ascii_art.py +118 -0
  248. machineconfig/utils/files/dbms.py +257 -0
  249. machineconfig/utils/files/headers.py +68 -0
  250. machineconfig/utils/files/ouch/__init__.py +0 -0
  251. machineconfig/utils/files/ouch/decompress.py +45 -0
  252. machineconfig/utils/files/read.py +95 -0
  253. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  254. machineconfig/utils/installer_utils/installer_class.py +68 -126
  255. machineconfig/utils/installer_utils/installer_cli.py +181 -0
  256. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
  257. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
  258. machineconfig/utils/io.py +77 -23
  259. machineconfig/utils/links.py +309 -100
  260. machineconfig/utils/meta.py +255 -0
  261. machineconfig/utils/notifications.py +1 -1
  262. machineconfig/utils/options.py +10 -25
  263. machineconfig/utils/path_extended.py +94 -104
  264. machineconfig/utils/path_helper.py +75 -22
  265. machineconfig/utils/procs.py +50 -74
  266. machineconfig/utils/scheduler.py +94 -97
  267. machineconfig/utils/scheduling.py +0 -3
  268. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  269. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +2 -1
  271. machineconfig/utils/source_of_truth.py +3 -6
  272. machineconfig/utils/ssh.py +742 -254
  273. machineconfig/utils/ssh_utils/utils.py +0 -0
  274. machineconfig/utils/terminal.py +3 -140
  275. machineconfig/utils/tst.py +20 -0
  276. machineconfig/utils/upgrade_packages.py +109 -28
  277. machineconfig/utils/ve.py +13 -5
  278. machineconfig-7.66.dist-info/METADATA +124 -0
  279. machineconfig-7.66.dist-info/RECORD +451 -0
  280. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  281. machineconfig/cluster/templates/utils.py +0 -51
  282. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  283. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  284. machineconfig/jobs/installer/packages_custom_dev.json +0 -226
  285. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  286. machineconfig/jobs/installer/packages_github_dev.json +0 -1110
  287. machineconfig/jobs/installer/packages_github_essential.json +0 -804
  288. machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
  289. machineconfig/jobs/python/create_bootable_media.py +0 -16
  290. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  291. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  292. machineconfig/jobs/python/tasks.py +0 -3
  293. machineconfig/jobs/python/vscode/api.py +0 -49
  294. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  295. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  296. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  297. machineconfig/jobs/windows/startup_file.cmd +0 -2
  298. machineconfig/profile/create.py +0 -170
  299. machineconfig/profile/shell.py +0 -176
  300. machineconfig/scripts/cloud/init.sh +0 -119
  301. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  302. machineconfig/scripts/linux/cloud_copy +0 -2
  303. machineconfig/scripts/linux/cloud_mount +0 -2
  304. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  305. machineconfig/scripts/linux/cloud_sync +0 -2
  306. machineconfig/scripts/linux/croshell +0 -3
  307. machineconfig/scripts/linux/devops +0 -2
  308. machineconfig/scripts/linux/fire +0 -2
  309. machineconfig/scripts/linux/fire_agents +0 -2
  310. machineconfig/scripts/linux/ftpx +0 -2
  311. machineconfig/scripts/linux/fzf2g +0 -21
  312. machineconfig/scripts/linux/fzffg +0 -25
  313. machineconfig/scripts/linux/gh_models +0 -2
  314. machineconfig/scripts/linux/initai +0 -2
  315. machineconfig/scripts/linux/kill_process +0 -2
  316. machineconfig/scripts/linux/programs +0 -21
  317. machineconfig/scripts/linux/repos +0 -2
  318. machineconfig/scripts/linux/scheduler +0 -2
  319. machineconfig/scripts/linux/share_smb +0 -1
  320. machineconfig/scripts/linux/start_slidev +0 -2
  321. machineconfig/scripts/linux/start_terminals +0 -3
  322. machineconfig/scripts/linux/warp-cli.sh +0 -122
  323. machineconfig/scripts/linux/wifi_conn +0 -2
  324. machineconfig/scripts/linux/z_ls +0 -104
  325. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  326. machineconfig/scripts/python/cloud_repo_sync.py +0 -186
  327. machineconfig/scripts/python/devops_devapps_install.py +0 -159
  328. machineconfig/scripts/python/devops_update_repos.py +0 -180
  329. machineconfig/scripts/python/dotfile.py +0 -52
  330. machineconfig/scripts/python/fire_agents.py +0 -175
  331. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  332. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  333. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
  334. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
  335. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  336. machineconfig/scripts/python/gh_models.py +0 -104
  337. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  338. machineconfig/scripts/python/repos.py +0 -80
  339. machineconfig/scripts/python/repos_helper_action.py +0 -335
  340. machineconfig/scripts/python/share_terminal.py +0 -104
  341. machineconfig/scripts/python/snapshot.py +0 -25
  342. machineconfig/scripts/python/start_terminals.py +0 -121
  343. machineconfig/scripts/python/t4.py +0 -17
  344. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  345. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  346. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  347. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  348. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  349. machineconfig/scripts/windows/croshell.ps1 +0 -1
  350. machineconfig/scripts/windows/devops.ps1 +0 -1
  351. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  352. machineconfig/scripts/windows/fire.ps1 +0 -1
  353. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  354. machineconfig/scripts/windows/gpt.ps1 +0 -1
  355. machineconfig/scripts/windows/grep.ps1 +0 -2
  356. machineconfig/scripts/windows/initai.ps1 +0 -1
  357. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  358. machineconfig/scripts/windows/nano.ps1 +0 -3
  359. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  360. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  361. machineconfig/scripts/windows/repos.ps1 +0 -1
  362. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  363. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  364. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  365. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  366. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  367. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  368. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  369. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  370. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  371. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  372. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  373. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  374. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  375. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  376. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  377. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  378. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  379. machineconfig-3.99.dist-info/METADATA +0 -167
  380. machineconfig-3.99.dist-info/RECORD +0 -409
  381. machineconfig-3.99.dist-info/entry_points.txt +0 -18
  382. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  383. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  384. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  385. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  386. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  387. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  388. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  389. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  390. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  391. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  392. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  393. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  394. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  395. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  396. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  397. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  398. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  399. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  400. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  401. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  402. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  403. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  404. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  405. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  406. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  407. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  408. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  409. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  410. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  411. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  412. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  413. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  414. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  415. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  416. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  417. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  418. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,152 @@
1
+
2
+
3
+ from typing import Annotated, Optional
4
+ import typer
5
+ from pathlib import Path
6
+
7
+
8
+ def download(
9
+ url: Annotated[Optional[str], typer.Argument(..., help="The URL to download the file from.")] = None,
10
+ decompress: Annotated[bool, typer.Option(..., "--decompress", "-d", help="Decompress the file if it's an archive.")] = False,
11
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="The output file path.")] = None,
12
+ output_dir: Annotated[Optional[str], typer.Option("--output-dir", help="Directory to place the downloaded file in.")] = None,
13
+ ) -> Optional["Path"]:
14
+
15
+ import subprocess
16
+ from urllib.parse import parse_qs, unquote, urlparse
17
+ from requests import Response
18
+ import requests
19
+ from pathlib import Path
20
+ if url is None:
21
+ typer.echo("❌ Error: URL is required.", err=True)
22
+ return None
23
+ if output is not None and output_dir is not None:
24
+ typer.echo("❌ Error: --output and --output-dir cannot be used together.", err=True)
25
+ return None
26
+ typer.echo(f"📥 Downloading from: {url}")
27
+
28
+ def _sanitize_candidate_filename(name: str) -> Optional[str]:
29
+ candidate = Path(name).name.strip()
30
+ if not candidate or candidate in {".", ".."}:
31
+ return None
32
+ return candidate
33
+
34
+ def _filename_from_content_disposition(header_value: Optional[str]) -> Optional[str]:
35
+ if header_value is None:
36
+ return None
37
+ parts = [segment.strip() for segment in header_value.split(";")]
38
+ for part in parts:
39
+ lower = part.lower()
40
+ if lower.startswith("filename*="):
41
+ value = part.split("=", 1)[1]
42
+ value = value.strip().strip('"')
43
+ if "''" in value:
44
+ value = value.split("''", 1)[1]
45
+ decoded = unquote(value)
46
+ sanitized = _sanitize_candidate_filename(decoded)
47
+ if sanitized is not None:
48
+ return sanitized
49
+ if lower.startswith("filename="):
50
+ value = part.split("=", 1)[1].strip().strip('"')
51
+ decoded = unquote(value)
52
+ sanitized = _sanitize_candidate_filename(decoded)
53
+ if sanitized is not None:
54
+ return sanitized
55
+ return None
56
+
57
+ def _filename_from_url(source_url: str) -> Optional[str]:
58
+ parsed = urlparse(source_url)
59
+ url_candidate = _sanitize_candidate_filename(unquote(Path(parsed.path).name))
60
+ if url_candidate is not None:
61
+ return url_candidate
62
+ query_params = parse_qs(parsed.query, keep_blank_values=True)
63
+ for key, values in query_params.items():
64
+ lower_key = key.lower()
65
+ if "name" in lower_key or "file" in lower_key:
66
+ for value in values:
67
+ sanitized = _sanitize_candidate_filename(unquote(value))
68
+ if sanitized is not None:
69
+ return sanitized
70
+ return None
71
+
72
+ def _resolve_download_path(request_url: str, response: Response, requested_output: Optional[str], requested_output_dir: Optional[str]) -> Path:
73
+ if requested_output is not None:
74
+ return Path(requested_output)
75
+ header_candidate = _filename_from_content_disposition(response.headers.get("content-disposition"))
76
+ if header_candidate is None:
77
+ header_candidate = _filename_from_url(response.url)
78
+ if header_candidate is None:
79
+ header_candidate = _filename_from_url(request_url)
80
+ if header_candidate is None:
81
+ header_candidate = "downloaded_file"
82
+ if requested_output_dir is not None:
83
+ return Path(requested_output_dir) / header_candidate
84
+ return Path(header_candidate)
85
+
86
+ try:
87
+ with requests.get(url, allow_redirects=True, stream=True, timeout=60) as response:
88
+ response.raise_for_status()
89
+ download_path = _resolve_download_path(url, response, output, output_dir)
90
+ download_path.parent.mkdir(parents=True, exist_ok=True)
91
+ total_size_header = response.headers.get("content-length", "0")
92
+ try:
93
+ total_size = int(total_size_header)
94
+ except (TypeError, ValueError):
95
+ total_size = 0
96
+ if total_size <= 0:
97
+ with open(download_path, "wb") as file_handle:
98
+ file_handle.write(response.content)
99
+ else:
100
+ downloaded = 0
101
+ chunk_size = 8192 * 4
102
+ with open(download_path, "wb") as file_handle:
103
+ for chunk in response.iter_content(chunk_size=chunk_size):
104
+ if not chunk:
105
+ continue
106
+ file_handle.write(chunk)
107
+ downloaded += len(chunk)
108
+ progress = (downloaded / total_size) * 100
109
+ typer.echo(f"\r⏬ Progress: {progress:.1f}% ({downloaded}/{total_size} bytes)", nl=False)
110
+ typer.echo()
111
+ except requests.exceptions.RequestException as exception:
112
+ typer.echo(f"❌ Download failed: {exception}", err=True)
113
+ return None
114
+ except OSError as exception:
115
+ typer.echo(f"❌ File write error: {exception}", err=True)
116
+ return None
117
+
118
+ typer.echo(f"✅ Downloaded to: {download_path}")
119
+ result_path: Path = download_path
120
+
121
+ if decompress:
122
+ typer.echo(f"📦 Decompressing: {download_path}")
123
+ base_name = download_path.stem
124
+ if base_name in {"", ".", ".."}:
125
+ base_name = "extracted"
126
+ extract_dir = download_path.parent / base_name
127
+ extract_dir.mkdir(parents=True, exist_ok=True)
128
+ try:
129
+ subprocess.run(
130
+ ["ouch", "decompress", str(download_path), "--dir", str(extract_dir)],
131
+ check=True,
132
+ capture_output=True,
133
+ text=True,
134
+ )
135
+ typer.echo(f"✅ Decompressed to: {extract_dir}")
136
+ if download_path.exists():
137
+ download_path.unlink()
138
+ typer.echo(f"🗑️ Removed archive: {download_path}")
139
+ result_path = extract_dir
140
+ except subprocess.CalledProcessError as exception:
141
+ typer.echo(f"❌ Decompression failed: {exception.stderr}", err=True)
142
+ return None
143
+ except FileNotFoundError:
144
+ typer.echo("❌ Error: ouch command not found. Please install ouch.", err=True)
145
+ typer.echo("💡 Install with: cargo install ouch", err=True)
146
+ return None
147
+
148
+ return result_path.resolve()
149
+
150
+
151
+ if __name__ == "__main__":
152
+ pass
@@ -0,0 +1,108 @@
1
+
2
+
3
+
4
+ import typer
5
+
6
+ from typing import Optional
7
+ from typing import Annotated, Literal, TypedDict
8
+
9
+
10
+ def path():
11
+ """📚 NAVIGATE PATH variable with TUI"""
12
+ from machineconfig.scripts.python import env_manager as navigator
13
+ from pathlib import Path
14
+ path = Path(navigator.__file__).resolve().parent.joinpath("path_manager_tui.py")
15
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
16
+ uv_with = ["textual"]
17
+ uv_project_dir = None
18
+ if not Path.home().joinpath("code/machineconfig").exists():
19
+ uv_with.append("machineconfig>=7.66")
20
+ else:
21
+ uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
22
+ run_shell_script(get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0])
23
+
24
+
25
+ def init_project(python: Annotated[Literal["3.13", "3.14"], typer.Option("--python", "-p", help="Python version for the uv virtual environment.")]= "3.13") -> None:
26
+ _ = python
27
+ from pathlib import Path
28
+ repo_root = Path.cwd()
29
+ if not (repo_root / "pyproject.toml").exists():
30
+ typer.echo("❌ Error: pyproject.toml not found.", err=True)
31
+ raise typer.Exit(code=1)
32
+ print("Adding group `plot` with common data science and plotting packages...")
33
+ script = """
34
+ uv add --group plot \
35
+ # Data & computation
36
+ numpy pandas polars duckdb-engine python-magic \
37
+ # Plotting / visualization
38
+ matplotlib plotly kaleido \
39
+ # Notebooks / interactive
40
+ ipython ipykernel jupyterlab nbformat marimo \
41
+ # Code analysis / type checking / linting
42
+ mypy pyright ruff pylint pyrefly \
43
+ # Packaging / build / dev
44
+ cleanpy \
45
+ # CLI / debugging / utilities
46
+ ipdb pudb \
47
+ # Type hints for packages
48
+ types-python-dateutil types-pyyaml types-requests types-tqdm \
49
+ types-mysqlclient types-paramiko types-pytz types-sqlalchemy types-toml types-urllib3 \
50
+
51
+ """
52
+ from machineconfig.utils.code import run_shell_script
53
+ run_shell_script(script)
54
+
55
+
56
+ def edit_file_with_hx(path: Annotated[Optional[str], typer.Argument(..., help="The root directory of the project to edit, or a file path.")] = None) -> None:
57
+ from pathlib import Path
58
+ if path is None:
59
+ root_path = Path.cwd()
60
+ print(f"No path provided. Using current working directory: {root_path}")
61
+ else:
62
+ root_path = Path(path).expanduser().resolve()
63
+ print(f"Using provided path: {root_path}")
64
+ from machineconfig.utils.accessories import get_repo_root
65
+ repo_root = get_repo_root(root_path)
66
+ if repo_root is not None and repo_root.joinpath("pyproject.toml").exists():
67
+ code = f"""
68
+ cd {repo_root}
69
+ uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp # for helix editor.
70
+ source ./.venv/bin/activate
71
+ """
72
+ else:
73
+ code = ""
74
+ if root_path.is_file():
75
+ code += f"hx {root_path}"
76
+ else:
77
+ code += "hx"
78
+ from machineconfig.utils.code import exit_then_run_shell_script
79
+ exit_then_run_shell_script(code)
80
+
81
+
82
+ class MachineSpecs(TypedDict):
83
+ system: str
84
+ distro: str
85
+ home_dir: str
86
+
87
+
88
+ def get_machine_specs() -> MachineSpecs:
89
+ """Write print and return the local machine specs."""
90
+ import platform
91
+ UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
92
+ command = f"""{UV_RUN_CMD} --with distro python -c "import distro; print(distro.name(pretty=True))" """
93
+ import subprocess
94
+ from pathlib import Path
95
+ distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
96
+ specs: MachineSpecs = {
97
+ "system": platform.system(),
98
+ "distro": distro,
99
+ "home_dir": str(Path.home()),
100
+ }
101
+ print(specs)
102
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
103
+ path = CONFIG_ROOT.joinpath("machine_specs.json")
104
+ CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
105
+ import json
106
+ path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
107
+ return specs
108
+
@@ -17,45 +17,59 @@ for better user experience with checkbox selections.
17
17
 
18
18
  """
19
19
 
20
- import subprocess
21
20
  import sys
22
21
  from pathlib import Path
23
- from platform import system
24
-
22
+ import platform
25
23
  import questionary
26
24
  from questionary import Choice
27
25
  from rich.console import Console
28
26
  from rich.panel import Panel
29
27
  from rich.text import Text
30
-
28
+ from machineconfig.utils.code import run_shell_script
31
29
 
32
30
  console = Console()
33
31
 
34
32
 
35
- def run_command(command: str, description: str) -> bool:
36
- """Execute a shell command and return success status."""
37
- console.print(f"\n🔧 {description}", style="bold cyan")
38
- try:
39
- result = subprocess.run(command, shell=True, check=True, capture_output=False)
40
- return result.returncode == 0
41
- except subprocess.CalledProcessError as e:
42
- console.print(f"❌ Error executing command: {e}", style="bold red")
43
- return False
44
33
  def display_header() -> None:
45
- """Display the script header."""
46
- header_text = Text("MACHINE CONFIGURATION", style="bold magenta")
47
- subtitle_text = Text("Interactive Installation Script", style="italic cyan")
48
- console.print(Panel(f"📦 {header_text}\n{subtitle_text}", border_style="blue", padding=(1, 2)))
34
+ from machineconfig.utils.installer_utils.installer_runner import get_machineconfig_version
35
+ from rich.align import Align
36
+
37
+ # Fancy ASCII art header
38
+ ascii_art = """
39
+ ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
40
+ ║ ║
41
+ ║ ███╗ ███╗ █████╗ ██████╗██╗ ██╗██╗███╗ ██╗███████╗ ██████╗ ██████╗ ███╗ ██╗███████╗██╗ ██████╗ ║
42
+ ║ ████╗ ████║██╔══██╗██╔════╝██║ ██║██║████╗ ██║██╔════╝██╔════╝██╔═══██╗████╗ ██║██╔════╝██║██╔════╝ ║
43
+ ║ ██╔████╔██║███████║██║ ███████║██║██╔██╗ ██║█████╗ ██║ ██║ ██║██╔██╗ ██║█████╗ ██║██║ ███╗ ║
44
+ ║ ██║╚██╔╝██║██╔══██║██║ ██╔══██║██║██║╚██╗██║██╔══╝ ██║ ██║ ██║██║╚██╗██║██╔══╝ ██║██║ ██║ ║
45
+ ║ ██║ ╚═╝ ██║██║ ██║╚██████╗██║ ██║██║██║ ╚████║███████╗╚██████╗╚██████╔╝██║ ╚████║██║ ██║╚██████╔╝ ║
46
+ ║ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝╚═╝ ╚═╝ ╚═════╝ ║
47
+ ║ ║
48
+ ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
49
+ """
50
+
51
+ version = get_machineconfig_version()
52
+ title = f"✨ MACHINE CONFIGURATION v{version} ✨"
53
+ subtitle = "🎯 Your digital life manager. Dotfiles, data, code and more."
54
+ bug_report = "🐛 Please report bugs to Alex Al-Saffar @ https://github.com/thisismygitrepo/machineconfig"
55
+
56
+ # Print ASCII art
57
+ console.print(Text(ascii_art, style="bold cyan"))
58
+ console.print()
59
+
60
+ # Print centered text elements
61
+ console.print(Align.center(Text(title, style="bold bright_magenta")))
62
+ console.print(Align.center(Text(subtitle, style="italic bright_blue")))
63
+ console.print()
64
+ console.print(Align.center(Text(bug_report, style="dim white")))
65
+ console.print()
49
66
  def display_completion_message() -> None:
50
- """Display completion message."""
51
67
  completion_text = Text("INSTALLATION COMPLETE", style="bold green")
52
68
  subtitle_text = Text("System setup finished successfully", style="italic green")
53
69
  console.print(Panel(f"✨ {completion_text}\n{subtitle_text}\n\n🎉 Your system has been configured successfully!\n🔄 You may need to reboot to apply all changes.", border_style="green", padding=(1, 2)))
54
70
  def display_dotfiles_instructions() -> None:
55
- """Display instructions for dotfiles migration."""
56
71
  header_text = Text("DOTFILES MIGRATION", style="bold yellow")
57
72
  subtitle_text = Text("Configuration transfer options", style="italic yellow")
58
-
59
73
  instructions = """
60
74
  🖱️ [bold blue]Method 1: USING MOUSE WITHOUT KB OR BROWSER SHARE[/bold blue]
61
75
  On original machine, run:
@@ -73,194 +87,99 @@ def display_dotfiles_instructions() -> None:
73
87
  [dim]cd ~
74
88
  cloud_copy SHARE_URL . --config ss[/dim]
75
89
  (requires symlinks to be created first)"""
76
-
77
90
  console.print(Panel(f"📂 {header_text}\n{subtitle_text}\n\n{instructions}", border_style="yellow", padding=(1, 2)))
78
91
 
79
92
 
80
- def install_windows_desktop_apps() -> bool:
81
- """Install Windows desktop applications using winget."""
82
- if system() != "Windows":
83
- console.print("❌ This function is only available on Windows systems.", style="bold red")
84
- return False
85
-
86
- console.print(Panel("💻 [bold cyan]WINDOWS DESKTOP APPS[/bold cyan]\n[italic]Installing Brave, Windows Terminal, PowerShell, and VSCode[/italic]", border_style="cyan"))
87
-
88
- # Install winget applications
89
- winget_commands = [
90
- ('winget install --no-upgrade --name "Windows Terminal" --Id "Microsoft.WindowsTerminal" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Windows Terminal"),
91
- ('winget install --no-upgrade --name "Powershell" --Id "Microsoft.PowerShell" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing PowerShell"),
92
- ('winget install --no-upgrade --name "Brave" --Id "Brave.Brave" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Brave Browser"),
93
- ('winget install --no-upgrade --name "Microsoft Visual Studio Code" --Id "Microsoft.VisualStudioCode" --source winget --scope user --accept-package-agreements --accept-source-agreements', "Installing Visual Studio Code"),
94
- ]
95
-
96
- success = True
97
- for command, description in winget_commands:
98
- if not run_command(command, description):
99
- success = False
100
-
101
- # Install Nerd Fonts via Python
102
- console.print("🔧 Installing Nerd Fonts", style="bold cyan")
103
- try:
104
- from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
105
- install_nerd_fonts()
106
- console.print("✅ Nerd Fonts installed successfully", style="bold green")
107
- except Exception as e:
108
- console.print(f"❌ Error installing Nerd Fonts: {e}", style="bold red")
109
- success = False
110
-
111
- # Set Windows Terminal settings via Python
112
- console.print("🔧 Setting Windows Terminal settings", style="bold cyan")
113
- try:
114
- from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
115
- set_wt_settings_main()
116
- console.print("✅ Windows Terminal settings configured successfully", style="bold green")
117
- except Exception as e:
118
- console.print(f"❌ Error setting Windows Terminal settings: {e}", style="bold red")
119
- success = False
120
-
121
- return success
122
-
123
-
124
93
  def get_installation_choices() -> list[str]:
125
94
  """Get user choices for installation options."""
126
95
  choices = [
127
- Choice(value="install_apps", title="📥 Install Apps - Install base system applications", checked=False),
128
- Choice(value="upgrade_system", title="🔄 Upgrade System Packages - Update all system packages", checked=False),
129
- Choice(value="install_uv_repos", title="🐍 Install Repos - Set up Python environment and repositories permanently.", checked=False),
130
- Choice(value="install_ssh_server", title="🔒 Install SSH Server - Set up remote access", checked=False),
131
- Choice(value="create_symlinks", title="🔗 Create Symlinks - Set up configuration symlinks (finish dotfiles transfer first)", checked=False),
132
- Choice(value="install_cli_apps", title=" Install CLI Apps - Command-line tools installation", checked=False),
133
- Choice(value="install_dev_tools", title="🛠️ Install Development Tools - rust, libssl-dev, ffmpeg, wezterm, brave, code", checked=False),
134
- Choice(value="retrieve_repositories", title="📚 Retrieve Repositories - Clone repositories to ~/code", checked=False),
135
- Choice(value="retrieve_data", title="💾 Retrieve Data - Backup restoration", checked=False),
136
- Choice(value="install_ascii_art", title="🎨 Install ASCII Art Libraries - Terminal visualization tools", checked=False),
96
+ Choice(value="install_machineconfig", title="🐍 Install machineconfig cli.", checked=False),
97
+ Choice(value="sysabc", title="📥 Install System Package Manager (Needed for other apps to be installed).", checked=False),
98
+ Choice(value="termabc", title=" Install Terminal CLI apps essentials (group `termabc`)", checked=False),
99
+ Choice(value="install_shell_profile", title="🐚 Configure Shell Profile And Map Other Configs.", checked=False),
100
+ Choice(value="install_ssh_server", title="🔒 [ADVANCED] Configure SSH Server", checked=False),
101
+ Choice(value="retrieve_repositories", title="📚 [ADVANCED] Retrieve Repositories", checked=False),
102
+ Choice(value="retrieve_data", title="💾 [ADVANCED] Retrieve Data.", checked=False),
137
103
  ]
138
- # Add Windows-specific options
139
- if system() == "Windows":
140
- choices.append(Choice(value="install_windows_desktop", title="💻 Install Windows Desktop Apps - Brave, Windows Terminal, PowerShell, VSCode (Windows only)", checked=False))
141
104
  selected = questionary.checkbox("Select the installation options you want to execute:", choices=choices, show_description=True).ask()
142
105
  return selected or []
143
106
 
144
107
 
145
108
  def execute_installations(selected_options: list[str]) -> None:
146
- """Execute the selected installation options."""
147
- # Always start with VE setup
148
- console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Setting up base virtual environment[/italic]", border_style="green"))
149
- run_command("curl https://raw.githubusercontent.com/thisismygitrepo/machineconfig/main/src/machineconfig/setup_linux/ve.sh | bash", "Setting up base virtual environment")
150
-
151
- if "install_apps" in selected_options:
152
- console.print(Panel("📦 [bold blue]APPLICATIONS[/bold blue]\n[italic]Installing base system applications[/italic]", border_style="blue"))
153
- if system() == "Windows":
154
- # Windows: Use PowerShell to execute local apps.ps1 script
155
- from machineconfig import setup_windows as module
156
- script = Path(module.__file__).parent / "apps.ps1"
157
- run_command(f'powershell -ExecutionPolicy Bypass -File "{script}"', "Installing Windows applications")
158
- else:
159
- # Linux: Use existing bash script approach
160
- from machineconfig import setup_linux as module
161
- script = Path(module.__file__).parent / "apps.sh"
162
- run_command(f"bash {script}", "Installing Linux base system applications")
163
-
164
- if "upgrade_system" in selected_options:
165
- console.print(Panel("🔄 [bold magenta]SYSTEM UPDATE[/bold magenta]\n[italic]Package management[/italic]", border_style="magenta"))
166
- run_command("sudo nala upgrade -y", "Upgrading system packages")
109
+ for maybe_a_group in selected_options:
110
+ if maybe_a_group in ("termabc", "sysabc"):
111
+ console.print(Panel(" [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
112
+ console.print("🔧 Installing CLI applications", style="bold cyan")
113
+ try:
114
+ from machineconfig.utils.installer_utils.installer_cli import main as devops_devapps_install_main
115
+ devops_devapps_install_main(group=True, which=maybe_a_group, interactive=False)
116
+ console.print("✅ CLI applications installed successfully", style="bold green")
117
+ except Exception as e:
118
+ console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
119
+ if platform.system() != "Windows":
120
+ run_shell_script(". $HOME/.bashrc")
167
121
 
168
- if "install_uv_repos" in selected_options:
122
+ if "install_machineconfig" in selected_options:
169
123
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
170
- from machineconfig import setup_linux as module
171
- script = Path(module.__file__).parent / "repos.sh"
172
- run_command(f"bash {script}", "Setting up Python environment and repositories")
124
+ from machineconfig.scripts.python.helpers_devops.cli_self import install
125
+ install()
173
126
 
174
127
  if "install_ssh_server" in selected_options:
175
128
  console.print(Panel("🔒 [bold red]SSH SERVER[/bold red]\n[italic]Remote access setup[/italic]", border_style="red"))
176
- if system() == "Windows":
129
+ if platform.system() == "Windows":
177
130
  powershell_script = """Write-Host "🔧 Installing and configuring SSH server..."
178
131
  Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
179
132
  Start-Service sshd
180
133
  Set-Service -Name sshd -StartupType 'Automatic'"""
181
- run_command(f'powershell -Command "{powershell_script}"', "Installing and configuring SSH server")
182
- else:
183
- run_command("sudo nala install openssh-server -y", "Installing SSH server")
184
-
185
- if "create_symlinks" in selected_options:
186
- display_dotfiles_instructions()
187
- dotfiles_ready = questionary.confirm("📂 Have you finished copying dotfiles?", default=True).ask()
188
- if dotfiles_ready:
189
- console.print(Panel("🔗 [bold cyan]SYMLINK CREATION[/bold cyan]\n[italic]Configuration setup[/italic]", border_style="cyan"))
190
- console.print("🔧 Creating symlinks", style="bold cyan")
191
- try:
192
- from machineconfig.profile.create import main_symlinks
193
- main_symlinks()
194
- console.print("✅ Symlinks created successfully", style="bold green")
195
- except Exception as e:
196
- console.print(f"❌ Error creating symlinks: {e}", style="bold red")
197
- run_command("sudo chmod 600 $HOME/.ssh/*", "Setting SSH key permissions")
198
- run_command("sudo chmod 700 $HOME/.ssh", "Setting SSH directory permissions")
134
+ run_shell_script(f'powershell -Command "{powershell_script}"')
199
135
  else:
200
- console.print("⏭️ Skipping symlink creation - finish dotfiles transfer first", style="yellow")
136
+ run_shell_script("sudo nala install openssh-server -y")
201
137
 
202
- if "install_cli_apps" in selected_options:
203
- console.print(Panel(" [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
204
- console.print("🔧 Installing CLI applications", style="bold cyan")
138
+ if "install_shell_profile" in selected_options:
139
+ console.print(Panel("🐚 [bold green]SHELL PROFILE[/bold green]\n[italic]Shell configuration setup[/italic]", border_style="green"))
140
+ console.print("🔧 Configuring shell profile", style="bold cyan")
205
141
  try:
206
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
207
- devops_devapps_install_main(which="essentials")
208
- console.print("✅ CLI applications installed successfully", style="bold green")
142
+ from machineconfig.profile.create_shell_profile import create_default_shell_profile
143
+ create_default_shell_profile()
144
+ console.print("✅ Shell profile configured successfully", style="bold green")
145
+ from machineconfig.profile.create_links_export import main_public_from_parser
146
+ main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
147
+ if platform.system() == "Windows":
148
+ from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
149
+ install_nerd_fonts()
150
+ from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
151
+ set_wt_settings_main()
209
152
  except Exception as e:
210
- console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
211
- run_command(". $HOME/.bashrc", "Reloading bash configuration")
212
-
213
- if "install_dev_tools" in selected_options:
214
- console.print(Panel("🛠️ [bold bright_blue]DEVELOPMENT TOOLS[/bold bright_blue]\n[italic]Software development packages[/italic]", border_style="bright_blue"))
215
- run_command("(curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh) || true", "Installing Rust toolchain")
216
- run_command("sudo nala install libssl-dev -y", "Installing libssl-dev")
217
- run_command("sudo nala install ffmpeg -y", "Installing ffmpeg")
218
- console.print("🔧 Installing development applications", style="bold cyan")
219
- try:
220
- from machineconfig.scripts.python.devops_devapps_install import main as devops_devapps_install_main
221
- devops_devapps_install_main(which="wezterm,brave,code")
222
- console.print("✅ Development applications installed successfully", style="bold green")
223
- except Exception as e:
224
- console.print(f"❌ Error installing development applications: {e}", style="bold red")
153
+ console.print(f"❌ Error configuring shell profile: {e}", style="bold red")
225
154
 
226
155
  if "retrieve_repositories" in selected_options:
227
156
  console.print(Panel("📚 [bold bright_magenta]REPOSITORIES[/bold bright_magenta]\n[italic]Project code retrieval[/italic]", border_style="bright_magenta"))
228
- from machineconfig.scripts.python import repos as module
229
- module.main(directory=str(Path.home() / "code"), clone=True, cloud="odg1")
157
+ from machineconfig.scripts.python.helpers_devops import cli_repos
158
+ cli_repos.clone(directory=str(Path.home() / "code"), cloud="odg1")
230
159
 
231
160
  if "retrieve_data" in selected_options:
232
161
  console.print(Panel("💾 [bold bright_cyan]DATA RETRIEVAL[/bold bright_cyan]\n[italic]Backup restoration[/italic]", border_style="bright_cyan"))
233
162
  console.print("🔧 Retrieving backup data", style="bold cyan")
234
163
  try:
235
- from machineconfig.scripts.python.devops_backup_retrieve import main_backup_retrieve
236
- main_backup_retrieve(direction="RETRIEVE")
164
+ from machineconfig.scripts.python.helpers_devops.devops_backup_retrieve import main_backup_retrieve
165
+ main_backup_retrieve(direction="RETRIEVE", cloud=None, which=None)
237
166
  console.print("✅ Backup data retrieved successfully", style="bold green")
238
167
  except Exception as e:
239
168
  console.print(f"❌ Error retrieving backup data: {e}", style="bold red")
240
169
 
241
- if "install_ascii_art" in selected_options:
242
- console.print(Panel("🎨 [bold bright_green]ASCII ART[/bold bright_green]\n[italic]Terminal visualization tools[/italic]", border_style="bright_green"))
243
- from machineconfig import setup_linux as module
244
- script = Path(module.__file__).parent / "web_shortcuts" / "ascii_art.sh"
245
- run_command(f"bash {script}", "Installing ASCII art libraries")
246
-
247
- if "install_windows_desktop" in selected_options:
248
- install_windows_desktop_apps()
249
-
250
170
 
251
171
  def main() -> None:
252
- """Main function to run the interactive installation."""
253
172
  display_header()
254
173
  selected_options = get_installation_choices()
255
174
  if not selected_options:
256
175
  console.print("❌ No options selected. Exiting...", style="bold red")
257
176
  sys.exit(0)
258
- console.print(f"\n✅ Selected options: {', '.join(selected_options)}", style="bold green")
177
+ console.print(f"\n✅ Selected options: {'\n'.join(selected_options)}", style="bold green")
259
178
  proceed = questionary.confirm("🚀 Proceed with installation?", default=True).ask()
260
179
  if not proceed:
261
180
  console.print("❌ Installation cancelled.", style="bold red")
262
181
  sys.exit(0)
263
- execute_installations(selected_options)
182
+ execute_installations(selected_options=selected_options)
264
183
  display_completion_message()
265
184
 
266
185
 
@@ -0,0 +1,63 @@
1
+
2
+ from machineconfig.scripts.python.devops import get_app as get_devops_app
3
+ from machineconfig.scripts.python.cloud import get_app as get_cloud_app
4
+ from machineconfig.scripts.python.agents import get_app as get_agents_app
5
+ from machineconfig.scripts.python.sessions import get_app as get_sessions_app
6
+ from machineconfig.scripts.python.utils import get_app as get_utils_app
7
+
8
+ from machineconfig.scripts.python.ftpx import ftpx as ftpx_func
9
+ from machineconfig.scripts.python.croshell import croshell as croshell_func
10
+ from machineconfig.scripts.python.fire_jobs import fire as get_fire_jobs_app
11
+ from machineconfig.scripts.python.define import get_app as get_define_app
12
+ from machineconfig.scripts.python.terminal import get_app as get_terminal_app
13
+
14
+ def get_app():
15
+ import typer
16
+ app = typer.Typer(help="MachineConfig CLI - Manage your machine configurations and workflows", no_args_is_help=True, add_help_option=False, add_completion=False)
17
+ devops_app = get_devops_app()
18
+ app.add_typer(devops_app, name="devops", help="[d] DevOps related commands", no_args_is_help=True)
19
+ app.add_typer(devops_app, name="d", hidden=True) # short alias
20
+
21
+ cloud_app = get_cloud_app()
22
+ app.add_typer(cloud_app, name="cloud", help="[c] Cloud management commands", no_args_is_help=True)
23
+ app.add_typer(cloud_app, name="c", hidden=True) # short alias
24
+
25
+ sessions_app = get_sessions_app()
26
+ app.add_typer(sessions_app, name="sessions", help="[s] Session and layout management", no_args_is_help=True)
27
+ app.add_typer(sessions_app, name="s", hidden=True) # short alias
28
+
29
+
30
+ agents_app = get_agents_app()
31
+ app.add_typer(agents_app, name="agents", help="[a] 🤖 AI Agents management commands", no_args_is_help=True)
32
+ app.add_typer(agents_app, name="a", hidden=True) # short alias
33
+
34
+ app.command(name="fire", help="[f] Fire and manage jobs", no_args_is_help=False)(get_fire_jobs_app)
35
+ app.command(name="f", hidden=True, no_args_is_help=False)(get_fire_jobs_app)
36
+ app.command("ftpx", no_args_is_help=True, help="[ff] File transfer utility though SSH")(ftpx_func)
37
+ app.command("ff", no_args_is_help=True, hidden=True)(ftpx_func) # short alias
38
+ app.command("croshell", no_args_is_help=False, help="[r] Cross-shell command execution")(croshell_func)
39
+ app.command("r", no_args_is_help=False, hidden=True)(croshell_func) # short alias
40
+
41
+ utils_app = get_utils_app()
42
+ app.add_typer(utils_app, name="utils", help="[u] Utility commands", no_args_is_help=True)
43
+ app.add_typer(utils_app, name="u", hidden=True) # short alias
44
+
45
+ define_app = get_define_app()
46
+ app.add_typer(define_app, name="define", help="[df] Define and manage configurations", no_args_is_help=True)
47
+ app.add_typer(define_app, name="df", hidden=True) # short alias
48
+
49
+
50
+ terminal_app = get_terminal_app()
51
+ app.add_typer(terminal_app, name="terminal", help="[t] Terminal management commands", no_args_is_help=True)
52
+ app.add_typer(terminal_app, name="t", hidden=True) # short alias
53
+
54
+ return app
55
+
56
+
57
+ def main():
58
+ app = get_app()
59
+ app()
60
+
61
+
62
+ if __name__ == "__main__":
63
+ main()