machineconfig 3.99__py3-none-any.whl → 7.66__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (418) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -16
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +69 -53
  34. machineconfig/jobs/installer/custom/hx.py +77 -20
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
  36. machineconfig/jobs/installer/custom_dev/brave.py +43 -35
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +33 -21
  40. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  41. machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
  42. machineconfig/jobs/installer/custom_dev/goes.py +41 -36
  43. machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
  44. machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
  45. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
  46. machineconfig/jobs/installer/custom_dev/redis.py +51 -33
  47. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  48. machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
  49. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  50. machineconfig/jobs/installer/installer_data.json +3406 -0
  51. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  52. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  53. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  54. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  55. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  56. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  57. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  58. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  59. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  60. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  61. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  62. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  63. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  64. machineconfig/jobs/installer/package_groups.py +255 -0
  65. machineconfig/logger.py +0 -1
  66. machineconfig/profile/backup.toml +49 -0
  67. machineconfig/profile/bash_shell_profiles.md +11 -0
  68. machineconfig/profile/create_helper.py +74 -0
  69. machineconfig/profile/create_links.py +288 -0
  70. machineconfig/profile/create_links_export.py +100 -0
  71. machineconfig/profile/create_shell_profile.py +136 -0
  72. machineconfig/profile/mapper.toml +258 -0
  73. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/initai.py +3 -28
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  89. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  90. machineconfig/scripts/python/cloud.py +29 -0
  91. machineconfig/scripts/python/croshell.py +117 -181
  92. machineconfig/scripts/python/define.py +31 -0
  93. machineconfig/scripts/python/devops.py +44 -124
  94. machineconfig/scripts/python/devops_navigator.py +10 -0
  95. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  96. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  97. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  98. machineconfig/scripts/python/explore.py +49 -0
  99. machineconfig/scripts/python/fire_jobs.py +106 -244
  100. machineconfig/scripts/python/ftpx.py +125 -68
  101. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  102. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  103. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  106. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  107. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  108. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  109. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  110. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  111. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  112. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  113. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
  114. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  115. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  116. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  117. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
  118. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  119. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  120. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  121. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  122. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  123. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  124. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  125. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  126. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  127. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  128. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  129. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  130. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  131. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  132. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  133. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  134. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  135. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
  136. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  137. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  138. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  139. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  140. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  141. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  142. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  143. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  144. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  145. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  146. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  147. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  148. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  149. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  150. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  151. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  152. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  153. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  154. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  155. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  156. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  157. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  158. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  159. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  160. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  161. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  162. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  163. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  164. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  165. machineconfig/scripts/python/interactive.py +79 -160
  166. machineconfig/scripts/python/machineconfig.py +63 -0
  167. machineconfig/scripts/python/msearch.py +21 -0
  168. machineconfig/scripts/python/nw/__init__.py +0 -0
  169. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  170. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  171. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  172. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  173. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  174. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  175. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  176. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  177. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  178. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  179. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
  180. machineconfig/scripts/python/sessions.py +167 -0
  181. machineconfig/scripts/python/terminal.py +127 -0
  182. machineconfig/scripts/python/utils.py +66 -0
  183. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  184. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  185. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  186. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  187. machineconfig/settings/broot/br.sh +0 -4
  188. machineconfig/settings/broot/conf.toml +1 -1
  189. machineconfig/settings/helix/config.toml +16 -0
  190. machineconfig/settings/helix/languages.toml +13 -4
  191. machineconfig/settings/helix/yazi-picker.sh +12 -0
  192. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  193. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  194. machineconfig/settings/lf/linux/lfrc +10 -12
  195. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  196. machineconfig/settings/lf/windows/lfrc +18 -38
  197. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  198. machineconfig/settings/linters/.ruff.toml +1 -1
  199. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  200. machineconfig/settings/marimo/marimo.toml +80 -0
  201. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  202. machineconfig/settings/pistol/pistol.conf +1 -1
  203. machineconfig/settings/shells/bash/init.sh +55 -31
  204. machineconfig/settings/shells/nushell/config.nu +1 -34
  205. machineconfig/settings/shells/nushell/init.nu +127 -0
  206. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  207. machineconfig/settings/shells/starship/starship.toml +16 -0
  208. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  209. machineconfig/settings/shells/wt/settings.json +32 -17
  210. machineconfig/settings/shells/zsh/init.sh +89 -0
  211. machineconfig/settings/svim/linux/init.toml +0 -4
  212. machineconfig/settings/svim/windows/init.toml +0 -3
  213. machineconfig/settings/yazi/init.lua +57 -0
  214. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  215. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  216. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  217. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  218. machineconfig/settings/yazi/yazi.toml +13 -0
  219. machineconfig/setup_linux/__init__.py +10 -0
  220. machineconfig/setup_linux/apps_desktop.sh +89 -0
  221. machineconfig/setup_linux/apps_gui.sh +64 -0
  222. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  223. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  224. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  225. machineconfig/setup_linux/uv.sh +15 -0
  226. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  227. machineconfig/setup_mac/__init__.py +16 -0
  228. machineconfig/setup_mac/apps_gui.sh +248 -0
  229. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  230. machineconfig/setup_mac/uv.sh +36 -0
  231. machineconfig/setup_windows/__init__.py +8 -0
  232. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  233. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  234. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  235. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  236. machineconfig/setup_windows/uv.ps1 +10 -0
  237. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
  238. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  239. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  240. machineconfig/utils/accessories.py +7 -5
  241. machineconfig/utils/cloud/onedrive/README.md +139 -0
  242. machineconfig/utils/code.py +140 -93
  243. machineconfig/utils/files/art/fat_croco.txt +10 -0
  244. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  245. machineconfig/utils/files/art/happy_croco.txt +22 -0
  246. machineconfig/utils/files/art/water_croco.txt +11 -0
  247. machineconfig/utils/files/ascii_art.py +118 -0
  248. machineconfig/utils/files/dbms.py +257 -0
  249. machineconfig/utils/files/headers.py +68 -0
  250. machineconfig/utils/files/ouch/__init__.py +0 -0
  251. machineconfig/utils/files/ouch/decompress.py +45 -0
  252. machineconfig/utils/files/read.py +95 -0
  253. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  254. machineconfig/utils/installer_utils/installer_class.py +68 -126
  255. machineconfig/utils/installer_utils/installer_cli.py +181 -0
  256. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
  257. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
  258. machineconfig/utils/io.py +77 -23
  259. machineconfig/utils/links.py +309 -100
  260. machineconfig/utils/meta.py +255 -0
  261. machineconfig/utils/notifications.py +1 -1
  262. machineconfig/utils/options.py +10 -25
  263. machineconfig/utils/path_extended.py +94 -104
  264. machineconfig/utils/path_helper.py +75 -22
  265. machineconfig/utils/procs.py +50 -74
  266. machineconfig/utils/scheduler.py +94 -97
  267. machineconfig/utils/scheduling.py +0 -3
  268. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  269. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +2 -1
  271. machineconfig/utils/source_of_truth.py +3 -6
  272. machineconfig/utils/ssh.py +742 -254
  273. machineconfig/utils/ssh_utils/utils.py +0 -0
  274. machineconfig/utils/terminal.py +3 -140
  275. machineconfig/utils/tst.py +20 -0
  276. machineconfig/utils/upgrade_packages.py +109 -28
  277. machineconfig/utils/ve.py +13 -5
  278. machineconfig-7.66.dist-info/METADATA +124 -0
  279. machineconfig-7.66.dist-info/RECORD +451 -0
  280. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  281. machineconfig/cluster/templates/utils.py +0 -51
  282. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  283. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  284. machineconfig/jobs/installer/packages_custom_dev.json +0 -226
  285. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  286. machineconfig/jobs/installer/packages_github_dev.json +0 -1110
  287. machineconfig/jobs/installer/packages_github_essential.json +0 -804
  288. machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
  289. machineconfig/jobs/python/create_bootable_media.py +0 -16
  290. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  291. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  292. machineconfig/jobs/python/tasks.py +0 -3
  293. machineconfig/jobs/python/vscode/api.py +0 -49
  294. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  295. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  296. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  297. machineconfig/jobs/windows/startup_file.cmd +0 -2
  298. machineconfig/profile/create.py +0 -170
  299. machineconfig/profile/shell.py +0 -176
  300. machineconfig/scripts/cloud/init.sh +0 -119
  301. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  302. machineconfig/scripts/linux/cloud_copy +0 -2
  303. machineconfig/scripts/linux/cloud_mount +0 -2
  304. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  305. machineconfig/scripts/linux/cloud_sync +0 -2
  306. machineconfig/scripts/linux/croshell +0 -3
  307. machineconfig/scripts/linux/devops +0 -2
  308. machineconfig/scripts/linux/fire +0 -2
  309. machineconfig/scripts/linux/fire_agents +0 -2
  310. machineconfig/scripts/linux/ftpx +0 -2
  311. machineconfig/scripts/linux/fzf2g +0 -21
  312. machineconfig/scripts/linux/fzffg +0 -25
  313. machineconfig/scripts/linux/gh_models +0 -2
  314. machineconfig/scripts/linux/initai +0 -2
  315. machineconfig/scripts/linux/kill_process +0 -2
  316. machineconfig/scripts/linux/programs +0 -21
  317. machineconfig/scripts/linux/repos +0 -2
  318. machineconfig/scripts/linux/scheduler +0 -2
  319. machineconfig/scripts/linux/share_smb +0 -1
  320. machineconfig/scripts/linux/start_slidev +0 -2
  321. machineconfig/scripts/linux/start_terminals +0 -3
  322. machineconfig/scripts/linux/warp-cli.sh +0 -122
  323. machineconfig/scripts/linux/wifi_conn +0 -2
  324. machineconfig/scripts/linux/z_ls +0 -104
  325. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  326. machineconfig/scripts/python/cloud_repo_sync.py +0 -186
  327. machineconfig/scripts/python/devops_devapps_install.py +0 -159
  328. machineconfig/scripts/python/devops_update_repos.py +0 -180
  329. machineconfig/scripts/python/dotfile.py +0 -52
  330. machineconfig/scripts/python/fire_agents.py +0 -175
  331. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  332. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  333. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
  334. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
  335. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  336. machineconfig/scripts/python/gh_models.py +0 -104
  337. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  338. machineconfig/scripts/python/repos.py +0 -80
  339. machineconfig/scripts/python/repos_helper_action.py +0 -335
  340. machineconfig/scripts/python/share_terminal.py +0 -104
  341. machineconfig/scripts/python/snapshot.py +0 -25
  342. machineconfig/scripts/python/start_terminals.py +0 -121
  343. machineconfig/scripts/python/t4.py +0 -17
  344. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  345. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  346. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  347. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  348. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  349. machineconfig/scripts/windows/croshell.ps1 +0 -1
  350. machineconfig/scripts/windows/devops.ps1 +0 -1
  351. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  352. machineconfig/scripts/windows/fire.ps1 +0 -1
  353. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  354. machineconfig/scripts/windows/gpt.ps1 +0 -1
  355. machineconfig/scripts/windows/grep.ps1 +0 -2
  356. machineconfig/scripts/windows/initai.ps1 +0 -1
  357. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  358. machineconfig/scripts/windows/nano.ps1 +0 -3
  359. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  360. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  361. machineconfig/scripts/windows/repos.ps1 +0 -1
  362. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  363. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  364. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  365. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  366. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  367. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  368. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  369. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  370. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  371. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  372. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  373. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  374. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  375. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  376. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  377. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  378. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  379. machineconfig-3.99.dist-info/METADATA +0 -167
  380. machineconfig-3.99.dist-info/RECORD +0 -409
  381. machineconfig-3.99.dist-info/entry_points.txt +0 -18
  382. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  383. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  384. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  385. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  386. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  387. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  388. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  389. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  390. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  391. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  392. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  393. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  394. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  395. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  396. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  397. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  398. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  399. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  400. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  401. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  402. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  403. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  404. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  405. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  406. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  407. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  408. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  409. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  410. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  411. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  412. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  413. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  414. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  415. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  416. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  417. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  418. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,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
 
@@ -1,38 +1,7 @@
1
- from typing import Any, Callable, Optional
2
- import inspect
1
+ from typing import Optional
3
2
  import os
4
-
5
- from machineconfig.utils.path_extended import PathExtended as PathExtended
6
-
7
-
8
- def search_for_files_of_interest(path_obj: PathExtended):
9
- if path_obj.joinpath(".venv").exists():
10
- path_objects = path_obj.search("*", not_in=[".venv"])
11
- files: list[PathExtended] = []
12
- for a_path_obj in path_objects:
13
- files += search_for_files_of_interest(path_obj=a_path_obj)
14
- return files
15
- if path_obj.is_file():
16
- return [path_obj]
17
- py_files = path_obj.search(pattern="*.py", not_in=["__init__.py"], r=True)
18
- ps_files = path_obj.search(pattern="*.ps1", r=True)
19
- sh_files = path_obj.search(pattern="*.sh", r=True)
20
- files = py_files + ps_files + sh_files
21
- return files
22
-
23
-
24
- def convert_kwargs_to_fire_kwargs_str(kwargs: dict[str, Any]) -> str:
25
- # https://google.github.io/python-fire/guide/
26
- # https://github.com/google/python-fire/blob/master/docs/guide.md#argument-parsing
27
- if not kwargs: # empty dict
28
- kwargs_str = ""
29
- else:
30
- # For fire module, all keyword arguments should be passed as --key value pairs
31
- tmp_list: list[str] = []
32
- for k, v in kwargs.items():
33
- tmp_list.append(f"--{k} {v}")
34
- kwargs_str = " " + " ".join(tmp_list) + " "
35
- return kwargs_str
3
+ from pathlib import Path
4
+ import platform
36
5
 
37
6
 
38
7
  def parse_pyfile(file_path: str):
@@ -43,7 +12,7 @@ def parse_pyfile(file_path: str):
43
12
  func_args: list[list[args_spec]] = [[]] # this firt prepopulated dict is for the option 'RUN AS MAIN' which has no args
44
13
  import ast
45
14
 
46
- 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"))
47
16
  functions = [node for node in ast.walk(parsed_ast) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]
48
17
  module__doc__ = ast.get_docstring(parsed_ast)
49
18
  main_option = f"RUN AS MAIN -- {module__doc__ if module__doc__ is not None else 'NoDocs'}"
@@ -84,58 +53,6 @@ def parse_pyfile(file_path: str):
84
53
  return options, func_args
85
54
 
86
55
 
87
- def interactively_run_function(func: Callable[[Any], Any]):
88
- sig = inspect.signature(func)
89
- params = list(sig.parameters.values())
90
- args = []
91
- kwargs = {}
92
- for param in params:
93
- if param.annotation is not inspect.Parameter.empty:
94
- hint = f" ({param.annotation.__name__})"
95
- else:
96
- hint = ""
97
- if param.default is not inspect.Parameter.empty:
98
- default = param.default
99
- value = input(f"Please enter a value for argument `{param.name}` (type = {hint}) (default = {default}) : ")
100
- if value == "":
101
- value = default
102
- else:
103
- value = input(f"Please enter a value for argument `{param.name}` (type = {hint}) : ")
104
- try:
105
- if param.annotation is not inspect.Parameter.empty:
106
- value = param.annotation
107
- except (TypeError, ValueError) as err:
108
- raise ValueError(f"Invalid input: {value} is not of type {param.annotation}") from err
109
- if param.kind == inspect.Parameter.KEYWORD_ONLY:
110
- kwargs[param.name] = value
111
- else:
112
- args.append((param.name, value))
113
- args_to_kwargs = dict(args)
114
- return args_to_kwargs, kwargs
115
-
116
-
117
- def get_attrs_recursively(obj: Any):
118
- if hasattr(obj, "__dict__"):
119
- res = {}
120
- for k, v in obj.__dict__.items():
121
- res[k] = get_attrs_recursively(v)
122
- return res
123
- return obj
124
-
125
-
126
- # def run_on_remote(func_file: str, args: argparse.Namespace):
127
- # host = choose_ssh_host(multi=False)
128
- # assert isinstance(host, str), f"host must be a string. Got {type(host)}"
129
- # from machineconfig.cluster.remote_machine import RemoteMachine, RemoteMachineConfig
130
- # config = RemoteMachineConfig(copy_repo=True, update_repo=False, update_essential_repos=True,
131
- # notify_upon_completion=True, ssh_params=dict(host=host),
132
- # # to_email=None, email_config_name='enaut',
133
- # data=[],
134
- # ipython=False, interactive=args.interactive, pdb=False, pudb=args.debug, wrap_in_try_except=False,
135
- # transfer_method="sftp")
136
- # m = RemoteMachine(func=func_file, func_kwargs=None, config=config)
137
- # m.run()
138
-
139
56
 
140
57
  def find_repo_root_path(start_path: str) -> Optional[str]:
141
58
  root_files = ["setup.py", "pyproject.toml", ".git"]
@@ -176,3 +93,56 @@ def get_import_module_code(module_path: str):
176
93
  module_name = "IncorrectModuleName"
177
94
  # TODO: use py_compile to check if the statement is valid code to avoid syntax errors that can't be caught.
178
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
+
@@ -0,0 +1,145 @@
1
+ from dataclasses import dataclass
2
+ from typing import Optional, Any
3
+
4
+
5
+ @dataclass
6
+ class FireJobArgs:
7
+ """Type-safe dataclass for fire_jobs command line arguments."""
8
+
9
+ path: str = "."
10
+ function: Optional[str] = None
11
+ ve: str = ""
12
+ cmd: bool = False
13
+ interactive: bool = False
14
+ debug: bool = False
15
+ choose_function: bool = False
16
+ loop: bool = False
17
+ jupyter: bool = False
18
+ marimo: bool = False
19
+ submit_to_cloud: bool = False
20
+ remote: bool = False
21
+ module: bool = False
22
+ streamlit: bool = False
23
+ environment: str = ""
24
+ holdDirectory: bool = False
25
+ PathExport: bool = False
26
+ git_pull: bool = False
27
+ optimized: bool = False
28
+ zellij_tab: Optional[str] = None
29
+ watch: bool = False
30
+
31
+
32
+ def extract_kwargs(args: FireJobArgs) -> dict[str, object]:
33
+ """Extract kwargs from command line arguments in Fire format.
34
+
35
+ Parses Fire-like arguments (e.g., --a=2, --name=value) from sys.argv
36
+ and returns them as a dictionary.
37
+
38
+ Returns:
39
+ Dictionary mapping argument names to their values
40
+ """
41
+ import sys
42
+
43
+ kwargs: dict[str, object] = {}
44
+
45
+ # Look for Fire-style arguments in sys.argv
46
+ for arg in sys.argv:
47
+ # Skip the -- separator
48
+ if arg == '--':
49
+ continue
50
+
51
+ # Match patterns like --key=value or --key value (but we'll focus on --key=value)
52
+ if arg.startswith('--') and '=' in arg:
53
+ key, value = arg[2:].split('=', 1) # Remove -- prefix and split on first =
54
+
55
+ # Try to convert value to appropriate type
56
+ kwargs[key] = _convert_value_type(value)
57
+ elif arg.startswith('--') and '=' not in arg:
58
+ # Handle boolean flags like --debug
59
+ key = arg[2:] # Remove -- prefix
60
+
61
+ # Skip empty key (this would happen if someone just used '--')
62
+ if not key:
63
+ continue
64
+
65
+ # Check if next argument exists and doesn't start with --
66
+ arg_index = sys.argv.index(arg)
67
+ if arg_index + 1 < len(sys.argv) and not sys.argv[arg_index + 1].startswith('--'):
68
+ # Next argument is the value
69
+ value = sys.argv[arg_index + 1]
70
+ kwargs[key] = _convert_value_type(value)
71
+ else:
72
+ # It's a boolean flag
73
+ kwargs[key] = True
74
+
75
+ return kwargs
76
+
77
+
78
+ def _convert_value_type(value: str) -> object:
79
+ """Convert string value to appropriate Python type."""
80
+ # Try to convert to int
81
+ try:
82
+ if '.' not in value and 'e' not in value.lower():
83
+ return int(value)
84
+ except ValueError:
85
+ pass
86
+
87
+ # Try to convert to float
88
+ try:
89
+ return float(value)
90
+ except ValueError:
91
+ pass
92
+
93
+ # Try to convert boolean strings
94
+ if value.lower() in ('true', '1', 'yes', 'on'):
95
+ return True
96
+ elif value.lower() in ('false', '0', 'no', 'off'):
97
+ return False
98
+
99
+ # Try to convert None
100
+ if value.lower() == 'none':
101
+ return None
102
+
103
+ # Try to parse as list (comma-separated values)
104
+ if ',' in value:
105
+ items = [_convert_value_type(item.strip()) for item in value.split(',')]
106
+ return items
107
+
108
+ # Return as string if no conversion possible
109
+ return value
110
+
111
+
112
+ def parse_fire_args_from_argv() -> str:
113
+ """Parse arguments after -- separator for Fire compatibility.
114
+
115
+ Returns:
116
+ String of Fire-compatible arguments to append to command
117
+ """
118
+ import sys
119
+
120
+ if '--' in sys.argv:
121
+ separator_index = sys.argv.index('--')
122
+ fire_args = sys.argv[separator_index + 1:]
123
+ # Join all Fire arguments - they should already be in Fire format
124
+ return ' '.join(fire_args) if fire_args else ''
125
+
126
+ return ''
127
+
128
+
129
+ def parse_fire_args_from_context(ctx: Any) -> str:
130
+ """Parse Fire arguments from typer context.
131
+
132
+ Args:
133
+ ctx: Typer context containing raw arguments
134
+
135
+ Returns:
136
+ String of Fire-compatible arguments to append to command
137
+ """
138
+ # Get remaining args that weren't consumed by typer
139
+ if hasattr(ctx, 'args') and ctx.args:
140
+ args = ctx.args
141
+ # Filter out the -- separator if present
142
+ if args and args[0] == '--':
143
+ args = args[1:]
144
+ return ' '.join(args)
145
+ return ''