machineconfig 5.15__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 (389) 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 +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -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
+
@@ -19,9 +19,7 @@ for better user experience with checkbox selections.
19
19
 
20
20
  import sys
21
21
  from pathlib import Path
22
- from platform import system
23
- from typing import cast
24
-
22
+ import platform
25
23
  import questionary
26
24
  from questionary import Choice
27
25
  from rich.console import Console
@@ -29,14 +27,42 @@ 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
- _ = cast
33
30
  console = Console()
34
31
 
35
32
 
36
33
  def display_header() -> None:
37
- header_text = Text("MACHINE CONFIGURATION", style="bold magenta")
38
- subtitle_text = Text("Interactive Installation Script", style="italic cyan")
39
- 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()
40
66
  def display_completion_message() -> None:
41
67
  completion_text = Text("INSTALLATION COMPLETE", style="bold green")
42
68
  subtitle_text = Text("System setup finished successfully", style="italic green")
@@ -67,68 +93,40 @@ def display_dotfiles_instructions() -> None:
67
93
  def get_installation_choices() -> list[str]:
68
94
  """Get user choices for installation options."""
69
95
  choices = [
70
- Choice(value="upgrade_system", title="🔄 Upgrade System Packages - Update all system packages", checked=False),
71
- Choice(value="ESSENTIAL_SYSTEM", title="📥 Install Apps - Install base system applications", checked=False),
72
- Choice(value="ESSENTIAL", title="⚡ Install CLI Apps - Command-line tools installation", checked=False),
73
- Choice(value="DEV_SYSTEM", title="🛠️ Install Development Tools - rust, libssl-dev, ffmpeg, wezterm, brave, code", checked=False),
74
- Choice(value="TerminalEyeCandy", title="🎨 Install ASCII Art Libraries - Terminal visualization tools", checked=False),
75
- Choice(value="install_repos", title="🐍 Install Repos - Set up Python environment and repositories permanently.", checked=False),
76
- Choice(value="install_ssh_server", title="🔒 Install SSH Server - Set up remote access", checked=False),
77
- Choice(value="install_shell_profile", title="🐚 Configure Shell Profile - Source machineconfig shell initialization", checked=False),
78
- Choice(value="create_symlinks", title="🔗 Create Symlinks - Set up configuration symlinks (finish dotfiles transfer first)", checked=False),
79
- Choice(value="retrieve_repositories", title="📚 Retrieve Repositories - Clone repositories to ~/code", checked=False),
80
- Choice(value="retrieve_data", title="💾 Retrieve Data - Backup restoration", 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),
81
103
  ]
82
- # Add Windows-specific options
83
- if system() == "Windows":
84
- choices.append(Choice(value="install_windows_desktop", title="💻 Install Windows Desktop Apps - Brave, Windows Terminal, PowerShell, VSCode (Windows only)", checked=False))
85
104
  selected = questionary.checkbox("Select the installation options you want to execute:", choices=choices, show_description=True).ask()
86
105
  return selected or []
87
106
 
88
107
 
89
108
  def execute_installations(selected_options: list[str]) -> None:
90
- if system() == "Windows":
91
- from machineconfig import setup_windows as module
92
- script_path = Path(module.__file__).parent / "ve.ps1"
93
- run_shell_script(script_path.read_text(encoding="utf-8"))
94
- else:
95
- from machineconfig import setup_linux as module
96
- script_path = Path(module.__file__).parent / "ve.sh"
97
- run_shell_script(script_path.read_text(encoding="utf-8"))
98
-
99
109
  for maybe_a_group in selected_options:
100
- if maybe_a_group in ("ESSENTIAL", "DEV", "ESSENTIAL_SYSTEM", "DEV_SYSTEM", "TerminalEyeCandy"):
110
+ if maybe_a_group in ("termabc", "sysabc"):
101
111
  console.print(Panel("⚡ [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
102
112
  console.print("🔧 Installing CLI applications", style="bold cyan")
103
113
  try:
104
- from machineconfig.utils.installer_utils.installer import main as devops_devapps_install_main
105
- devops_devapps_install_main(group=maybe_a_group) # type: ignore
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)
106
116
  console.print("✅ CLI applications installed successfully", style="bold green")
107
117
  except Exception as e:
108
118
  console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
109
- run_shell_script(". $HOME/.bashrc")
110
-
111
- if "upgrade_system" in selected_options:
112
- if system() == "Windows":
113
- console.print("❌ System upgrade is not applicable on Windows via this script.", style="bold red")
114
- elif system() == "Linux":
115
- console.print(Panel("🔄 [bold magenta]SYSTEM UPDATE[/bold magenta]\n[italic]Package management[/italic]", border_style="magenta"))
116
- run_shell_script("sudo nala upgrade -y")
117
- else:
118
- console.print(f"❌ System upgrade not supported on {system()}.", style="bold red")
119
- if "install_repos" in selected_options:
119
+ if platform.system() != "Windows":
120
+ run_shell_script(". $HOME/.bashrc")
121
+
122
+ if "install_machineconfig" in selected_options:
120
123
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
121
- if system() == "Windows":
122
- from machineconfig import setup_windows as module
123
- script_path = Path(module.__file__).parent / "repos.ps1"
124
- else:
125
- from machineconfig import setup_linux as module
126
- script_path = Path(module.__file__).parent / "repos.sh"
127
- run_shell_script(script_path.read_text(encoding="utf-8"))
124
+ from machineconfig.scripts.python.helpers_devops.cli_self import install
125
+ install()
128
126
 
129
127
  if "install_ssh_server" in selected_options:
130
128
  console.print(Panel("🔒 [bold red]SSH SERVER[/bold red]\n[italic]Remote access setup[/italic]", border_style="red"))
131
- if system() == "Windows":
129
+ if platform.system() == "Windows":
132
130
  powershell_script = """Write-Host "🔧 Installing and configuring SSH server..."
133
131
  Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
134
132
  Start-Service sshd
@@ -141,54 +139,36 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
141
139
  console.print(Panel("🐚 [bold green]SHELL PROFILE[/bold green]\n[italic]Shell configuration setup[/italic]", border_style="green"))
142
140
  console.print("🔧 Configuring shell profile", style="bold cyan")
143
141
  try:
144
- from machineconfig.profile.create import main_profile
145
-
146
- main_profile()
142
+ from machineconfig.profile.create_shell_profile import create_default_shell_profile
143
+ create_default_shell_profile()
147
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()
148
152
  except Exception as e:
149
153
  console.print(f"❌ Error configuring shell profile: {e}", style="bold red")
150
154
 
151
- if "create_symlinks" in selected_options:
152
- display_dotfiles_instructions()
153
- dotfiles_ready = questionary.confirm("📂 Have you finished copying dotfiles?", default=True).ask()
154
- if dotfiles_ready:
155
- console.print(Panel("🔗 [bold cyan]SYMLINK CREATION[/bold cyan]\n[italic]Configuration setup[/italic]", border_style="cyan"))
156
- console.print("🔧 Creating symlinks", style="bold cyan")
157
- try:
158
- from machineconfig.profile.create import main_symlinks
159
- main_symlinks()
160
- console.print("✅ Symlinks created successfully", style="bold green")
161
- except Exception as e:
162
- console.print(f"❌ Error creating symlinks: {e}", style="bold red")
163
- run_shell_script("sudo chmod 600 $HOME/.ssh/*")
164
- run_shell_script("sudo chmod 700 $HOME/.ssh")
165
- else:
166
- console.print("⏭️ Skipping symlink creation - finish dotfiles transfer first", style="yellow")
167
-
168
155
  if "retrieve_repositories" in selected_options:
169
156
  console.print(Panel("📚 [bold bright_magenta]REPOSITORIES[/bold bright_magenta]\n[italic]Project code retrieval[/italic]", border_style="bright_magenta"))
170
- from machineconfig.scripts.python import repos
171
- repos.clone(directory=str(Path.home() / "code"), cloud="odg1")
157
+ from machineconfig.scripts.python.helpers_devops import cli_repos
158
+ cli_repos.clone(directory=str(Path.home() / "code"), cloud="odg1")
172
159
 
173
160
  if "retrieve_data" in selected_options:
174
161
  console.print(Panel("💾 [bold bright_cyan]DATA RETRIEVAL[/bold bright_cyan]\n[italic]Backup restoration[/italic]", border_style="bright_cyan"))
175
162
  console.print("🔧 Retrieving backup data", style="bold cyan")
176
163
  try:
177
- from machineconfig.scripts.python.devops_backup_retrieve import main_backup_retrieve
178
- 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)
179
166
  console.print("✅ Backup data retrieved successfully", style="bold green")
180
167
  except Exception as e:
181
168
  console.print(f"❌ Error retrieving backup data: {e}", style="bold red")
182
169
 
183
- if "install_windows_desktop" in selected_options:
184
- from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
185
- install_nerd_fonts()
186
- from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
187
- set_wt_settings_main()
188
-
189
170
 
190
171
  def main() -> None:
191
- """Main function to run the interactive installation."""
192
172
  display_header()
193
173
  selected_options = get_installation_choices()
194
174
  if not selected_options:
@@ -199,7 +179,7 @@ def main() -> None:
199
179
  if not proceed:
200
180
  console.print("❌ Installation cancelled.", style="bold red")
201
181
  sys.exit(0)
202
- execute_installations(selected_options)
182
+ execute_installations(selected_options=selected_options)
203
183
  display_completion_message()
204
184
 
205
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()
@@ -0,0 +1,21 @@
1
+
2
+ import typer
3
+
4
+
5
+ def machineconfig_find():
6
+ from machineconfig.scripts.python.helpers_msearch import FZFG_LINUX_PATH, FZFG_WINDOWS_PATH
7
+ import platform
8
+ if platform.system() == "Linux":
9
+ script_path = FZFG_LINUX_PATH
10
+ elif platform.system() == "Windows":
11
+ script_path = FZFG_WINDOWS_PATH
12
+ else:
13
+ raise RuntimeError("Unsupported platform")
14
+ from machineconfig.utils.code import exit_then_run_shell_script
15
+ exit_then_run_shell_script(script=script_path.read_text(encoding="utf-8"), strict=False)
16
+
17
+
18
+ def main():
19
+ app = typer.Typer(add_completion=False, no_args_is_help=True)
20
+ app.command(name="msearch", help="machineconfig search helper", no_args_is_help=False)(machineconfig_find)
21
+ app()
File without changes
@@ -12,9 +12,7 @@ BOX_WIDTH = 150 # width for box drawing
12
12
  def main() -> None:
13
13
  title = "🔑 SSH IDENTITY MANAGEMENT"
14
14
  print(Panel(Text(title, justify="center"), expand=False))
15
-
16
15
  print(Panel("🔍 Searching for existing SSH keys...", expand=False))
17
-
18
16
  private_keys = [x.with_name(x.stem) for x in PathExtended.home().joinpath(".ssh").search("*.pub")]
19
17
  private_keys = [x for x in private_keys if x.exists()]
20
18
  if private_keys:
@@ -2,20 +2,20 @@
2
2
 
3
3
  from platform import system
4
4
  from machineconfig.utils.source_of_truth import LIBRARY_ROOT
5
- from machineconfig.utils.options import choose_from_options
6
5
  from machineconfig.utils.path_extended import PathExtended
7
6
  from rich.console import Console
8
7
  from rich.panel import Panel
9
- from rich import box # Import box
8
+ from rich import box
9
+ from typing import Optional, Annotated
10
+ import typer
10
11
 
11
12
 
12
13
  console = Console()
13
14
 
14
15
 
15
- def get_add_ssh_key_script(path_to_key: PathExtended):
16
+ def get_add_ssh_key_script(path_to_key: PathExtended) -> str:
16
17
  console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
17
-
18
- if system() == "Linux":
18
+ if system() == "Linux" or system() == "Darwin":
19
19
  authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
20
20
  console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
21
21
  elif system() == "Windows":
@@ -30,16 +30,15 @@ def get_add_ssh_key_script(path_to_key: PathExtended):
30
30
  keys_text = authorized_keys.read_text(encoding="utf-8").split(split)
31
31
  key_count = len([k for k in keys_text if k.strip()])
32
32
  console.print(Panel(f"🔍 Current SSH authorization status\n✅ Found {key_count} authorized key(s)", title="[bold blue]Status[/bold blue]"))
33
-
34
33
  if path_to_key.read_text(encoding="utf-8") in authorized_keys.read_text(encoding="utf-8"):
35
34
  console.print(Panel(f"⚠️ Key already authorized\nKey: {path_to_key.name}\nStatus: Already present in authorized_keys file\nNo action required", title="[bold yellow]Warning[/bold yellow]"))
36
35
  program = ""
37
36
  else:
38
37
  console.print(Panel(f"➕ Adding new SSH key to authorized keys\n🔑 Key file: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
39
- if system() == "Linux":
38
+ if system() == "Linux" or system() == "Darwin":
40
39
  program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
41
40
  elif system() == "Windows":
42
- program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
41
+ program_path = LIBRARY_ROOT.joinpath("setup_windows/add-sshkey.ps1")
43
42
  program = program_path.expanduser().read_text(encoding="utf-8")
44
43
  place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
45
44
  assert place_holder in program, f"This section performs string manipulation on the script {program_path} to add the key to the authorized_keys file. The script has changed and the string {place_holder} is not found."
@@ -49,16 +48,15 @@ def get_add_ssh_key_script(path_to_key: PathExtended):
49
48
  raise NotImplementedError
50
49
  else:
51
50
  console.print(Panel(f"📝 Creating new authorized_keys file\n🔑 Using key: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
52
- if system() == "Linux":
51
+ if system() == "Linux" or system() == "Darwin":
53
52
  program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
54
53
  else:
55
54
  program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
56
55
  program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
57
56
  console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
58
57
 
59
- if system() == "Linux":
58
+ if system() == "Linux" or system() == "Darwin":
60
59
  program += """
61
-
62
60
  sudo chmod 700 ~/.ssh
63
61
  sudo chmod 644 ~/.ssh/authorized_keys
64
62
  sudo chmod 644 ~/.ssh/*.pub
@@ -68,51 +66,83 @@ sudo service ssh --full-restart
68
66
  return program
69
67
 
70
68
 
71
- def main() -> None:
72
- console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
73
-
74
- console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
75
-
76
- pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
77
-
78
- if pub_keys:
79
- console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
80
- else:
81
- console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
69
+ """
70
+ Common pitfalls:
71
+ 🚫 Wrong line endings (LF/CRLF) in config files
72
+ 🌐 Network port conflicts (try 2222 -> 2223) between WSL and Windows
73
+ sudo service ssh restart
74
+ sudo service ssh status
75
+ sudo nano /etc/ssh/sshd_config
76
+ """
82
77
 
83
- all_keys_option = f"all pub keys available ({len(pub_keys)})"
84
- i_have_path_option = "I have the path to the key file"
85
- i_paste_option = "I want to paste the key itself"
86
78
 
87
- res = choose_from_options("Which public key to add? ", options=[str(x) for x in pub_keys] + [all_keys_option, i_have_path_option, i_paste_option], multi=False)
88
- if res == all_keys_option:
79
+ def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to the public key file")] = None,
80
+ pub_choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh")] = False,
81
+ pub_val: Annotated[bool, typer.Option(..., "--paste", "-p", help="Paste the public key content manually")] = False,
82
+ from_github: Annotated[Optional[str], typer.Option(..., "--from-github", "-g", help="Fetch public keys from a GitHub username")] = None
83
+ ) -> None:
84
+
85
+ if pub_path:
86
+ key_path = PathExtended(pub_path).expanduser().absolute()
87
+ key_path.parent.mkdir(parents=True, exist_ok=True)
88
+ if not key_path.exists():
89
+ console.print(Panel(f"❌ ERROR: Provided key path does not exist\nPath: {key_path}", title="[bold red]Error[/bold red]"))
90
+ raise FileNotFoundError(f"Provided key path does not exist: {key_path}")
91
+ console.print(Panel(f"📄 Using provided public key file: {key_path}", title="[bold blue]Info[/bold blue]"))
92
+ program = get_add_ssh_key_script(key_path)
93
+ from machineconfig.utils.code import run_shell_script
94
+ run_shell_script(script=program)
95
+ console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
96
+ return
97
+ elif pub_choose:
98
+ console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
99
+ console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
100
+ pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
101
+ if pub_keys:
102
+ console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
103
+ else:
104
+ console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
105
+ return
89
106
  console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
90
107
  program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
91
108
 
92
- elif res == i_have_path_option:
93
- console.print(Panel("📂 Please provide the path to your public key", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
94
- key_path = PathExtended(input("📋 Path: ")).expanduser().absolute()
95
- console.print(Panel(f"📄 Using key from path: {key_path}", title="[bold blue]Info[/bold blue]", border_style="blue"))
96
- program = get_add_ssh_key_script(key_path)
97
-
98
- elif res == i_paste_option:
109
+ elif pub_val:
99
110
  console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
100
111
  key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
101
112
  key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
113
+ key_path.parent.mkdir(parents=True, exist_ok=True)
102
114
  key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
103
115
  console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
104
116
  program = get_add_ssh_key_script(key_path)
105
-
117
+ elif from_github:
118
+ console.print(Panel(f"🌐 Fetching public keys from GitHub user: {from_github}", title="[bold blue]GitHub Fetch[/bold blue]", border_style="blue"))
119
+ import requests
120
+ response = requests.get(f"https://api.github.com/users/{from_github}/keys")
121
+ if response.status_code != 200:
122
+ console.print(Panel(f"❌ ERROR: Failed to fetch keys from GitHub user {from_github}\nStatus Code: {response.status_code}", title="[bold red]Error[/bold red]", border_style="red"))
123
+ raise RuntimeError(f"Failed to fetch keys from GitHub user {from_github}: Status Code {response.status_code}")
124
+ keys = response.json()
125
+ if not keys:
126
+ console.print(Panel(f"⚠️ No public keys found for GitHub user: {from_github}", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
127
+ return
128
+ console.print(Panel(f"✅ Found {len(keys)} public key(s) for user: {from_github}", title="[bold green]Success[/bold green]", border_style="green"))
129
+ key_path = PathExtended.home().joinpath(f".ssh/{from_github}_github_keys.pub")
130
+ key_path.parent.mkdir(parents=True, exist_ok=True)
131
+ key_path.write_text("\n".join([key["key"] for key in keys]), encoding="utf-8")
132
+ console.print(Panel(f"💾 Keys saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
133
+ program = get_add_ssh_key_script(key_path)
106
134
  else:
107
- console.print(Panel(f"🔑 Using selected key: {PathExtended(res).name}", title="[bold blue]Info[/bold blue]", border_style="blue"))
108
- program = get_add_ssh_key_script(PathExtended(res))
109
-
135
+ console.print(Panel(" ERROR: No method provided to add SSH key\nUse --help for options", title="[bold red]Error[/bold red]", border_style="red"))
136
+ raise ValueError("No method provided to add SSH key. Use --help for options.")
110
137
  console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
111
-
112
- # return program
113
- import subprocess
114
-
115
- subprocess.run(program, shell=True, check=True)
138
+ from machineconfig.utils.code import run_shell_script
139
+ run_shell_script(script=program)
140
+ import socket
141
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
142
+ s.connect(('8.8.8.8', 80))
143
+ local_ip_v4 = s.getsockname()[0]
144
+ s.close()
145
+ console.print(Panel(f"🌐 This computer is accessible at: {local_ip_v4}", title="[bold green]Network Info[/bold green]", border_style="green"))
116
146
  console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
117
147
 
118
148
 
@@ -5,7 +5,7 @@
5
5
  # mkdir ~/data/local
6
6
  # sudo mount -o nolock,noatime,nodiratime,proto=tcp,timeo=600,retrans=2,noac alex-p51s-5:/home/alex/data/local ./data/local
7
7
 
8
- uv run --python 3.13 --no-dev --project $HOME/code/machineconfig python -m machineconfig.scripts.python.mount_nfs
8
+ uv run --python 3.14 --with "machineconfig>=7.32" python -m machineconfig.scripts.python.mount_nfs
9
9
  # Check if remote server is reachable and share folder exists
10
10
  if ! ping -c 1 "$remote_server" &> /dev/null; then
11
11
  echo "💥 Error: Remote server $remote_server is not reachable."
@@ -19,9 +19,9 @@ def main():
19
19
  print("\n🔍 Interactive mode selected for choosing share path.")
20
20
  tmp = choose_ssh_host(multi=False)
21
21
  assert isinstance(tmp, str)
22
- ssh = SSH(tmp)
23
- default = f"{ssh.hostname}:{ssh.run('echo $HOME').op}/data/share_nfs"
24
- share_info = choose_from_options(msg="📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run("cat /etc/exports").op.split("\n") if not item.startswith("#")] + [default], default=default, multi=False)
22
+ ssh = SSH(host=tmp, username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
23
+ default = f"{ssh.hostname}:{ssh.run_shell(command='echo $HOME', verbose_output=False, description='Get home directory', strict_stderr=False, strict_return_code=True).op}/data/share_nfs"
24
+ share_info = choose_from_options(msg="📂 Choose a share path:", options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run_shell(command="cat /etc/exports", verbose_output=False, description='Get NFS exports', strict_stderr=False, strict_return_code=False).op.split("\n") if not item.startswith("#")] + [default], default=default, multi=False)
25
25
  assert isinstance(share_info, str), f"❌ share_info must be a string. Got {type(share_info)}"
26
26
 
27
27
  remote_server = share_info.split(":")[0]