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,511 @@
1
+ """Machine Status Display - Comprehensive system and configuration overview"""
2
+
3
+ import platform
4
+ import shutil
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from rich.console import Console
9
+ from rich.panel import Panel
10
+ from rich.table import Table
11
+ from rich.text import Text
12
+
13
+ from machineconfig.utils.path_extended import PathExtended
14
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT, DEFAULTS_PATH, LIBRARY_ROOT
15
+
16
+
17
+ console = Console()
18
+
19
+
20
+ def _check_system_info() -> dict[str, str]:
21
+ """Gather basic system information."""
22
+ import socket
23
+ import os
24
+
25
+ return {
26
+ "hostname": socket.gethostname(),
27
+ "system": platform.system(),
28
+ "release": platform.release(),
29
+ "version": platform.version(),
30
+ "machine": platform.machine(),
31
+ "processor": platform.processor() or "Unknown",
32
+ "python_version": platform.python_version(),
33
+ "user": os.getenv("USER") or os.getenv("USERNAME") or "Unknown",
34
+ }
35
+
36
+
37
+ def _check_shell_profile_status() -> dict[str, Any]:
38
+ """Check shell profile configuration status."""
39
+ from machineconfig.profile.create_shell_profile import get_shell_profile_path
40
+
41
+ try:
42
+ profile_path = get_shell_profile_path()
43
+ if not profile_path.exists():
44
+ profile_path.parent.mkdir(parents=True, exist_ok=True)
45
+ profile_path.touch()
46
+ profile_content = profile_path.read_text(encoding="utf-8")
47
+ system_name = platform.system()
48
+ if system_name == "Windows":
49
+ init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/pwsh/init.ps1")
50
+ init_script_copy = PathExtended(CONFIG_ROOT).joinpath("profile/init.ps1").collapseuser()
51
+ source_reference = f". {str(init_script.collapseuser()).replace('~', '$HOME')}"
52
+ source_copy = f". {str(init_script_copy).replace('~', '$HOME')}"
53
+ else:
54
+ init_script = PathExtended(CONFIG_ROOT).joinpath("settings/shells/bash/init.sh")
55
+ init_script_copy = PathExtended(CONFIG_ROOT).joinpath("profile/init.sh").collapseuser()
56
+ source_reference = f"source {str(init_script.collapseuser()).replace('~', '$HOME')}"
57
+ source_copy = f"source {str(init_script_copy).replace('~', '$HOME')}"
58
+
59
+ configured = source_reference in profile_content or source_copy in profile_content
60
+ method = "reference" if source_reference in profile_content else ("copy" if source_copy in profile_content else "none")
61
+
62
+ return {
63
+ "profile_path": str(profile_path),
64
+ "exists": True,
65
+ "configured": configured,
66
+ "method": method,
67
+ "init_script_exists": init_script.exists(),
68
+ "init_script_copy_exists": init_script_copy.exists(),
69
+ }
70
+ except Exception as ex:
71
+ return {
72
+ "profile_path": "Error",
73
+ "exists": False,
74
+ "configured": False,
75
+ "method": "error",
76
+ "error": str(ex),
77
+ "init_script_exists": False,
78
+ "init_script_copy_exists": False,
79
+ }
80
+
81
+
82
+ def _check_repos_status() -> dict[str, Any]:
83
+ """Check configured repositories status."""
84
+ from machineconfig.utils.io import read_ini
85
+
86
+ try:
87
+ repos_str = read_ini(DEFAULTS_PATH)["general"]["repos"]
88
+ repo_paths = [Path(p.strip()).expanduser() for p in repos_str.split(",") if p.strip()]
89
+
90
+ repos_info = []
91
+ for repo_path in repo_paths:
92
+ if not repo_path.exists():
93
+ repos_info.append({"path": str(repo_path), "name": repo_path.name, "exists": False, "is_repo": False})
94
+ continue
95
+
96
+ try:
97
+ import git
98
+
99
+ repo = git.Repo(str(repo_path))
100
+ repos_info.append(
101
+ {
102
+ "path": str(repo_path),
103
+ "name": repo_path.name,
104
+ "exists": True,
105
+ "is_repo": True,
106
+ "clean": not repo.is_dirty(untracked_files=True),
107
+ "branch": repo.active_branch.name if not repo.head.is_detached else "DETACHED",
108
+ }
109
+ )
110
+ except Exception:
111
+ repos_info.append({"path": str(repo_path), "name": repo_path.name, "exists": True, "is_repo": False})
112
+
113
+ return {"configured": True, "count": len(repos_info), "repos": repos_info}
114
+ except (FileNotFoundError, KeyError, IndexError):
115
+ return {"configured": False, "count": 0, "repos": []}
116
+
117
+
118
+ def _check_ssh_status() -> dict[str, Any]:
119
+ """Check SSH configuration status."""
120
+ ssh_dir = PathExtended.home().joinpath(".ssh")
121
+ if not ssh_dir.exists():
122
+ return {"ssh_dir_exists": False, "keys": [], "config_exists": False, "authorized_keys_exists": False, "known_hosts_exists": False}
123
+
124
+ keys = []
125
+ for pub_key in ssh_dir.glob("*.pub"):
126
+ private_key = pub_key.with_suffix("")
127
+ keys.append(
128
+ {
129
+ "name": pub_key.stem,
130
+ "public_exists": True,
131
+ "private_exists": private_key.exists(),
132
+ "public_path": str(pub_key),
133
+ "private_path": str(private_key),
134
+ }
135
+ )
136
+
137
+ config_file = ssh_dir.joinpath("config")
138
+ authorized_keys = ssh_dir.joinpath("authorized_keys")
139
+ known_hosts = ssh_dir.joinpath("known_hosts")
140
+
141
+ return {
142
+ "ssh_dir_exists": True,
143
+ "keys": keys,
144
+ "config_exists": config_file.exists(),
145
+ "authorized_keys_exists": authorized_keys.exists(),
146
+ "known_hosts_exists": known_hosts.exists(),
147
+ "ssh_dir_path": str(ssh_dir),
148
+ }
149
+
150
+
151
+ def _check_config_files_status() -> dict[str, Any]:
152
+ """Check public and private configuration files status."""
153
+ from machineconfig.profile.create_links import read_mapper
154
+
155
+ try:
156
+ mapper = read_mapper()
157
+ public_configs = list(mapper.get("public", {}).keys())
158
+ private_configs = list(mapper.get("private", {}).keys())
159
+
160
+ public_count = len(public_configs)
161
+ private_count = len(private_configs)
162
+
163
+ public_linked = 0
164
+ for config_name in public_configs:
165
+ for config_item in mapper["public"][config_name]:
166
+ target_path = PathExtended(config_item["config_file_default_path"]).expanduser()
167
+ if target_path.exists():
168
+ public_linked += 1
169
+ break
170
+
171
+ private_linked = 0
172
+ for config_name in private_configs:
173
+ for config_item in mapper["private"][config_name]:
174
+ target_path = PathExtended(config_item["config_file_default_path"]).expanduser()
175
+ if target_path.exists():
176
+ private_linked += 1
177
+ break
178
+
179
+ return {
180
+ "public_count": public_count,
181
+ "public_linked": public_linked,
182
+ "private_count": private_count,
183
+ "private_linked": private_linked,
184
+ "public_configs": public_configs,
185
+ "private_configs": private_configs,
186
+ }
187
+ except Exception as ex:
188
+ return {
189
+ "public_count": 0,
190
+ "public_linked": 0,
191
+ "private_count": 0,
192
+ "private_linked": 0,
193
+ "error": str(ex),
194
+ "public_configs": [],
195
+ "private_configs": [],
196
+ }
197
+
198
+
199
+ def _check_important_tools() -> dict[str, dict[str, bool]]:
200
+ """Check if important CLI tools are installed, organized by groups."""
201
+ from machineconfig.jobs.installer.package_groups import PACKAGE_GROUP2NAMES
202
+
203
+ group_status = {}
204
+ for group_name, tools in PACKAGE_GROUP2NAMES.items():
205
+ tool_status = {}
206
+ for tool in tools:
207
+ tool_status[tool] = shutil.which(tool) is not None
208
+ group_status[group_name] = tool_status
209
+
210
+ return group_status
211
+
212
+
213
+ def _check_backup_config() -> dict[str, Any]:
214
+ """Check backup configuration status."""
215
+ from machineconfig.utils.io import read_ini
216
+ import tomllib
217
+
218
+ try:
219
+ cloud_config = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
220
+ except (FileNotFoundError, KeyError, IndexError):
221
+ cloud_config = "Not configured"
222
+
223
+ try:
224
+ backup_file = LIBRARY_ROOT.joinpath("profile/backup.toml")
225
+ if backup_file.exists():
226
+ backup_data = tomllib.loads(backup_file.read_text(encoding="utf-8"))
227
+ backup_items = list(backup_data.keys())
228
+ backup_items_count = len(backup_items)
229
+ else:
230
+ backup_items = []
231
+ backup_items_count = 0
232
+ except Exception:
233
+ backup_items = []
234
+ backup_items_count = 0
235
+
236
+ return {"cloud_config": cloud_config, "backup_items_count": backup_items_count, "backup_items": backup_items}
237
+
238
+
239
+ def _display_system_info(info: dict[str, str]) -> None:
240
+ """Display system information panel."""
241
+ console.rule("[bold blue]💻 System Information[/bold blue]")
242
+
243
+ table = Table(show_header=False, box=None, padding=(0, 1), expand=False)
244
+ table.add_column("Property", style="cyan", no_wrap=True)
245
+ table.add_column("Value", style="white")
246
+
247
+ table.add_row("🏠 Hostname", info["hostname"])
248
+ table.add_row("💿 System", f"{info['system']} {info['release']}")
249
+ table.add_row("🖥️ Machine", info["machine"])
250
+ table.add_row("⚙️ Processor", info["processor"])
251
+ table.add_row("🐍 Python", info["python_version"])
252
+ table.add_row("👤 User", info["user"])
253
+
254
+ console.print(Panel(table, title="System", border_style="blue", padding=(1, 2), expand=False))
255
+
256
+
257
+ def _display_shell_status(status: dict[str, Any]) -> None:
258
+ """Display shell profile status panel."""
259
+ console.rule("[bold green]🐚 Shell Profile[/bold green]")
260
+
261
+ if "error" in status:
262
+ console.print(Panel(f"❌ Error: {status['error']}", title="Shell Profile", border_style="red", padding=(1, 2), expand=False))
263
+ return
264
+
265
+ from rich.columns import Columns
266
+
267
+ left_table = Table(show_header=False, box=None, padding=(0, 1))
268
+ left_table.add_column("Item", style="cyan", no_wrap=True)
269
+ left_table.add_column("Status")
270
+
271
+ left_table.add_row("📄 Profile", status["profile_path"])
272
+ left_table.add_row(f"{'✅' if status['exists'] else '❌'} Exists", str(status["exists"]))
273
+ left_table.add_row(f"{'✅' if status['configured'] else '❌'} Configured", str(status["configured"]))
274
+
275
+ right_table = Table(show_header=False, box=None, padding=(0, 1))
276
+ right_table.add_column("Item", style="cyan", no_wrap=True)
277
+ right_table.add_column("Status")
278
+
279
+ right_table.add_row("🔧 Method", status["method"])
280
+ right_table.add_row(f"{'✅' if status['init_script_exists'] else '❌'} Init (source)", str(status["init_script_exists"]))
281
+ right_table.add_row(f"{'✅' if status['init_script_copy_exists'] else '❌'} Init (copy)", str(status["init_script_copy_exists"]))
282
+
283
+ border_style = "green" if status["configured"] else "yellow"
284
+ console.print(
285
+ Panel(
286
+ Columns([left_table, right_table], equal=True, expand=True),
287
+ title="Shell Profile",
288
+ border_style=border_style,
289
+ padding=(1, 2),
290
+ expand=False,
291
+ )
292
+ )
293
+
294
+
295
+ def _display_repos_status(status: dict[str, Any]) -> None:
296
+ """Display configured repositories status."""
297
+ console.rule("[bold cyan]📚 Configured Repositories[/bold cyan]")
298
+
299
+ if not status["configured"]:
300
+ console.print(Panel(f"⚠️ No repositories configured in {DEFAULTS_PATH}", title="Repositories", border_style="yellow", padding=(1, 2)))
301
+ return
302
+
303
+ if status["count"] == 0:
304
+ console.print(Panel("ℹ️ No repositories configured", title="Repositories", border_style="blue", padding=(1, 2)))
305
+ return
306
+
307
+ table = Table(show_lines=True, header_style="bold cyan")
308
+ table.add_column("Repository", style="bold")
309
+ table.add_column("Status")
310
+ table.add_column("Details")
311
+
312
+ for repo in status["repos"]:
313
+ name = repo["name"]
314
+ if not repo["exists"]:
315
+ table.add_row(f"❌ {name}", "Missing", f"Path: {repo['path']}")
316
+ elif not repo["is_repo"]:
317
+ table.add_row(f"⚠️ {name}", "Not a repo", f"Path: {repo['path']}")
318
+ else:
319
+ status_icon = "✅" if repo["clean"] else "⚠️"
320
+ status_text = "Clean" if repo["clean"] else "Uncommitted changes"
321
+ table.add_row(f"{status_icon} {name}", status_text, f"Branch: {repo['branch']}")
322
+
323
+ console.print(Panel(table, title=f"Repositories ({status['count']})", border_style="cyan", padding=(1, 2)))
324
+
325
+
326
+ def _display_ssh_status(status: dict[str, Any]) -> None:
327
+ """Display SSH configuration status."""
328
+ console.rule("[bold yellow]🔐 SSH Configuration[/bold yellow]")
329
+
330
+ if not status["ssh_dir_exists"]:
331
+ console.print(Panel("❌ SSH directory (~/.ssh) does not exist", title="SSH Status", border_style="red", padding=(1, 2), expand=False))
332
+ return
333
+
334
+ from rich.columns import Columns
335
+
336
+ config_table = Table(show_header=False, box=None, padding=(0, 1))
337
+ config_table.add_column("Item", style="cyan", no_wrap=True)
338
+ config_table.add_column("Status")
339
+
340
+ config_table.add_row("📁 Directory", status["ssh_dir_path"])
341
+ config_table.add_row(f"{'✅' if status['config_exists'] else '❌'} Config", str(status["config_exists"]))
342
+ config_table.add_row(f"{'✅' if status['authorized_keys_exists'] else '❌'} Auth Keys", str(status["authorized_keys_exists"]))
343
+ config_table.add_row(f"{'✅' if status['known_hosts_exists'] else '❌'} Known Hosts", str(status["known_hosts_exists"]))
344
+
345
+ config_panel = Panel(config_table, title="SSH Config", border_style="yellow", padding=(1, 2), expand=False)
346
+
347
+ if status["keys"]:
348
+ keys_table = Table(show_header=True, box=None, padding=(0, 1), show_lines=False, expand=False)
349
+ keys_table.add_column("Key Name", style="bold cyan")
350
+ keys_table.add_column("Pub", justify="center")
351
+ keys_table.add_column("Priv", justify="center")
352
+
353
+ for key in status["keys"]:
354
+ pub_status = "✅" if key["public_exists"] else "❌"
355
+ priv_status = "✅" if key["private_exists"] else "❌"
356
+ keys_table.add_row(key["name"], pub_status, priv_status)
357
+
358
+ keys_panel = Panel(keys_table, title=f"SSH Keys ({len(status['keys'])})", border_style="yellow", padding=(1, 2), expand=False)
359
+
360
+ console.print(Columns([config_panel, keys_panel], equal=False, expand=True))
361
+ else:
362
+ console.print(config_panel)
363
+
364
+
365
+ def _display_config_files_status(status: dict[str, Any]) -> None:
366
+ """Display configuration files status."""
367
+ console.rule("[bold bright_blue]⚙️ Configuration Files[/bold bright_blue]")
368
+
369
+ if "error" in status:
370
+ console.print(
371
+ Panel(f"❌ Error reading configuration: {status['error']}", title="Configuration Files", border_style="red", padding=(1, 2), expand=False)
372
+ )
373
+ return
374
+
375
+ public_percentage = (status["public_linked"] / status["public_count"] * 100) if status["public_count"] > 0 else 0
376
+ private_percentage = (status["private_linked"] / status["private_count"] * 100) if status["private_count"] > 0 else 0
377
+
378
+ table = Table(show_header=True, box=None, padding=(0, 2), expand=False)
379
+ table.add_column("Type", style="cyan", no_wrap=True)
380
+ table.add_column("Linked", justify="right")
381
+ table.add_column("Total", justify="right")
382
+ table.add_column("Progress", justify="right")
383
+
384
+ table.add_row("📂 Public", str(status["public_linked"]), str(status["public_count"]), f"{public_percentage:.0f}%")
385
+ table.add_row("🔒 Private", str(status["private_linked"]), str(status["private_count"]), f"{private_percentage:.0f}%")
386
+
387
+ overall_linked = status["public_linked"] + status["private_linked"]
388
+ overall_total = status["public_count"] + status["private_count"]
389
+ overall_percentage = (overall_linked / overall_total * 100) if overall_total > 0 else 0
390
+
391
+ border_style = "green" if overall_percentage > 80 else ("yellow" if overall_percentage > 50 else "red")
392
+
393
+ console.print(
394
+ Panel(table, title=f"Configuration Files ({overall_percentage:.0f}% configured)", border_style=border_style, padding=(1, 2), expand=False)
395
+ )
396
+
397
+
398
+ def _display_tools_status(grouped_tools: dict[str, dict[str, bool]]) -> None:
399
+ """Display important tools installation status organized by groups."""
400
+ console.rule("[bold bright_magenta]🛠️ Important Tools[/bold bright_magenta]")
401
+
402
+ from rich.columns import Columns
403
+
404
+ all_group_panels = []
405
+ total_installed = 0
406
+ total_tools = 0
407
+
408
+ for group_name, tools in grouped_tools.items():
409
+ sorted_tools = sorted(tools.keys())
410
+ installed = [tool for tool, status in tools.items() if status]
411
+ total_installed += len(installed)
412
+ total_tools += len(tools)
413
+
414
+ num_columns = 8
415
+ tools_per_column = (len(sorted_tools) + num_columns - 1) // num_columns
416
+
417
+ tables = []
418
+ for col_idx in range(num_columns):
419
+ table = Table(show_header=False, box=None, padding=(0, 0), collapse_padding=True)
420
+ table.add_column("Tool", style="cyan", no_wrap=True, width=None)
421
+ table.add_column("", justify="center", width=2, no_wrap=True)
422
+
423
+ start_idx = col_idx * tools_per_column
424
+ end_idx = min(start_idx + tools_per_column, len(sorted_tools))
425
+
426
+ for i in range(start_idx, end_idx):
427
+ tool = sorted_tools[i]
428
+ status_icon = "✅" if tools[tool] else "❌"
429
+ table.add_row(tool, status_icon)
430
+
431
+ if start_idx < len(sorted_tools):
432
+ tables.append(table)
433
+
434
+ installed_percentage = (len(installed) / len(tools) * 100) if tools else 0
435
+ border_style = "green" if installed_percentage > 80 else ("yellow" if installed_percentage > 50 else "red")
436
+
437
+ group_display_name = group_name.replace("_", " ").title()
438
+ group_panel = Panel(
439
+ Columns(tables, equal=False, expand=False, padding=(0, 1)),
440
+ title=f"{group_display_name} ({len(installed)}/{len(tools)})",
441
+ border_style=border_style,
442
+ padding=(0, 1),
443
+ expand=False,
444
+ )
445
+ all_group_panels.append(group_panel)
446
+
447
+ overall_percentage = (total_installed / total_tools * 100) if total_tools else 0
448
+ master_border_style = "green" if overall_percentage > 80 else ("yellow" if overall_percentage > 50 else "red")
449
+
450
+ from rich.console import Group
451
+
452
+ master_panel = Panel(
453
+ Group(*all_group_panels),
454
+ title=f"🛠️ Tools Overview ({total_installed}/{total_tools} installed - {overall_percentage:.0f}%)",
455
+ border_style=master_border_style,
456
+ padding=(1, 2),
457
+ expand=False,
458
+ )
459
+ console.print(master_panel)
460
+
461
+
462
+ def _display_backup_status(status: dict[str, Any]) -> None:
463
+ """Display backup configuration status."""
464
+ console.rule("[bold bright_cyan]💾 Backup Configuration[/bold bright_cyan]")
465
+
466
+ table = Table(show_header=False, box=None, padding=(0, 1), expand=False)
467
+ table.add_column("Property", style="cyan", no_wrap=True)
468
+ table.add_column("Value", style="white")
469
+
470
+ table.add_row("🌥️ Cloud Config", status["cloud_config"])
471
+ table.add_row("📦 Backup Items", str(status["backup_items_count"]))
472
+
473
+ border_style = "green" if status["cloud_config"] != "Not configured" else "yellow"
474
+
475
+ console.print(Panel(table, title="Backup Configuration", border_style=border_style, padding=(1, 2), expand=False))
476
+
477
+
478
+ def main() -> None:
479
+ """Main function to display comprehensive machine status."""
480
+ console.print("\n")
481
+ console.print(Panel(Text("📊 Machine Status Report", justify="center", style="bold white"), style="bold blue", padding=(1, 2)))
482
+ console.print("\n")
483
+
484
+ system_info = _check_system_info()
485
+ _display_system_info(system_info)
486
+
487
+ shell_status = _check_shell_profile_status()
488
+ _display_shell_status(shell_status)
489
+
490
+ repos_status = _check_repos_status()
491
+ _display_repos_status(repos_status)
492
+
493
+ ssh_status = _check_ssh_status()
494
+ _display_ssh_status(ssh_status)
495
+
496
+ config_status = _check_config_files_status()
497
+ _display_config_files_status(config_status)
498
+
499
+ tools_status = _check_important_tools()
500
+ _display_tools_status(tools_status)
501
+
502
+ backup_status = _check_backup_config()
503
+ _display_backup_status(backup_status)
504
+
505
+ console.print("\n")
506
+ console.print(Panel(Text("✨ Status report complete!", justify="center", style="bold green"), style="green", padding=(1, 2)))
507
+ console.print("\n")
508
+
509
+
510
+ if __name__ == "__main__":
511
+ main()
@@ -1,5 +1,6 @@
1
1
  """Update repositories with fancy output"""
2
2
 
3
+ from concurrent.futures import ThreadPoolExecutor, as_completed
3
4
  from pathlib import Path
4
5
 
5
6
  import git
@@ -8,7 +9,7 @@ from rich.panel import Panel
8
9
  from rich.table import Table
9
10
  from rich.text import Text
10
11
 
11
- from machineconfig.scripts.python.repos_helper_update import RepositoryUpdateResult, run_uv_sync, update_repository
12
+ from machineconfig.scripts.python.helpers_repos.update import RepositoryUpdateResult, run_uv_sync, update_repository
12
13
  from machineconfig.utils.io import read_ini
13
14
  from machineconfig.utils.source_of_truth import DEFAULTS_PATH
14
15
 
@@ -16,6 +17,55 @@ from machineconfig.utils.source_of_truth import DEFAULTS_PATH
16
17
  console = Console()
17
18
 
18
19
 
20
+ def _process_single_repo(expanded_path: Path, allow_password_prompt: bool) -> tuple[RepositoryUpdateResult, Path | None]:
21
+ """Process a single repository and return the result."""
22
+ try:
23
+ repo = git.Repo(str(expanded_path), search_parent_directories=True)
24
+ # Update repository and get detailed results
25
+ result = update_repository(repo, allow_password_prompt=allow_password_prompt, auto_uv_sync=True)
26
+
27
+ # Keep track of repos with dependency changes for additional uv sync
28
+ repo_path = None
29
+ if result["dependencies_changed"] and not result["uv_sync_ran"]:
30
+ repo_path = Path(repo.working_dir)
31
+
32
+ return result, repo_path
33
+
34
+ except Exception as ex:
35
+ # Create a result for failed repos
36
+ error_result: RepositoryUpdateResult = {
37
+ "repo_path": str(expanded_path),
38
+ "status": "error",
39
+ "had_uncommitted_changes": False,
40
+ "uncommitted_files": [],
41
+ "commit_before": "",
42
+ "commit_after": "",
43
+ "commits_changed": False,
44
+ "pyproject_changed": False,
45
+ "dependencies_changed": False,
46
+ "uv_sync_ran": False,
47
+ "uv_sync_success": False,
48
+ "remotes_processed": [],
49
+ "remotes_skipped": [],
50
+ "error_message": str(ex),
51
+ "is_machineconfig_repo": False,
52
+ "permissions_updated": False,
53
+ }
54
+ console.print(
55
+ Panel(
56
+ "\n".join(
57
+ [
58
+ f"❌ Repository error: {expanded_path}",
59
+ f"Exception: {ex}",
60
+ ]
61
+ ),
62
+ border_style="red",
63
+ padding=(1, 2),
64
+ )
65
+ )
66
+ return error_result, None
67
+
68
+
19
69
  def _display_summary(results: list[RepositoryUpdateResult]) -> None:
20
70
  """Display a comprehensive summary of all repository update operations."""
21
71
 
@@ -148,7 +198,7 @@ def _display_summary(results: list[RepositoryUpdateResult]) -> None:
148
198
  def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
149
199
  """Main function to update all configured repositories."""
150
200
  _ = verbose
151
- repos: list[Path] = [Path.home() / "code/machineconfig", Path.home() / "code/crocodile"]
201
+ repos: list[Path] = []
152
202
  try:
153
203
  tmp = read_ini(DEFAULTS_PATH)["general"]["repos"].split(",")
154
204
  if tmp[-1] == "":
@@ -188,60 +238,29 @@ def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
188
238
  padding=(1, 2),
189
239
  )
190
240
  )
241
+ update_repos(repos, allow_password_prompt)
191
242
 
192
- # Process repositories
243
+
244
+ def update_repos(repos: list[Path], allow_password_prompt: bool) -> None:
245
+ # Process repositories in parallel
193
246
  results: list[RepositoryUpdateResult] = []
194
247
  repos_with_changes = []
195
-
196
- for expanded_path in repos:
197
- try:
198
- repo = git.Repo(str(expanded_path), search_parent_directories=True)
199
- # Update repository and get detailed results
200
- result = update_repository(repo, allow_password_prompt=allow_password_prompt, auto_sync=True)
248
+ with ThreadPoolExecutor(max_workers=min(len(repos), 8)) as executor:
249
+ # Submit all tasks
250
+ future_to_repo = {
251
+ executor.submit(_process_single_repo, expanded_path, allow_password_prompt): expanded_path
252
+ for expanded_path in repos
253
+ }
254
+
255
+ # Collect results as they complete
256
+ for future in as_completed(future_to_repo):
257
+ result, repo_path = future.result()
201
258
  results.append(result)
202
-
203
- # Keep track of repos with dependency changes for additional uv sync
204
- if result["dependencies_changed"] and not result["uv_sync_ran"]:
205
- repos_with_changes.append(Path(repo.working_dir))
206
-
207
- except Exception as ex:
208
- # Create a result for failed repos
209
- error_result: RepositoryUpdateResult = {
210
- "repo_path": str(expanded_path),
211
- "status": "error",
212
- "had_uncommitted_changes": False,
213
- "uncommitted_files": [],
214
- "commit_before": "",
215
- "commit_after": "",
216
- "commits_changed": False,
217
- "pyproject_changed": False,
218
- "dependencies_changed": False,
219
- "uv_sync_ran": False,
220
- "uv_sync_success": False,
221
- "remotes_processed": [],
222
- "remotes_skipped": [],
223
- "error_message": str(ex),
224
- "is_machineconfig_repo": False,
225
- "permissions_updated": False,
226
- }
227
- results.append(error_result)
228
- console.print(
229
- Panel(
230
- "\n".join(
231
- [
232
- f"❌ Repository error: {expanded_path}",
233
- f"Exception: {ex}",
234
- ]
235
- ),
236
- border_style="red",
237
- padding=(1, 2),
238
- )
239
- )
240
-
259
+ if repo_path is not None:
260
+ repos_with_changes.append(repo_path)
241
261
  # Run uv sync for repositories where pyproject.toml changed but sync wasn't run yet
242
262
  for repo_path in repos_with_changes:
243
263
  run_uv_sync(repo_path)
244
-
245
264
  # Generate and display summary
246
265
  _display_summary(results)
247
266