machineconfig 7.98__py3-none-any.whl → 8.51__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.
Files changed (331) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +26 -20
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  26. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  27. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  28. machineconfig/logger.py +1 -1
  29. machineconfig/profile/create_helper.py +21 -10
  30. machineconfig/profile/create_links.py +77 -20
  31. machineconfig/profile/create_links_export.py +63 -58
  32. machineconfig/profile/create_shell_profile.py +14 -0
  33. machineconfig/profile/mapper_data.toml +45 -0
  34. machineconfig/profile/mapper_dotfiles.toml +249 -0
  35. machineconfig/scripts/python/agents.py +76 -171
  36. machineconfig/scripts/python/ai/initai.py +3 -1
  37. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  38. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  39. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  40. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  42. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  44. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  46. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  47. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  48. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  49. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  50. machineconfig/scripts/python/cloud.py +58 -11
  51. machineconfig/scripts/python/croshell.py +4 -155
  52. machineconfig/scripts/python/devops.py +57 -38
  53. machineconfig/scripts/python/devops_navigator.py +17 -3
  54. machineconfig/scripts/python/fire_jobs.py +10 -193
  55. machineconfig/scripts/python/ftpx.py +5 -224
  56. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  57. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  58. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  59. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  62. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  64. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  65. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  70. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  71. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  72. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  75. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  76. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  77. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  78. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  79. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  80. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  85. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_nw.py +69 -82
  86. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +47 -22
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  89. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  98. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  99. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  100. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  101. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  102. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  103. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  104. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  105. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  106. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +1 -1
  107. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  108. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  109. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  110. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  111. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  112. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  113. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  114. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  115. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  116. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  117. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_ssh.py +2 -2
  118. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  119. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  120. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  121. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  122. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  123. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  124. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +118 -34
  125. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  126. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  127. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  128. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  129. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  130. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  131. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  132. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  133. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  134. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  135. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  136. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  137. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  138. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  139. machineconfig/scripts/python/mcfg_entry.py +133 -48
  140. machineconfig/scripts/python/msearch.py +16 -61
  141. machineconfig/scripts/python/sessions.py +68 -203
  142. machineconfig/scripts/python/terminal.py +27 -102
  143. machineconfig/scripts/python/utils.py +101 -22
  144. machineconfig/settings/atuin/config.toml +294 -0
  145. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  146. machineconfig/settings/linters/.ruff.toml +2 -1
  147. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  148. machineconfig/settings/shells/bash/init.sh +6 -3
  149. machineconfig/settings/shells/nushell/config.nu +23 -1
  150. machineconfig/settings/shells/nushell/env.nu +22 -48
  151. machineconfig/settings/shells/nushell/init.nu +64 -240
  152. machineconfig/settings/shells/pwsh/init.ps1 +69 -1
  153. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  154. machineconfig/settings/shells/wezterm/wezterm.lua +4 -1
  155. machineconfig/settings/shells/wt/settings.json +21 -21
  156. machineconfig/settings/shells/zsh/init.sh +25 -4
  157. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  158. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  159. machineconfig/settings/tv/config.toml +234 -0
  160. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  161. machineconfig/settings/wsl/.wslconfig +5 -30
  162. machineconfig/settings/wt/__init__.py +0 -0
  163. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  164. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  165. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  166. machineconfig/setup_linux/__init__.py +0 -1
  167. machineconfig/setup_linux/apps_desktop.sh +8 -27
  168. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  169. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  170. machineconfig/setup_mac/__init__.py +0 -2
  171. machineconfig/setup_windows/__init__.py +2 -5
  172. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  173. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  174. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  175. machineconfig/type_hinting/sql/__init__.py +1 -0
  176. machineconfig/type_hinting/sql/base.py +216 -0
  177. machineconfig/type_hinting/sql/core_schema.py +64 -0
  178. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  179. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  180. machineconfig/type_hinting/typedict/__init__.py +1 -0
  181. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  182. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  183. machineconfig/type_hinting/typedict/generators.py +231 -0
  184. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  185. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  186. machineconfig/utils/accessories.py +24 -0
  187. machineconfig/utils/code.py +78 -33
  188. machineconfig/utils/files/ascii_art.py +10 -14
  189. machineconfig/utils/files/headers.py +3 -5
  190. machineconfig/utils/files/read.py +8 -1
  191. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  192. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  193. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  194. machineconfig/utils/installer_utils/installer_class.py +12 -4
  195. machineconfig/utils/installer_utils/installer_cli.py +1 -15
  196. machineconfig/utils/installer_utils/installer_helper.py +2 -2
  197. machineconfig/utils/installer_utils/installer_locator_utils.py +13 -13
  198. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  199. machineconfig/utils/io.py +25 -8
  200. machineconfig/utils/meta.py +6 -4
  201. machineconfig/utils/options.py +49 -19
  202. machineconfig/utils/options_utils/__init__.py +0 -0
  203. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  204. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  205. machineconfig/utils/options_utils/tv_options.py +37 -0
  206. machineconfig/utils/path_extended.py +8 -7
  207. machineconfig/utils/scheduler.py +8 -2
  208. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  209. machineconfig/utils/source_of_truth.py +6 -1
  210. machineconfig/utils/ssh.py +73 -23
  211. machineconfig/utils/ssh_utils/abc.py +1 -1
  212. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  213. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  214. machineconfig/utils/ssh_utils/utils.py +23 -7
  215. machineconfig/utils/ssh_utils/wsl.py +107 -170
  216. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  217. machineconfig/utils/upgrade_packages.py +4 -8
  218. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/METADATA +30 -22
  219. machineconfig-8.51.dist-info/RECORD +543 -0
  220. machineconfig/jobs/installer/check_installations.py +0 -248
  221. machineconfig/profile/backup.toml +0 -49
  222. machineconfig/profile/mapper.toml +0 -263
  223. machineconfig/scripts/linux/other/switch_ip +0 -20
  224. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  225. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  226. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  227. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  228. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  229. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  230. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  231. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  232. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  233. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  234. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  235. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  236. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  237. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  238. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  239. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  240. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  241. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  242. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  243. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  244. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  245. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  246. machineconfig/setup_windows/others/obs.ps1 +0 -4
  247. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  248. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  249. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  250. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  251. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  252. machineconfig/utils/options_tv.py +0 -119
  253. machineconfig/utils/tst.py +0 -20
  254. machineconfig-7.98.dist-info/RECORD +0 -504
  255. /machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  256. /machineconfig/{scripts/python/helpers_agents → jobs/installer/python_scripts}/__init__.py +0 -0
  257. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  258. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  259. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  260. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  261. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  262. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  263. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  264. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  265. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  266. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  267. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  268. /machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  269. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  270. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_drive +0 -0
  271. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nfs +0 -0
  272. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  273. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_smb +0 -0
  274. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  275. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  276. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  277. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  278. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  279. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  280. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  281. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  282. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  283. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  284. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  285. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  286. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  287. /machineconfig/scripts/python/{helpers_agents/agentic_frameworks → graph}/__init__.py +0 -0
  288. /machineconfig/scripts/python/{helpers_cloud → helpers}/__init__.py +0 -0
  289. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  290. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  291. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_agents}/__init__.py +0 -0
  292. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  293. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  294. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  295. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  296. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  297. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  298. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  299. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_cloud}/__init__.py +0 -0
  300. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  301. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  302. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_croshell}/__init__.py +0 -0
  303. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  304. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  305. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  306. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  307. /machineconfig/scripts/python/{helpers_network → helpers/helpers_devops}/__init__.py +0 -0
  308. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops/themes}/__init__.py +0 -0
  309. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  310. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_fire_command}/__init__.py +0 -0
  311. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  312. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/f.py +0 -0
  313. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_streamlit_helper.py +0 -0
  314. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  316. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_network/__init__.py} +0 -0
  317. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nfs.py +0 -0
  318. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nw_drive.py +0 -0
  319. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  320. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  321. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  322. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  323. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  324. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  325. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  326. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  327. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  328. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  329. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  330. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +0 -0
  331. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -103,7 +103,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
103
103
  slf = self.expanduser().resolve()
104
104
  if content:
105
105
  assert self.is_dir(), NotADirectoryError(f"💥 When `content` flag is set to True, path must be a directory. It is not: `{repr(self)}`")
106
- [x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.search("*")]
106
+ [x.move(folder=path.parent, content=False, overwrite=overwrite) for x in self.glob("*")]
107
107
  return path # contents live within this directory.
108
108
  if overwrite:
109
109
  tmp_path = slf.rename(path.parent.absolute() / randstr())
@@ -174,7 +174,8 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
174
174
  appended_name = f"""{name}_{len(self.parent.search(f"*{self.name.split('.')[0]}*"))}"""
175
175
  return self.append(name=appended_name, index=False, verbose=verbose, suffix=suffix, **kwargs)
176
176
  full_name = name or ("_" + str(timestamp()))
177
- full_suffix = suffix or "".join(("bruh" + self).suffixes)
177
+ whatever = ("bruh" + self)
178
+ full_suffix = suffix or "".join(whatever.suffixes)
178
179
  subpath = self.name.split(".")[0] + full_name + full_suffix
179
180
  dest = self.parent.joinpath(subpath)
180
181
  res = PathExtended(dest)
@@ -294,7 +295,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
294
295
  target = "BROKEN LINK " + str(self) # avoid infinite recursions for broken links.
295
296
  return "🔗 Symlink '" + str(self) + "' ==> " + (str(target) if target == self else str(target))
296
297
  elif self.is_absolute():
297
- return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {self.size()} Mb" if self.is_file() else "")
298
+ return self._type() + " '" + str(self.clickable()) + "'" + (" | " + datetime.fromtimestamp(self.stat().st_ctime).isoformat()[:-7].replace("T", " ") if self.exists() else "") + (f" | {round(self.stat().st_size / (1024**2), 1)} Mb" if self.is_file() else "")
298
299
  elif "http" in str(self):
299
300
  return "🕸️ URL " + str(self.as_url_str())
300
301
  else:
@@ -476,7 +477,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
476
477
  verbose: bool = True,
477
478
  content: bool = False,
478
479
  orig: bool = False,
479
- pwd: Optional[str] = None,
480
480
  mode: FILE_MODE = "w",
481
481
  **kwargs: Any,
482
482
  ) -> "PathExtended":
@@ -493,7 +493,6 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
493
493
  path_resolved = PathExtended(op_zip)
494
494
  else:
495
495
  import shutil
496
-
497
496
  if content:
498
497
  root_dir, base_dir = slf, "."
499
498
  else:
@@ -501,7 +500,7 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
501
500
  base_name = str(path_resolved)[:-4] if str(path_resolved).endswith(".zip") else str(path_resolved)
502
501
  op_zip = shutil.make_archive(base_name=base_name, format="zip", root_dir=str(root_dir), base_dir=str(base_dir), verbose=False, **kwargs)
503
502
  path_resolved = PathExtended(op_zip)
504
- msg = f"ZIPPED {repr(slf)} ==> {repr(path)}"
503
+ msg = f"ZIPPED {repr(slf)} ==> {repr(path_resolved)}"
505
504
  res_out = PathExtended(path_resolved)
506
505
  ret = self if orig else res_out
507
506
  delayed_msg = ""
@@ -538,7 +537,9 @@ class PathExtended(type(Path()), Path): # type: ignore # pylint: disable=E0241
538
537
  assert merge is False, "I have not implemented this yet"
539
538
  assert path is None, "I have not implemented this yet"
540
539
  if tmp:
541
- return self.unzip(folder=PathExtended.tmp().joinpath("tmp_unzips").joinpath(randstr()), content=True).joinpath(self.stem)
540
+ tmp_root = PathExtended("~/tmp_results").expanduser()
541
+ tmp_root.mkdir(parents=True, exist_ok=True)
542
+ return self.unzip(folder=tmp_root.joinpath("tmp_unzips").joinpath(randstr()), content=True).joinpath(self.stem)
542
543
  slf = zipfile__ = self.expanduser().resolve()
543
544
  if any(ztype in str(slf.parent) for ztype in (".zip", ".7z")): # path include a zip archive in the middle.
544
545
  tmp__ = [item for item in (".zip", ".7z", "") if item in str(slf)]
@@ -166,7 +166,10 @@ class CacheMemory[T]():
166
166
  else:
167
167
  age = datetime.now() - self.time_produced
168
168
  if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)):
169
- self.logger.warning(f"""🔄 CACHE UPDATE ⚠️ {self.name} cache: Updating cache from source func. """ + f""" ⏱️ Age = {age} > {self.expire}""" if not fresh else f""" ⏱️ Age = {age}. Fresh flag raised.""")
169
+ if not fresh:
170
+ self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
171
+ else:
172
+ self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
170
173
  t0 = time.time()
171
174
  self.cache = self.source_func()
172
175
  self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
@@ -202,7 +205,10 @@ class Cache[T](): # This class helps to accelrate access to latest data coming
202
205
  if self.path.exists(): # prefer to read from disk over source func as a default source of cache.
203
206
  age = datetime.now() - datetime.fromtimestamp(self.path.stat().st_mtime)
204
207
  if (age > self.expire) or (fresh and (age.total_seconds() > tolerance_seconds)): # cache is old or if fresh flag is raised
205
- self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ if not fresh else """⚠️ Fresh flag raised.""")
208
+ if not fresh:
209
+ self.logger.warning(f"""🔄 CACHE STALE 📦 {self.name} cache: Populating fresh cache from source func. """ + f"""⏱️ Age = {age} > Expiry {self.expire} """ )
210
+ else:
211
+ self.logger.warning(f"""⚠️ Fresh flag raised, age = {age} > {tolerance_seconds} seconds of tolerance. Updating {self.name} cache from source func.""")
206
212
  t0 = time.time()
207
213
  self.cache = self.source_func() # fresh data.
208
214
  self.logger.warning(f"⏱️ Cache population took {time.time() - t0:.2f} seconds.")
@@ -6,7 +6,7 @@ capturing all user inputs collected during interactive execution.
6
6
 
7
7
  from pathlib import Path
8
8
  from typing import TypedDict, Literal, NotRequired
9
- from machineconfig.scripts.python.helpers_agents.fire_agents_help_launch import AGENTS
9
+ from machineconfig.scripts.python.helpers.helpers_agents.fire_agents_help_launch import AGENTS
10
10
 
11
11
  SEARCH_STRATEGIES = Literal["file_path", "keyword_search", "filename_pattern"]
12
12
 
@@ -5,7 +5,12 @@ Utils
5
5
  import machineconfig
6
6
  from pathlib import Path
7
7
 
8
- EXCLUDE_DIRS = [".links", ".ai", ".venv", ".git", ".idea", ".vscode", "node_modules", "__pycache__", ".mypy_cache"]
8
+ EXCLUDE_DIRS = [".links", "notebooks",
9
+ "GEMINI.md", "CLAUDE.md", "CRUSH.md", "AGENTS.md",
10
+ ".cursor", ".clinerules", ".github/instructions", ".github/agents", ".github/prompts",
11
+ ".ai",
12
+ ".venv", ".git", ".idea", ".vscode", "node_modules", "__pycache__", ".mypy_cache"
13
+ ]
9
14
  LIBRARY_ROOT = Path(machineconfig.__file__).resolve().parent
10
15
 
11
16
  CONFIG_ROOT = Path.home().joinpath(".config/machineconfig")
@@ -2,8 +2,8 @@ from typing import Callable, Optional, Any, cast, Union, Literal
2
2
  import os
3
3
  from pathlib import Path
4
4
  import platform
5
- from machineconfig.scripts.python.helpers_utils.path import MachineSpecs
6
- from machineconfig.utils.code import get_uv_run_command
5
+ from machineconfig.scripts.python.helpers.helpers_utils.python import MachineSpecs
6
+ from machineconfig.utils.code import get_uv_command
7
7
  import rich.console
8
8
  from machineconfig.utils.terminal import Response
9
9
  from machineconfig.utils.accessories import pprint, randstr
@@ -14,7 +14,6 @@ from machineconfig.utils.ssh_utils.abc import DEFAULT_PICKLE_SUBDIR
14
14
  class SSH:
15
15
  @staticmethod
16
16
  def from_config_file(host: str) -> "SSH":
17
- """Create SSH instance from SSH config file entry."""
18
17
  return SSH(host=host, username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=False)
19
18
 
20
19
  def __init__(
@@ -148,8 +147,10 @@ class SSH:
148
147
  def view_bar(self, transferred: int, total: int) -> None:
149
148
  if self.progress and self.task is not None:
150
149
  self.progress.update(self.task, completed=transferred, total=total)
150
+
151
151
  self.tqdm_wrap = RichProgressWrapper
152
- from machineconfig.scripts.python.helpers_utils.path import get_machine_specs
152
+ from machineconfig.scripts.python.helpers.helpers_utils.python import get_machine_specs
153
+
153
154
  self.local_specs: MachineSpecs = get_machine_specs()
154
155
  resp = self.run_shell_cmd_on_remote(
155
156
  command="""~/.local/bin/utils get-machine-specs """,
@@ -160,6 +161,7 @@ class SSH:
160
161
  )
161
162
  json_str = resp.op
162
163
  import ast
164
+
163
165
  self.remote_specs: MachineSpecs = cast(MachineSpecs, ast.literal_eval(json_str))
164
166
  self.terminal_responses: list[Response] = []
165
167
 
@@ -177,10 +179,22 @@ class SSH:
177
179
  local_console = rich.console.Console(file=local_buffer, width=40)
178
180
  remote_console = rich.console.Console(file=remote_buffer, width=40)
179
181
  inspect(
180
- type("LocalInfo", (object,), dict(self.local_specs))(), value=False, title="SSHing From", docs=False, dunder=False, sort=False, console=local_console
182
+ type("LocalInfo", (object,), dict(self.local_specs))(),
183
+ value=False,
184
+ title="SSHing From",
185
+ docs=False,
186
+ dunder=False,
187
+ sort=False,
188
+ console=local_console,
181
189
  )
182
190
  inspect(
183
- type("RemoteInfo", (object,), dict(self.remote_specs))(), value=False, title="SSHing To", docs=False, dunder=False, sort=False, console=remote_console
191
+ type("RemoteInfo", (object,), dict(self.remote_specs))(),
192
+ value=False,
193
+ title="SSHing To",
194
+ docs=False,
195
+ dunder=False,
196
+ sort=False,
197
+ console=remote_console,
184
198
  )
185
199
  local_lines = local_buffer.getvalue().split("\n")
186
200
  remote_lines = remote_buffer.getvalue().split("\n")
@@ -215,19 +229,40 @@ class SSH:
215
229
  self.copy_from_here(source_path="~/.ssh/id_rsa.pub", target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=False)
216
230
  if self.remote_specs["system"] != "Windows":
217
231
  raise RuntimeError("send_ssh_key is only supported for Windows remote machines")
218
- code_url = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/setup_windows/openssh-server_add-sshkey.ps1"
219
- import urllib.request
220
-
221
- with urllib.request.urlopen(code_url) as response:
222
- code = response.read().decode("utf-8")
223
- return self.run_shell_cmd_on_remote(command=code, verbose_output=True, description="", strict_stderr=False, strict_return_code=False)
232
+ python_code = '''
233
+ from pathlib import Path
234
+ import subprocess
235
+ sshd_dir = Path("C:/ProgramData/ssh")
236
+ admin_auth_keys = sshd_dir / "administrators_authorized_keys"
237
+ sshd_config = sshd_dir / "sshd_config"
238
+ pubkey_path = Path.home() / ".ssh" / "id_rsa.pub"
239
+ key_content = pubkey_path.read_text(encoding="utf-8").strip()
240
+ if admin_auth_keys.exists():
241
+ existing = admin_auth_keys.read_text(encoding="utf-8")
242
+ if not existing.endswith("\\n"):
243
+ existing += "\\n"
244
+ admin_auth_keys.write_text(existing + key_content + "\\n", encoding="utf-8")
245
+ else:
246
+ admin_auth_keys.write_text(key_content + "\\n", encoding="utf-8")
247
+ icacls_cmd = f'icacls "{admin_auth_keys}" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"'
248
+ subprocess.run(icacls_cmd, shell=True, check=True)
249
+ if sshd_config.exists():
250
+ config_text = sshd_config.read_text(encoding="utf-8")
251
+ config_text = config_text.replace("#PubkeyAuthentication", "PubkeyAuthentication")
252
+ sshd_config.write_text(config_text, encoding="utf-8")
253
+ subprocess.run("Restart-Service sshd -Force", shell=True, check=True)
254
+ print("SSH key added successfully")
255
+ '''
256
+ return self.run_py_remotely(python_code=python_code, uv_with=None, uv_project_dir=None, description="Adding SSH key to Windows remote", verbose_output=True, strict_stderr=False, strict_return_code=False)
224
257
 
225
258
  def get_remote_repr(self, add_machine: bool = False) -> str:
226
259
  return f"{self.username}@{self.hostname}:{self.port}" + (
227
260
  f" [{self.remote_specs['system']}][{self.remote_specs['distro']}]" if add_machine else ""
228
261
  )
262
+
229
263
  def get_local_repr(self, add_machine: bool = False) -> str:
230
264
  import getpass
265
+
231
266
  return f"{getpass.getuser()}@{platform.node()}" + (f" [{platform.system()}][{self.local_specs['distro']}]" if add_machine else "")
232
267
 
233
268
  def get_ssh_conn_str(self, command: str) -> str:
@@ -247,7 +282,9 @@ class SSH:
247
282
  res.output.returncode = os.system(command)
248
283
  return res
249
284
 
250
- def run_shell_cmd_on_remote(self, command: str, verbose_output: bool, description: str, strict_stderr: bool, strict_return_code: bool) -> Response:
285
+ def run_shell_cmd_on_remote(
286
+ self, command: str, verbose_output: bool, description: str, strict_stderr: bool, strict_return_code: bool
287
+ ) -> Response:
251
288
  raw = self.ssh.exec_command(command)
252
289
  res = Response(stdin=raw[0], stdout=raw[1], stderr=raw[2], cmd=command, desc=description) # type: ignore
253
290
  if verbose_output:
@@ -274,12 +311,12 @@ class SSH:
274
311
  with_clause += ""
275
312
  match on:
276
313
  case "local":
277
- uv_run_cmd = get_uv_run_command(platform=self.local_specs["system"])
314
+ uv_cmd = get_uv_command(platform=self.local_specs["system"])
278
315
  case "remote":
279
- uv_run_cmd = get_uv_run_command(platform=self.remote_specs["system"])
316
+ uv_cmd = get_uv_command(platform=self.remote_specs["system"])
280
317
  case _:
281
318
  raise ValueError(f"Invalid value for 'on': {on}. Must be 'local' or 'remote'")
282
- uv_cmd = f"""{uv_run_cmd} {with_clause} python {py_path.relative_to(Path.home())}"""
319
+ uv_cmd = f"""{uv_cmd} run {with_clause} python {py_path.relative_to(Path.home())}"""
283
320
  return uv_cmd
284
321
 
285
322
  def run_py_remotely(
@@ -302,8 +339,7 @@ class SSH:
302
339
  )
303
340
 
304
341
  def run_lambda_function(self, func: Callable[..., Any], import_module: bool, uv_with: Optional[list[str]], uv_project_dir: Optional[str]):
305
- command = lambda_to_python_script(func,
306
- in_global=True, import_module=import_module)
342
+ command = lambda_to_python_script(func, in_global=True, import_module=import_module)
307
343
  # turns ou that the code below for some reason runs but zellij doesn't start, looks like things are assigned to different user.
308
344
  # return self.run_py(python_code=command, uv_with=uv_with, uv_project_dir=uv_project_dir,
309
345
  # description=f"run_py_func {func.__name__} on {self.get_remote_repr(add_machine=False)}",
@@ -335,25 +371,39 @@ class SSH:
335
371
 
336
372
  def create_parent_dir_and_check_if_exists(self, path_rel2home: str, overwrite_existing: bool) -> None:
337
373
  from machineconfig.utils.ssh_utils.utils import create_dir_and_check_if_exists
374
+
338
375
  return create_dir_and_check_if_exists(self, path_rel2home=path_rel2home, overwrite_existing=overwrite_existing)
339
376
 
340
377
  def check_remote_is_dir(self, source_path: Union[str, Path]) -> bool:
341
378
  from machineconfig.utils.ssh_utils.utils import check_remote_is_dir
379
+
342
380
  return check_remote_is_dir(self, source_path=source_path)
343
381
 
344
382
  def expand_remote_path(self, source_path: Union[str, Path]) -> str:
345
383
  from machineconfig.utils.ssh_utils.utils import expand_remote_path
384
+
346
385
  return expand_remote_path(self, source_path=source_path)
347
386
 
348
- def copy_from_here(self, source_path: str, target_rel2home: Optional[str], compress_with_zip: bool, recursive: bool, overwrite_existing: bool) -> None:
387
+ def copy_from_here(
388
+ self, source_path: str, target_rel2home: Optional[str], compress_with_zip: bool, recursive: bool, overwrite_existing: bool
389
+ ) -> None:
349
390
  from machineconfig.utils.ssh_utils.copy_from_here import copy_from_here
350
- return copy_from_here(self, source_path=source_path, target_rel2home=target_rel2home, compress_with_zip=compress_with_zip, recursive=recursive, overwrite_existing=overwrite_existing)
351
391
 
352
- def copy_to_here(self, source: Union[str, Path], target: Optional[Union[str, Path]], compress_with_zip: bool, recursive: bool, internal_call: bool = False) -> None:
392
+ return copy_from_here(
393
+ self,
394
+ source_path=source_path,
395
+ target_rel2home=target_rel2home,
396
+ compress_with_zip=compress_with_zip,
397
+ recursive=recursive,
398
+ overwrite_existing=overwrite_existing,
399
+ )
400
+
401
+ def copy_to_here(
402
+ self, source: Union[str, Path], target: Optional[Union[str, Path]], compress_with_zip: bool, recursive: bool, internal_call: bool = False
403
+ ) -> None:
353
404
  from machineconfig.utils.ssh_utils.copy_to_here import copy_to_here
354
- return copy_to_here(self, source=source, target=target, compress_with_zip=compress_with_zip, recursive=recursive, internal_call=internal_call)
355
405
 
356
-
406
+ return copy_to_here(self, source=source, target=target, compress_with_zip=compress_with_zip, recursive=recursive, internal_call=internal_call)
357
407
 
358
408
 
359
409
  if __name__ == "__main__":
@@ -1,5 +1,5 @@
1
1
 
2
2
 
3
- MACHINECONFIG_VERSION = "machineconfig>=7.98"
3
+ MACHINECONFIG_VERSION = "machineconfig>=8.51"
4
4
  DEFAULT_PICKLE_SUBDIR = "tmp_results/tmp_scripts/ssh"
5
5
 
@@ -1,11 +1,20 @@
1
1
 
2
2
 
3
- from typing import Optional
4
- from pathlib import Path
3
+ from typing import Optional, TYPE_CHECKING
4
+ from pathlib import Path, PurePosixPath, PureWindowsPath
5
5
  from machineconfig.utils.accessories import randstr
6
6
  from machineconfig.utils.meta import lambda_to_python_script
7
7
  from machineconfig.utils.ssh_utils.abc import DEFAULT_PICKLE_SUBDIR
8
- from machineconfig.utils.code import get_uv_run_command
8
+ from machineconfig.utils.code import get_uv_command
9
+
10
+ if TYPE_CHECKING:
11
+ from machineconfig.utils.ssh import SSH
12
+
13
+
14
+ def _build_remote_path(self: "SSH", home_dir: str, rel_path: str) -> str:
15
+ if self.remote_specs["system"] == "Windows":
16
+ return str(PureWindowsPath(home_dir) / rel_path)
17
+ return str(PurePosixPath(home_dir) / PurePosixPath(rel_path.replace("\\", "/")))
9
18
 
10
19
 
11
20
  def copy_from_here(
@@ -54,15 +63,14 @@ def copy_from_here(
54
63
  target_rel2home = target_rel2home + ".zip"
55
64
  if Path(target_rel2home).parent.as_posix() not in {"", "."}:
56
65
  self.create_parent_dir_and_check_if_exists(path_rel2home=target_rel2home, overwrite_existing=overwrite_existing)
57
- print(f"""📤 [SFTP UPLOAD] Sending file: {repr(source_obj)} ==> Remote Path: {target_rel2home}""")
66
+ remote_target_full = _build_remote_path(self, self.remote_specs["home_dir"], target_rel2home)
67
+ print(f"""📤 [SFTP UPLOAD] Sending file: {repr(source_obj)} ==> Remote Path: {remote_target_full}""")
58
68
  try:
59
69
  with self.tqdm_wrap(ascii=True, unit="b", unit_scale=True) as pbar:
60
70
  if self.sftp is None: # type: ignore[unreachable]
61
71
  raise RuntimeError(f"SFTP connection lost for {self.hostname}")
62
- print(f"Uploading {source_obj} to\n{Path(self.remote_specs['home_dir']).joinpath(target_rel2home)}")
63
- self.sftp.put(
64
- localpath=str(source_obj), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), callback=pbar.view_bar
65
- )
72
+ print(f"Uploading {source_obj} to\n{remote_target_full}")
73
+ self.sftp.put(localpath=str(source_obj), remotepath=remote_target_full, callback=pbar.view_bar)
66
74
  except Exception:
67
75
  if compress_with_zip and source_obj.exists() and str(source_obj).endswith("_archive.zip"):
68
76
  source_obj.unlink()
@@ -83,12 +91,9 @@ def copy_from_here(
83
91
  archive_handle.extractall(extraction_directory)
84
92
  archive_path.unlink()
85
93
 
94
+ remote_zip_path = _build_remote_path(self, self.remote_specs["home_dir"], target_rel2home)
86
95
  command = lambda_to_python_script(
87
- lambda: unzip_archive(
88
- zip_file_path=str(Path(self.remote_specs["home_dir"]).joinpath(target_rel2home)), overwrite_flag=overwrite_existing
89
- ),
90
- in_global=True,
91
- import_module=False,
96
+ lambda: unzip_archive(zip_file_path=remote_zip_path, overwrite_flag=overwrite_existing), in_global=True, import_module=False
92
97
  )
93
98
  tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
94
99
  tmp_py_file.parent.mkdir(parents=True, exist_ok=True)
@@ -96,7 +101,7 @@ def copy_from_here(
96
101
  remote_tmp_py = tmp_py_file.relative_to(Path.home()).as_posix()
97
102
  self.copy_from_here(source_path=str(tmp_py_file), target_rel2home=None, compress_with_zip=False, recursive=False, overwrite_existing=True)
98
103
  self.run_shell_cmd_on_remote(
99
- command=f"""{get_uv_run_command(platform=self.remote_specs['system'])} python {remote_tmp_py}""",
104
+ command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {remote_tmp_py}""",
100
105
  verbose_output=False,
101
106
  description=f"UNZIPPING {target_rel2home}",
102
107
  strict_stderr=True,
@@ -8,7 +8,7 @@ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION, DEFAULT_PIC
8
8
 
9
9
 
10
10
  def copy_to_here(
11
- self: SSH,
11
+ self: "SSH",
12
12
  source: Union[str, Path],
13
13
  target: Optional[Union[str, Path]],
14
14
  compress_with_zip: bool = False,
@@ -300,3 +300,4 @@ def copy_to_here(
300
300
 
301
301
  if __name__ == "__main__":
302
302
  from machineconfig.utils.ssh import SSH
303
+
@@ -1,15 +1,30 @@
1
1
 
2
- from pathlib import Path
2
+ from pathlib import Path, PurePosixPath, PureWindowsPath
3
3
  from machineconfig.utils.accessories import randstr
4
4
  from machineconfig.utils.meta import lambda_to_python_script
5
5
  from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION, DEFAULT_PICKLE_SUBDIR
6
- from machineconfig.utils.code import get_uv_run_command
7
- from typing import Union
6
+ from machineconfig.utils.code import get_uv_command
7
+ from typing import Union, TYPE_CHECKING
8
+
9
+ if TYPE_CHECKING:
10
+ from machineconfig.utils.ssh import SSH
11
+
12
+
13
+ def _build_remote_path(self: "SSH", home_dir: str, rel_path: str) -> str:
14
+ if self.remote_specs["system"] == "Windows":
15
+ return str(PureWindowsPath(home_dir) / rel_path)
16
+ return str(PurePosixPath(home_dir) / PurePosixPath(rel_path.replace("\\", "/")))
17
+
18
+
19
+ def _normalize_rel_path_for_remote(self: "SSH", rel_path: str) -> str:
20
+ if self.remote_specs["system"] == "Windows":
21
+ return str(PureWindowsPath(rel_path))
22
+ return rel_path.replace("\\", "/")
8
23
 
9
24
 
10
25
  def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_existing: bool) -> None:
11
26
  """Helper to create a directory on remote machine and return its path."""
12
-
27
+ path_rel2home_normalized = _normalize_rel_path_for_remote(self, path_rel2home)
13
28
  def create_target_dir(target_rel2home: str, overwrite: bool):
14
29
  from pathlib import Path
15
30
  import shutil
@@ -26,7 +41,7 @@ def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_ex
26
41
  print(f"Creating directory for path: {target_path_abs}")
27
42
  target_path_abs.parent.mkdir(parents=True, exist_ok=True)
28
43
  command = lambda_to_python_script(
29
- lambda: create_target_dir(target_rel2home=path_rel2home, overwrite=overwrite_existing),
44
+ lambda: create_target_dir(target_rel2home=path_rel2home_normalized, overwrite=overwrite_existing),
30
45
  in_global=True, import_module=False
31
46
  )
32
47
  tmp_py_file = Path.home().joinpath(f"{DEFAULT_PICKLE_SUBDIR}/create_target_dir_{randstr()}.py")
@@ -34,9 +49,10 @@ def create_dir_and_check_if_exists(self: "SSH", path_rel2home: str, overwrite_ex
34
49
  tmp_py_file.write_text(command, encoding="utf-8")
35
50
  assert self.sftp is not None
36
51
  tmp_remote_path = ".tmp_pyfile.py"
37
- self.sftp.put(localpath=str(tmp_py_file), remotepath=str(Path(self.remote_specs["home_dir"]).joinpath(tmp_remote_path)))
52
+ remote_tmp_full = _build_remote_path(self, self.remote_specs["home_dir"], tmp_remote_path)
53
+ self.sftp.put(localpath=str(tmp_py_file), remotepath=remote_tmp_full)
38
54
  resp = self.run_shell_cmd_on_remote(
39
- command=f"""{get_uv_run_command(platform=self.remote_specs['system'])} python {tmp_remote_path}""",
55
+ command=f"""{get_uv_command(platform=self.remote_specs['system'])} run python {tmp_remote_path}""",
40
56
  verbose_output=False,
41
57
  description=f"Creating target dir {path_rel2home}",
42
58
  strict_stderr=True,