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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (465) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +7 -21
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +128 -0
  34. machineconfig/jobs/{python_custom_installers → installer/custom}/hx.py +84 -18
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +86 -0
  36. machineconfig/jobs/installer/custom_dev/brave.py +82 -0
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +59 -0
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +63 -0
  40. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/cursor.py +7 -7
  41. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  42. machineconfig/jobs/installer/custom_dev/espanso.py +117 -0
  43. machineconfig/jobs/installer/custom_dev/goes.py +68 -0
  44. machineconfig/jobs/installer/custom_dev/lvim.py +89 -0
  45. machineconfig/jobs/installer/custom_dev/nerdfont.py +111 -0
  46. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +149 -0
  47. machineconfig/jobs/installer/custom_dev/redis.py +88 -0
  48. machineconfig/jobs/installer/custom_dev/sysabc.py +145 -0
  49. machineconfig/jobs/installer/custom_dev/wezterm.py +92 -0
  50. machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/winget.py +2 -3
  51. machineconfig/jobs/installer/installer_data.json +3440 -0
  52. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/brave.sh +4 -14
  53. machineconfig/jobs/{python_custom_installers/scripts/linux/warp-cli.sh → installer/linux_scripts/cloudflare_warp_cli.sh} +5 -17
  54. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/docker.sh +6 -18
  55. machineconfig/jobs/installer/linux_scripts/docker_start.sh +37 -0
  56. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/edge.sh +3 -11
  57. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  58. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/nerdfont.sh +5 -17
  59. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  60. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  61. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  62. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/redis.sh +6 -17
  63. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/vscode.sh +5 -17
  64. machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/wezterm.sh +4 -12
  65. machineconfig/jobs/installer/package_groups.py +255 -0
  66. machineconfig/logger.py +0 -1
  67. machineconfig/profile/backup.toml +49 -0
  68. machineconfig/profile/bash_shell_profiles.md +11 -0
  69. machineconfig/profile/create_helper.py +74 -0
  70. machineconfig/profile/create_links.py +288 -0
  71. machineconfig/profile/create_links_export.py +100 -0
  72. machineconfig/profile/create_shell_profile.py +136 -0
  73. machineconfig/profile/mapper.toml +258 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/{mcinit.py → initai.py} +3 -38
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +114 -0
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +88 -22
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/gemini/settings.json +1 -1
  89. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  90. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  91. machineconfig/scripts/python/cloud.py +29 -0
  92. machineconfig/scripts/python/croshell.py +129 -198
  93. machineconfig/scripts/python/define.py +31 -0
  94. machineconfig/scripts/python/devops.py +45 -131
  95. machineconfig/scripts/python/devops_navigator.py +6 -0
  96. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  97. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  98. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  99. machineconfig/scripts/python/fire_jobs.py +166 -235
  100. machineconfig/scripts/python/ftpx.py +164 -100
  101. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  102. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  109. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +52 -39
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +13 -18
  117. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +81 -0
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -1
  121. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +32 -20
  122. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  123. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  124. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  125. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  126. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  127. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  129. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  130. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  131. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  132. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  133. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  134. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  136. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  137. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  138. machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -2
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -89
  140. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  142. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  143. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  145. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  154. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  155. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  156. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  157. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  158. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  159. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  160. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  161. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  162. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  163. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  164. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  165. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  166. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  167. machineconfig/scripts/python/interactive.py +187 -0
  168. machineconfig/scripts/python/mcfg_entry.py +63 -0
  169. machineconfig/scripts/python/msearch.py +40 -0
  170. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  171. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  172. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  173. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  174. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  175. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  176. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  177. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  178. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  179. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -51
  180. machineconfig/scripts/python/nw/wsl_windows_transfer.py +67 -0
  181. machineconfig/scripts/python/sessions.py +167 -0
  182. machineconfig/scripts/python/terminal.py +127 -0
  183. machineconfig/scripts/python/utils.py +66 -0
  184. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  185. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  186. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  187. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  188. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  189. machineconfig/settings/broot/br.sh +0 -4
  190. machineconfig/settings/broot/conf.toml +1 -1
  191. machineconfig/settings/helix/config.toml +16 -0
  192. machineconfig/settings/helix/languages.toml +13 -4
  193. machineconfig/settings/helix/yazi-picker.sh +12 -0
  194. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  195. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  196. machineconfig/settings/lf/linux/lfrc +10 -12
  197. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  198. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  199. machineconfig/settings/lf/windows/lfrc +18 -38
  200. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  201. machineconfig/settings/linters/.ruff.toml +1 -1
  202. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  203. machineconfig/settings/marimo/marimo.toml +80 -0
  204. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  205. machineconfig/settings/pistol/pistol.conf +1 -1
  206. machineconfig/settings/shells/bash/init.sh +55 -31
  207. machineconfig/settings/shells/nushell/config.nu +1 -34
  208. machineconfig/settings/shells/nushell/init.nu +127 -0
  209. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  210. machineconfig/settings/shells/starship/starship.toml +16 -0
  211. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  212. machineconfig/settings/shells/wt/settings.json +32 -17
  213. machineconfig/settings/shells/zsh/init.sh +89 -0
  214. machineconfig/settings/svim/linux/init.toml +0 -4
  215. machineconfig/settings/svim/windows/init.toml +0 -3
  216. machineconfig/settings/yazi/init.lua +57 -0
  217. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  218. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  219. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  220. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  221. machineconfig/settings/yazi/yazi.toml +14 -1
  222. machineconfig/setup_linux/__init__.py +10 -0
  223. machineconfig/setup_linux/apps_desktop.sh +89 -0
  224. machineconfig/setup_linux/apps_gui.sh +64 -0
  225. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  226. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  227. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  228. machineconfig/setup_linux/uv.sh +15 -0
  229. machineconfig/setup_linux/web_shortcuts/interactive.sh +28 -203
  230. machineconfig/setup_mac/__init__.py +16 -0
  231. machineconfig/setup_mac/apps_gui.sh +248 -0
  232. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  233. machineconfig/setup_mac/uv.sh +36 -0
  234. machineconfig/setup_windows/__init__.py +8 -0
  235. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  236. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  237. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  239. machineconfig/setup_windows/uv.ps1 +17 -0
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -189
  241. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  242. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  243. machineconfig/utils/accessories.py +52 -12
  244. machineconfig/utils/cloud/onedrive/README.md +139 -0
  245. machineconfig/utils/code.py +140 -93
  246. machineconfig/utils/files/art/fat_croco.txt +10 -0
  247. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  248. machineconfig/utils/files/art/happy_croco.txt +22 -0
  249. machineconfig/utils/files/art/water_croco.txt +11 -0
  250. machineconfig/utils/files/ascii_art.py +118 -0
  251. machineconfig/utils/files/dbms.py +257 -0
  252. machineconfig/utils/files/headers.py +68 -0
  253. machineconfig/utils/files/ouch/decompress.py +45 -0
  254. machineconfig/utils/files/read.py +95 -0
  255. machineconfig/utils/installer_utils/github_release_bulk.py +188 -0
  256. machineconfig/utils/installer_utils/install_from_url.py +180 -0
  257. machineconfig/utils/installer_utils/installer_class.py +239 -316
  258. machineconfig/utils/installer_utils/installer_cli.py +186 -0
  259. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +90 -5
  260. machineconfig/utils/installer_utils/installer_runner.py +191 -0
  261. machineconfig/utils/io.py +77 -24
  262. machineconfig/utils/links.py +309 -100
  263. machineconfig/utils/meta.py +255 -0
  264. machineconfig/utils/notifications.py +1 -1
  265. machineconfig/utils/options.py +19 -47
  266. machineconfig/utils/path_extended.py +111 -121
  267. machineconfig/utils/path_helper.py +75 -22
  268. machineconfig/utils/procs.py +50 -74
  269. machineconfig/utils/scheduler.py +94 -97
  270. machineconfig/utils/scheduling.py +0 -3
  271. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  272. machineconfig/utils/schemas/installer/installer_types.py +28 -6
  273. machineconfig/utils/schemas/layouts/layout_types.py +34 -1
  274. machineconfig/utils/source_of_truth.py +3 -6
  275. machineconfig/utils/ssh.py +742 -254
  276. machineconfig/utils/ssh_utils/utils.py +0 -0
  277. machineconfig/utils/terminal.py +3 -140
  278. machineconfig/utils/tst.py +20 -0
  279. machineconfig/utils/upgrade_packages.py +109 -28
  280. machineconfig/utils/ve.py +13 -5
  281. machineconfig-7.69.dist-info/METADATA +124 -0
  282. machineconfig-7.69.dist-info/RECORD +454 -0
  283. machineconfig-7.69.dist-info/entry_points.txt +15 -0
  284. machineconfig/cluster/templates/cli_click.py +0 -102
  285. machineconfig/cluster/templates/cli_gooey.py +0 -115
  286. machineconfig/cluster/templates/utils.py +0 -51
  287. machineconfig/jobs/linux/msc/cli_agents.sh +0 -32
  288. machineconfig/jobs/python/create_bootable_media.py +0 -16
  289. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  290. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  291. machineconfig/jobs/python/tasks.py +0 -3
  292. machineconfig/jobs/python/vscode/api.py +0 -48
  293. machineconfig/jobs/python/vscode/link_ve.py +0 -63
  294. machineconfig/jobs/python/vscode/select_interpreter.py +0 -87
  295. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  296. machineconfig/jobs/python_custom_installers/archive/ngrok.py +0 -63
  297. machineconfig/jobs/python_custom_installers/dev/aider.py +0 -37
  298. machineconfig/jobs/python_custom_installers/dev/alacritty.py +0 -65
  299. machineconfig/jobs/python_custom_installers/dev/brave.py +0 -71
  300. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +0 -50
  301. machineconfig/jobs/python_custom_installers/dev/code.py +0 -51
  302. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -78
  303. machineconfig/jobs/python_custom_installers/dev/espanso.py +0 -90
  304. machineconfig/jobs/python_custom_installers/dev/goes.py +0 -55
  305. machineconfig/jobs/python_custom_installers/dev/lvim.py +0 -77
  306. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +0 -68
  307. machineconfig/jobs/python_custom_installers/dev/redis.py +0 -65
  308. machineconfig/jobs/python_custom_installers/dev/reverse_proxy.md +0 -31
  309. machineconfig/jobs/python_custom_installers/dev/wezterm.py +0 -70
  310. machineconfig/jobs/python_custom_installers/docker.py +0 -74
  311. machineconfig/jobs/python_custom_installers/gh.py +0 -97
  312. machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +0 -45
  313. machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +0 -49
  314. machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +0 -85
  315. machineconfig/jobs/python_custom_installers/warp-cli.py +0 -71
  316. machineconfig/jobs/python_generic_installers/config.json +0 -603
  317. machineconfig/jobs/python_generic_installers/config.json.bak +0 -414
  318. machineconfig/jobs/python_generic_installers/dev/config.archive.json +0 -18
  319. machineconfig/jobs/python_generic_installers/dev/config.json +0 -825
  320. machineconfig/jobs/python_generic_installers/dev/config.json.bak +0 -565
  321. machineconfig/jobs/python_linux_installers/archive/config.json +0 -18
  322. machineconfig/jobs/python_linux_installers/archive/config.json.bak +0 -10
  323. machineconfig/jobs/python_linux_installers/config.json +0 -145
  324. machineconfig/jobs/python_linux_installers/config.json.bak +0 -110
  325. machineconfig/jobs/python_linux_installers/dev/config.json +0 -276
  326. machineconfig/jobs/python_linux_installers/dev/config.json.bak +0 -206
  327. machineconfig/jobs/python_windows_installers/archive/file.json +0 -11
  328. machineconfig/jobs/python_windows_installers/config.json +0 -82
  329. machineconfig/jobs/python_windows_installers/config.json.bak +0 -56
  330. machineconfig/jobs/python_windows_installers/dev/config.json +0 -4
  331. machineconfig/jobs/python_windows_installers/dev/config.json.bak +0 -3
  332. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  333. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  334. machineconfig/jobs/windows/startup_file.cmd +0 -2
  335. machineconfig/profile/create.py +0 -169
  336. machineconfig/profile/shell.py +0 -176
  337. machineconfig/scripts/cloud/init.sh +0 -119
  338. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  339. machineconfig/scripts/linux/cloud_copy +0 -2
  340. machineconfig/scripts/linux/cloud_mount +0 -2
  341. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  342. machineconfig/scripts/linux/cloud_sync +0 -2
  343. machineconfig/scripts/linux/croshell +0 -3
  344. machineconfig/scripts/linux/devops +0 -2
  345. machineconfig/scripts/linux/fire +0 -2
  346. machineconfig/scripts/linux/fire_agents +0 -2
  347. machineconfig/scripts/linux/ftpx +0 -2
  348. machineconfig/scripts/linux/fzf2g +0 -21
  349. machineconfig/scripts/linux/fzffg +0 -25
  350. machineconfig/scripts/linux/gh_models +0 -2
  351. machineconfig/scripts/linux/kill_process +0 -2
  352. machineconfig/scripts/linux/mcinit +0 -2
  353. machineconfig/scripts/linux/programs +0 -21
  354. machineconfig/scripts/linux/repos +0 -2
  355. machineconfig/scripts/linux/scheduler +0 -2
  356. machineconfig/scripts/linux/share_smb +0 -1
  357. machineconfig/scripts/linux/start_slidev +0 -2
  358. machineconfig/scripts/linux/start_terminals +0 -3
  359. machineconfig/scripts/linux/warp-cli.sh +0 -122
  360. machineconfig/scripts/linux/wifi_conn +0 -2
  361. machineconfig/scripts/linux/z_ls +0 -104
  362. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  363. machineconfig/scripts/python/archive/im2text.py +0 -34
  364. machineconfig/scripts/python/archive/tmate_conn.py +0 -41
  365. machineconfig/scripts/python/archive/tmate_start.py +0 -44
  366. machineconfig/scripts/python/cloud_repo_sync.py +0 -192
  367. machineconfig/scripts/python/cloud_sync.py +0 -85
  368. machineconfig/scripts/python/devops_devapps_install.py +0 -202
  369. machineconfig/scripts/python/devops_update_repos.py +0 -180
  370. machineconfig/scripts/python/dotfile.py +0 -52
  371. machineconfig/scripts/python/fire_agents.py +0 -176
  372. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  373. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  374. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -84
  375. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -66
  376. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  377. machineconfig/scripts/python/gh_models.py +0 -104
  378. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  379. machineconfig/scripts/python/repos.py +0 -160
  380. machineconfig/scripts/python/snapshot.py +0 -25
  381. machineconfig/scripts/python/start_terminals.py +0 -121
  382. machineconfig/scripts/python/wsl_windows_transfer.py +0 -72
  383. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  384. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  385. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  386. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  387. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  388. machineconfig/scripts/windows/croshell.ps1 +0 -1
  389. machineconfig/scripts/windows/devops.ps1 +0 -1
  390. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  391. machineconfig/scripts/windows/fire.ps1 +0 -1
  392. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  393. machineconfig/scripts/windows/gpt.ps1 +0 -1
  394. machineconfig/scripts/windows/grep.ps1 +0 -2
  395. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  396. machineconfig/scripts/windows/mcinit.ps1 +0 -1
  397. machineconfig/scripts/windows/nano.ps1 +0 -3
  398. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  399. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  400. machineconfig/scripts/windows/repos.ps1 +0 -1
  401. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  402. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  403. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  404. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  405. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  406. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  407. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  408. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  409. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  410. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  411. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  412. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  413. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  414. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  415. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  416. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  417. machineconfig/setup_windows/wt_and_pwsh/install_nerd_fonts.py +0 -100
  418. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  419. machineconfig/utils/installer.py +0 -255
  420. machineconfig-3.7.dist-info/METADATA +0 -165
  421. machineconfig-3.7.dist-info/RECORD +0 -432
  422. machineconfig-3.7.dist-info/entry_points.txt +0 -18
  423. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  424. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  425. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  426. machineconfig/jobs/{python → installer}/__init__.py +0 -0
  427. machineconfig/jobs/{python_custom_installers → installer/custom_dev}/__init__.py +0 -0
  428. machineconfig/{setup_windows/wt_and_pwsh → jobs/installer/powershell_scripts}/install_fonts.ps1 +0 -0
  429. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  430. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  431. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  432. machineconfig/{jobs/python_generic_installers → scripts/python/helpers_agents}/__init__.py +0 -0
  433. machineconfig/{jobs/python_linux_installers → scripts/python/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  434. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  435. machineconfig/{jobs/python_linux_installers/dev → scripts/python/helpers_cloud}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  437. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  438. /machineconfig/{jobs/python_windows_installers → scripts/python/helpers_croshell}/__init__.py +0 -0
  439. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  440. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  441. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  442. /machineconfig/{jobs/python_windows_installers/archive → scripts/python/helpers_devops}/__init__.py +0 -0
  443. /machineconfig/{jobs/python_windows_installers/dev → scripts/python/helpers_devops/themes}/__init__.py +0 -0
  444. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  445. /machineconfig/scripts/python/{helpers → helpers_fire_command}/__init__.py +0 -0
  446. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  447. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  448. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  449. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  450. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  451. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_sessions/__init__.py} +0 -0
  452. /machineconfig/scripts/{windows/share_nfs.ps1 → python/nw/__init__.py} +0 -0
  453. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  454. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  455. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  456. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  457. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  458. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  459. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  460. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  461. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  462. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  463. /machineconfig/{settings/yazi/keymap.toml → utils/files/ouch/__init__.py} +0 -0
  464. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/WHEEL +0 -0
  465. {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,269 @@
1
+ """Update repositories with fancy output"""
2
+
3
+ from concurrent.futures import ThreadPoolExecutor, as_completed
4
+ from pathlib import Path
5
+
6
+ import git
7
+ from rich.console import Console
8
+ from rich.panel import Panel
9
+ from rich.table import Table
10
+ from rich.text import Text
11
+
12
+ from machineconfig.scripts.python.helpers_repos.update import RepositoryUpdateResult, run_uv_sync, update_repository
13
+ from machineconfig.utils.io import read_ini
14
+ from machineconfig.utils.source_of_truth import DEFAULTS_PATH
15
+
16
+
17
+ console = Console()
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
+
69
+ def _display_summary(results: list[RepositoryUpdateResult]) -> None:
70
+ """Display a comprehensive summary of all repository update operations."""
71
+
72
+ console.rule("[bold blue]📊 Repository Update Summary[/bold blue]")
73
+
74
+ total_repos = len(results)
75
+ successful_repos = sum(1 for r in results if r["status"] == "success")
76
+ error_repos = sum(1 for r in results if r["status"] == "error")
77
+ skipped_repos = sum(1 for r in results if r["status"] == "skipped")
78
+ auth_failed_repos = sum(1 for r in results if r["status"] == "auth_failed")
79
+
80
+ repos_with_changes = sum(1 for r in results if r["commits_changed"])
81
+ repos_with_uncommitted = sum(1 for r in results if r["had_uncommitted_changes"])
82
+ repos_with_dep_changes = sum(1 for r in results if r["dependencies_changed"])
83
+ uv_sync_runs = sum(1 for r in results if r["uv_sync_ran"])
84
+ uv_sync_successes = sum(1 for r in results if r["uv_sync_ran"] and r["uv_sync_success"])
85
+
86
+ overview_lines = [
87
+ f"[bold]Total repositories processed:[/] {total_repos}",
88
+ f"✅ Successful updates: {successful_repos}",
89
+ f"❌ Failed updates: {error_repos}",
90
+ f"⏭️ Skipped: {skipped_repos}",
91
+ ]
92
+ if auth_failed_repos > 0:
93
+ overview_lines.append(f"🔐 Authentication failed: {auth_failed_repos}")
94
+
95
+ console.print(
96
+ Panel(
97
+ "\n".join(overview_lines),
98
+ title="� Overview",
99
+ border_style="blue",
100
+ padding=(1, 2),
101
+ )
102
+ )
103
+
104
+ changes_lines = [
105
+ f"Repositories with new commits: {repos_with_changes}",
106
+ f"Repositories with dependency changes: {repos_with_dep_changes}",
107
+ f"Repositories with uncommitted changes: {repos_with_uncommitted}",
108
+ ]
109
+ console.print(
110
+ Panel(
111
+ "\n".join(changes_lines),
112
+ title="� Changes",
113
+ border_style="magenta",
114
+ padding=(1, 2),
115
+ )
116
+ )
117
+
118
+ uv_sync_lines = [
119
+ f"uv sync operations attempted: {uv_sync_runs}",
120
+ f"uv sync operations successful: {uv_sync_successes}",
121
+ ]
122
+ if uv_sync_runs > uv_sync_successes:
123
+ uv_sync_lines.append(f"uv sync operations failed: {uv_sync_runs - uv_sync_successes}")
124
+
125
+ console.print(
126
+ Panel(
127
+ "\n".join(uv_sync_lines),
128
+ title="📦 uv sync",
129
+ border_style="cyan",
130
+ padding=(1, 2),
131
+ )
132
+ )
133
+
134
+ table = Table(title="📋 Detailed Results", show_lines=True, header_style="bold blue")
135
+ table.add_column("Repository", style="bold")
136
+ table.add_column("Status")
137
+ table.add_column("Details", overflow="fold")
138
+
139
+ for result in results:
140
+ repo_name = Path(result["repo_path"]).name
141
+ status_icon = {"success": "✅", "error": "❌", "skipped": "⏭️", "auth_failed": "🔐"}.get(result["status"], "❓")
142
+ status_label = result["status"].replace("_", " ").title()
143
+
144
+ detail_lines: list[str] = []
145
+
146
+ if result["status"] == "error" and result["error_message"]:
147
+ detail_lines.append(f"💥 Error: {result['error_message']}")
148
+
149
+ if result["commits_changed"]:
150
+ detail_lines.append(f"🔄 Updated: {result['commit_before'][:8]} → {result['commit_after'][:8]}")
151
+ elif result["status"] == "success":
152
+ detail_lines.append("📍 Already up to date")
153
+
154
+ if result["had_uncommitted_changes"]:
155
+ files_str = ", ".join(result["uncommitted_files"])
156
+ detail_lines.append(f"⚠️ Uncommitted changes: {files_str}")
157
+
158
+ if result["dependencies_changed"]:
159
+ changes = []
160
+ if result["pyproject_changed"]:
161
+ changes.append("pyproject.toml")
162
+ if changes:
163
+ detail_lines.append(f"📋 Dependencies changed: {', '.join(changes)}")
164
+
165
+ if result["uv_sync_ran"]:
166
+ sync_status = "✅" if result["uv_sync_success"] else "❌"
167
+ detail_lines.append(f"📦 uv sync: {sync_status}")
168
+
169
+ if result["is_machineconfig_repo"] and result["permissions_updated"]:
170
+ detail_lines.append("🛠 Updated permissions for machineconfig files")
171
+
172
+ if result["remotes_processed"]:
173
+ detail_lines.append(f"📡 Processed remotes: {', '.join(result['remotes_processed'])}")
174
+ if result["remotes_skipped"]:
175
+ detail_lines.append(f"⏭️ Skipped remotes: {', '.join(result['remotes_skipped'])}")
176
+
177
+ table.add_row(f"{status_icon} {repo_name}", status_label, "\n".join(detail_lines) or "—")
178
+
179
+ console.print(table)
180
+
181
+ if error_repos == 0 and auth_failed_repos == 0:
182
+ summary_text = Text("🎉 All repositories processed successfully!", style="green", justify="center")
183
+ border = "green"
184
+ elif successful_repos > 0:
185
+ summary_text = Text(
186
+ f"⚠️ {successful_repos}/{total_repos} repositories processed successfully",
187
+ style="yellow",
188
+ justify="center",
189
+ )
190
+ border = "yellow"
191
+ else:
192
+ summary_text = Text("❌ No repositories were successfully processed", style="red", justify="center")
193
+ border = "red"
194
+
195
+ console.print(Panel(summary_text, title="Summary", border_style=border, padding=(1, 2)))
196
+
197
+
198
+ def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
199
+ """Main function to update all configured repositories."""
200
+ _ = verbose
201
+ repos: list[Path] = []
202
+ try:
203
+ tmp = read_ini(DEFAULTS_PATH)["general"]["repos"].split(",")
204
+ if tmp[-1] == "":
205
+ tmp = tmp[:-1]
206
+ for item in tmp:
207
+ item_obj = Path(item).expanduser()
208
+ if item_obj not in repos:
209
+ repos.append(item_obj)
210
+ except (FileNotFoundError, KeyError, IndexError):
211
+ console.print(
212
+ Panel(
213
+ "\n".join(
214
+ [
215
+ f"🚫 Configuration error: missing {DEFAULTS_PATH} or the [general] section / repos key.",
216
+ "ℹ️ Using default repositories instead.",
217
+ ]
218
+ ),
219
+ title="Configuration Missing",
220
+ border_style="red",
221
+ padding=(1, 2),
222
+ )
223
+ )
224
+ console.print(
225
+ Panel(
226
+ "\n".join(
227
+ [
228
+ "✨ Example configuration:",
229
+ "",
230
+ "[general]",
231
+ "repos = ~/code/repo1,~/code/repo2",
232
+ "rclone_config_name = onedrivePersonal",
233
+ "email_config_name = Yahoo3",
234
+ "to_email = myemail@email.com",
235
+ ]
236
+ ),
237
+ border_style="cyan",
238
+ padding=(1, 2),
239
+ )
240
+ )
241
+ update_repos(repos, allow_password_prompt)
242
+
243
+
244
+ def update_repos(repos: list[Path], allow_password_prompt: bool) -> None:
245
+ # Process repositories in parallel
246
+ results: list[RepositoryUpdateResult] = []
247
+ repos_with_changes = []
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()
258
+ results.append(result)
259
+ if repo_path is not None:
260
+ repos_with_changes.append(repo_path)
261
+ # Run uv sync for repositories where pyproject.toml changed but sync wasn't run yet
262
+ for repo_path in repos_with_changes:
263
+ run_uv_sync(repo_path)
264
+ # Generate and display summary
265
+ _display_summary(results)
266
+
267
+
268
+ if __name__ == "__main__":
269
+ main()
@@ -0,0 +1,81 @@
1
+ # Requires: fzf, oh-my-posh
2
+ # Purpose: Interactive Oh My Posh theme chooser with live preview
3
+
4
+ # Path to your Oh My Posh themes directory
5
+ $themesDir = "$env:LOCALAPPDATA\Programs\oh-my-posh\themes"
6
+
7
+ if (-not (Test-Path $themesDir)) {
8
+ Write-Host "Themes directory not found at $themesDir" -ForegroundColor Red
9
+ exit 1
10
+ }
11
+
12
+ # Get all theme files and extract just the theme names for display
13
+ $themes = Get-ChildItem $themesDir -Filter "*.omp.json" | ForEach-Object {
14
+ [PSCustomObject]@{
15
+ Name = $_.BaseName
16
+ Path = $_.FullName
17
+ }
18
+ }
19
+
20
+ # Create a simple preview command that shows theme name and a sample prompt
21
+ $previewCommand = "pwsh -NoProfile -Command `"Write-Host 'Theme: ' -NoNewline -ForegroundColor Cyan; Write-Host (Split-Path '{}' -Leaf); Write-Host ''; oh-my-posh print primary --config '{}' 2>`$null`""
22
+
23
+ # Run fzf with preview
24
+ $selectedThemeName = $themes | ForEach-Object { $_.Path } |
25
+ fzf --height 80% --border --ansi --reverse `
26
+ --header "Select an Oh My Posh theme (Ctrl+C to cancel)" `
27
+ --preview $previewCommand `
28
+ --preview-window=right:60%:wrap
29
+
30
+ # After fzf selection
31
+ if ($selectedThemeName) {
32
+ Write-Host "`nYou selected:" -ForegroundColor Green
33
+ Write-Host (Split-Path $selectedThemeName -Leaf) -ForegroundColor Yellow
34
+ Write-Host "`nApplying theme..." -ForegroundColor Cyan
35
+
36
+ # Apply the theme to current session
37
+ oh-my-posh init pwsh --config $selectedThemeName | Invoke-Expression
38
+
39
+ Write-Host "`nTheme applied to current session!" -ForegroundColor Green
40
+
41
+ # Safely update the PowerShell profile
42
+ $profilePath = $PROFILE
43
+ $ompLine = "oh-my-posh init pwsh --config '$selectedThemeName' | Invoke-Expression"
44
+
45
+ # Create profile directory if it doesn't exist
46
+ $profileDir = Split-Path $profilePath -Parent
47
+ if (-not (Test-Path $profileDir)) {
48
+ New-Item -ItemType Directory -Path $profileDir -Force | Out-Null
49
+ }
50
+
51
+ # Read existing profile content or create empty array
52
+ if (Test-Path $profilePath) {
53
+ $profileContent = Get-Content $profilePath -Raw
54
+ } else {
55
+ $profileContent = ""
56
+ }
57
+
58
+ # Check if oh-my-posh line already exists and replace it
59
+ if ($profileContent -match "oh-my-posh init pwsh[^\r\n]*") {
60
+ # Replace existing oh-my-posh line
61
+ $profileContent = $profileContent -replace "oh-my-posh init pwsh[^\r\n]*", $ompLine
62
+ } else {
63
+ # Add the oh-my-posh line with proper newlines
64
+ if ($profileContent.Length -gt 0 -and -not $profileContent.EndsWith("`n")) {
65
+ $profileContent += "`n"
66
+ }
67
+ if ($profileContent.Length -gt 0) {
68
+ $profileContent += "`n"
69
+ }
70
+ $profileContent += $ompLine
71
+ $profileContent += "`n"
72
+ }
73
+
74
+ # Write back to profile
75
+ $profileContent | Set-Content $profilePath -Encoding UTF8 -NoNewline
76
+
77
+ Write-Host "Profile updated successfully!" -ForegroundColor Green
78
+ Write-Host "The theme will be applied automatically in future PowerShell sessions." -ForegroundColor Cyan
79
+ } else {
80
+ Write-Host "`nNo theme selected." -ForegroundColor DarkGray
81
+ }
@@ -52,14 +52,14 @@ def main2():
52
52
 
53
53
  def set_theme(theme: str):
54
54
  print(f"🔄 Setting WezTerm theme to: {theme}")
55
- txt_lines = PathExtended("~/.config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
55
+ txt_lines = PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
56
56
  res_lines = []
57
57
  for line in txt_lines:
58
58
  if "config.color_scheme = " in line:
59
59
  res_lines.append(f"config.color_scheme = '{theme}'")
60
60
  else:
61
61
  res_lines.append(line)
62
- PathExtended("~/.config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
62
+ PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
63
63
  time.sleep(0.1)
64
64
  print("💾 Configuration saved")
65
65
 
@@ -4,7 +4,6 @@
4
4
  # from machineconfig.cluster.cloud_manager import CloudManager
5
5
  # from rich.console import Console # Add import for Console
6
6
  # from rich.panel import Panel # Add import for Panel
7
- # import argparse
8
7
 
9
8
  # console = Console()
10
9
 
@@ -21,7 +20,6 @@
21
20
  # console = Console() # Add console initialization
22
21
  # console.print(Panel("☁️ Cloud Manager", title_align="left", expand=False))
23
22
 
24
- # parser = argparse.ArgumentParser()
25
23
  # parser.add_argument("-c", "--cloud", help="Rclone Config Name", action="store", type=str, default=None)
26
24
  # parser.add_argument("-s", "--serve", help="Start job server", action="store_true", default=False)
27
25
  # parser.add_argument("-R", "--reset_local", help="Clear local cache", action="store_true", default=False)
@@ -1,40 +1,7 @@
1
- from typing import Any, Callable, Optional
2
- import inspect
1
+ from typing import Optional
3
2
  import os
4
-
5
- # import argparse
6
- from machineconfig.utils.path_extended import PathExtended as PathExtended
7
- # from machineconfig.utils.utils import choose_ssh_host
8
-
9
-
10
- def search_for_files_of_interest(path_obj: PathExtended):
11
- if path_obj.joinpath(".venv").exists():
12
- path_objects = path_obj.search("*", not_in=[".venv"])
13
- files: list[PathExtended] = []
14
- for a_path_obj in path_objects:
15
- files += search_for_files_of_interest(path_obj=a_path_obj)
16
- return files
17
- if path_obj.is_file():
18
- return [path_obj]
19
- py_files = path_obj.search(pattern="*.py", not_in=["__init__.py"], r=True)
20
- ps_files = path_obj.search(pattern="*.ps1", r=True)
21
- sh_files = path_obj.search(pattern="*.sh", r=True)
22
- files = py_files + ps_files + sh_files
23
- return files
24
-
25
-
26
- def convert_kwargs_to_fire_kwargs_str(kwargs: dict[str, Any]) -> str:
27
- # https://google.github.io/python-fire/guide/
28
- # https://github.com/google/python-fire/blob/master/docs/guide.md#argument-parsing
29
- if not kwargs: # empty dict
30
- kwargs_str = ""
31
- else:
32
- # For fire module, all keyword arguments should be passed as --key value pairs
33
- tmp_list: list[str] = []
34
- for k, v in kwargs.items():
35
- tmp_list.append(f"--{k} {v}")
36
- kwargs_str = " " + " ".join(tmp_list) + " "
37
- return kwargs_str
3
+ from pathlib import Path
4
+ import platform
38
5
 
39
6
 
40
7
  def parse_pyfile(file_path: str):
@@ -45,7 +12,7 @@ def parse_pyfile(file_path: str):
45
12
  func_args: list[list[args_spec]] = [[]] # this firt prepopulated dict is for the option 'RUN AS MAIN' which has no args
46
13
  import ast
47
14
 
48
- parsed_ast = ast.parse(PathExtended(file_path).read_text(encoding="utf-8"))
15
+ parsed_ast = ast.parse(Path(file_path).read_text(encoding="utf-8"))
49
16
  functions = [node for node in ast.walk(parsed_ast) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]
50
17
  module__doc__ = ast.get_docstring(parsed_ast)
51
18
  main_option = f"RUN AS MAIN -- {module__doc__ if module__doc__ is not None else 'NoDocs'}"
@@ -86,58 +53,6 @@ def parse_pyfile(file_path: str):
86
53
  return options, func_args
87
54
 
88
55
 
89
- def interactively_run_function(func: Callable[[Any], Any]):
90
- sig = inspect.signature(func)
91
- params = list(sig.parameters.values())
92
- args = []
93
- kwargs = {}
94
- for param in params:
95
- if param.annotation is not inspect.Parameter.empty:
96
- hint = f" ({param.annotation.__name__})"
97
- else:
98
- hint = ""
99
- if param.default is not inspect.Parameter.empty:
100
- default = param.default
101
- value = input(f"Please enter a value for argument `{param.name}` (type = {hint}) (default = {default}) : ")
102
- if value == "":
103
- value = default
104
- else:
105
- value = input(f"Please enter a value for argument `{param.name}` (type = {hint}) : ")
106
- try:
107
- if param.annotation is not inspect.Parameter.empty:
108
- value = param.annotation
109
- except (TypeError, ValueError) as err:
110
- raise ValueError(f"Invalid input: {value} is not of type {param.annotation}") from err
111
- if param.kind == inspect.Parameter.KEYWORD_ONLY:
112
- kwargs[param.name] = value
113
- else:
114
- args.append((param.name, value))
115
- args_to_kwargs = dict(args)
116
- return args_to_kwargs, kwargs
117
-
118
-
119
- def get_attrs_recursively(obj: Any):
120
- if hasattr(obj, "__dict__"):
121
- res = {}
122
- for k, v in obj.__dict__.items():
123
- res[k] = get_attrs_recursively(v)
124
- return res
125
- return obj
126
-
127
-
128
- # def run_on_remote(func_file: str, args: argparse.Namespace):
129
- # host = choose_ssh_host(multi=False)
130
- # assert isinstance(host, str), f"host must be a string. Got {type(host)}"
131
- # from machineconfig.cluster.remote_machine import RemoteMachine, RemoteMachineConfig
132
- # config = RemoteMachineConfig(copy_repo=True, update_repo=False, update_essential_repos=True,
133
- # notify_upon_completion=True, ssh_params=dict(host=host),
134
- # # to_email=None, email_config_name='enaut',
135
- # data=[],
136
- # ipython=False, interactive=args.interactive, pdb=False, pudb=args.debug, wrap_in_try_except=False,
137
- # transfer_method="sftp")
138
- # m = RemoteMachine(func=func_file, func_kwargs=None, config=config)
139
- # m.run()
140
-
141
56
 
142
57
  def find_repo_root_path(start_path: str) -> Optional[str]:
143
58
  root_files = ["setup.py", "pyproject.toml", ".git"]
@@ -178,3 +93,56 @@ def get_import_module_code(module_path: str):
178
93
  module_name = "IncorrectModuleName"
179
94
  # TODO: use py_compile to check if the statement is valid code to avoid syntax errors that can't be caught.
180
95
  return f"from {module_name} import *"
96
+
97
+
98
+ def wrap_import_in_try_except(import_line: str, pyfile: str, repo_root: Optional[str] = None) -> None:
99
+ try:
100
+ exec(import_line) # type: ignore
101
+ except (ImportError, ModuleNotFoundError) as ex:
102
+ print(fr"❌ Failed to import `{pyfile}` as a module: {ex} ")
103
+ print("⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
104
+ import sys
105
+ sys.path.append(str(Path(pyfile).parent))
106
+ if repo_root is not None:
107
+ sys.path.append(repo_root)
108
+ exec(f"from {Path(pyfile).stem} import *")
109
+ print(fr"✅ Successfully imported `{pyfile}`")
110
+
111
+
112
+ def add_to_path(path_variable: str, directory: str) -> str:
113
+ """
114
+ Generate shell script to add directory to path_variable.
115
+ Handles both Windows (cmd) and Unix-like systems (bash/zsh).
116
+ Checks if variable exists before appending, otherwise creates it.
117
+ """
118
+ system = platform.system()
119
+
120
+ if system == "Windows":
121
+ script = f"""# Check if {path_variable} is defined
122
+ if (Test-Path env:{path_variable}) {{
123
+ Write-Host "Adding {directory} to existing {path_variable}"
124
+ $currentValue = [Environment]::GetEnvironmentVariable("{path_variable}", "User")
125
+ $newValue = "$currentValue;{directory}"
126
+ [Environment]::SetEnvironmentVariable("{path_variable}", $newValue, "User")
127
+ $env:{path_variable} = $newValue
128
+ }} else {{
129
+ Write-Host "Creating new {path_variable} variable"
130
+ [Environment]::SetEnvironmentVariable("{path_variable}", "{directory}", "User")
131
+ $env:{path_variable} = "{directory}"
132
+ }}
133
+ Write-Host "{path_variable} is now: $env:{path_variable}\""""
134
+ return script
135
+ else:
136
+ script = f"""#!/bin/bash
137
+ # Check if {path_variable} is defined and not empty
138
+ if [ -z "${{{path_variable}}}" ]; then
139
+ echo "Creating new {path_variable} variable"
140
+ export {path_variable}="{directory}"
141
+ else
142
+ echo "Adding {directory} to existing {path_variable}"
143
+ export {path_variable}="${{{path_variable}}}:{directory}"
144
+ fi
145
+ echo "{path_variable} is now: ${{{path_variable}}}"
146
+ """
147
+ return script
148
+