machineconfig 5.15__py3-none-any.whl → 7.98__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 (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  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 +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  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 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -7,138 +7,103 @@ fire
7
7
 
8
8
  """
9
9
 
10
- from machineconfig.scripts.python.fire_jobs_route_helper import get_command_streamlit
11
- from machineconfig.scripts.python.helpers.helpers4 import search_for_files_of_interest
12
- from machineconfig.scripts.python.helpers.helpers4 import parse_pyfile
13
- from machineconfig.scripts.python.helpers.helpers4 import get_import_module_code
14
- from machineconfig.utils.ve import get_ve_activate_line, get_ve_path_and_ipython_profile
15
- from machineconfig.utils.options import choose_from_options
16
- from machineconfig.utils.path_helper import match_file_name, sanitize_path
17
-
18
- from machineconfig.utils.path_extended import PathExtended
19
- from machineconfig.utils.accessories import get_repo_root, randstr
20
- from machineconfig.scripts.python.fire_jobs_args_helper import FireJobArgs, extract_kwargs, parse_fire_args_from_context
21
- import platform
22
10
  from typing import Optional, Annotated
23
- from pathlib import Path
24
11
  import typer
25
12
 
26
13
 
27
- def route(args: FireJobArgs, fire_args: str = "") -> None:
28
- path_obj = sanitize_path(args.path)
29
- if not path_obj.exists():
30
- suffixes = {".py", ".sh", ".ps1"}
31
- choice_file = match_file_name(sub_string=args.path, search_root=PathExtended.cwd(), suffixes=suffixes)
32
- elif path_obj.is_dir():
33
- print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
34
- files = search_for_files_of_interest(path_obj)
35
- print(f"🔍 Got #{len(files)} results.")
36
- choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
37
- choice_file = PathExtended(choice_file)
38
- else:
39
- choice_file = path_obj
40
- repo_root = get_repo_root(Path(choice_file))
14
+ def route(args: "FireJobArgs", fire_args: str = "") -> None:
15
+ from pathlib import Path
16
+ from machineconfig.utils.path_helper import get_choice_file
17
+ from machineconfig.utils.accessories import get_repo_root, randstr
18
+ choice_file = get_choice_file(args.path, suffixes=None)
19
+ repo_root = get_repo_root(choice_file)
41
20
  print(f"💾 Selected file: {choice_file}.\nRepo root: {repo_root}")
42
- ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(choice_file)
43
- if ipy_profile is None:
44
- ipy_profile = "default"
21
+ if args.marimo:
22
+ print(f"🧽 Preparing to launch Marimo notebook for `{choice_file}`...")
23
+ tmp_dir = Path.home().joinpath(f"tmp_results/tmp_scripts/marimo/{choice_file.stem}_{randstr()}")
24
+ tmp_dir.mkdir(parents=True, exist_ok=True)
25
+ script = f"""
26
+ cd {tmp_dir}
27
+ uv run --python 3.14 --with marimo marimo convert {choice_file} -o marimo_nb.py
28
+ uv run --project {repo_root} --with marimo marimo edit --host 0.0.0.0 marimo_nb.py
29
+ """
30
+ from machineconfig.utils.code import exit_then_run_shell_script
31
+ print(f"🚀 Launching Marimo notebook for `{choice_file}`...")
32
+ exit_then_run_shell_script(script)
33
+ return
45
34
 
35
+ # ========================= preparing kwargs_dict
46
36
  if choice_file.suffix == ".py":
37
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import extract_kwargs
47
38
  kwargs_dict = extract_kwargs(args) # This now returns empty dict, but kept for compatibility
48
- activate_ve_line = get_ve_activate_line(ve_root=args.ve or ve_root_from_file or "$HOME/code/machineconfig/.venv")
49
39
  else:
50
- activate_ve_line = ""
51
40
  kwargs_dict = {}
52
41
 
53
42
  # ========================= choosing function to run
54
43
  choice_function: Optional[str] = None # Initialize to avoid unbound variable
55
- if args.choose_function or args.submit_to_cloud:
56
- if choice_file.suffix == ".py":
57
- options, func_args = parse_pyfile(file_path=str(choice_file))
58
- choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options, fzf=True, multi=False)
59
- assert isinstance(choice_function_tmp, str), f"choice_function must be a string. Got {type(choice_function_tmp)}"
60
- choice_index = options.index(choice_function_tmp)
61
- choice_function = choice_function_tmp.split(" -- ")[0]
62
- choice_function_args = func_args[choice_index]
44
+ if args.choose_function:
45
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
63
46
 
64
- if choice_function == "RUN AS MAIN":
65
- choice_function = None
66
- if len(choice_function_args) > 0 and len(kwargs_dict) == 0:
67
- for item in choice_function_args:
68
- kwargs_dict[item.name] = input(f"Please enter a value for argument `{item.name}` (type = {item.type}) (default = {item.default}) : ") or item.default
69
- elif choice_file.suffix == ".sh": # in this case, we choos lines.
70
- options = []
71
- for line in choice_file.read_text(encoding="utf-8").splitlines():
72
- if line.startswith("#"):
73
- continue
74
- if line == "":
75
- continue
76
- if line.startswith("echo"):
77
- continue
78
- options.append(line)
79
- chosen_lines = choose_from_options(msg="Choose a line to run", options=options, fzf=True, multi=True)
80
- choice_file = PathExtended.tmpfile(suffix=".sh")
81
- choice_file.parent.mkdir(parents=True, exist_ok=True)
82
- choice_file.write_text("\n".join(chosen_lines), encoding="utf-8")
83
- choice_function = None
47
+ choice_function, choice_file, kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict)
84
48
  else:
85
49
  choice_function = args.function
86
50
 
87
51
  if choice_file.suffix == ".py":
88
- if args.streamlit: exe = get_command_streamlit(choice_file, args.environment, repo_root)
89
- elif args.interactive is False: exe = "python"
90
- elif args.jupyter: exe = "jupyter-lab"
91
- else: exe = f"ipython -i --no-banner --profile {ipy_profile} "
92
- elif choice_file.suffix == ".ps1" or choice_file.suffix == ".sh": exe = "."
93
- elif choice_file.suffix == "": exe = ""
94
- else: raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
52
+ with_project = f"--project {repo_root} " if repo_root is not None else ""
53
+ if args.streamlit:
54
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import get_command_streamlit
55
+ exe = get_command_streamlit(choice_file=choice_file, environment=args.environment, repo_root=repo_root)
56
+ exe = f"uv run {with_project} {exe} "
57
+ elif args.jupyter:
58
+ exe = f"uv run {with_project} jupyter-lab"
59
+ else:
60
+ if args.interactive:
61
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
62
+ _ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(init_path=choice_file)
63
+ if ipy_profile is None:
64
+ ipy_profile = "default"
65
+ exe = f"uv run {with_project} ipython -i --no-banner --profile {ipy_profile} "
66
+ else:
67
+ exe = f"uv run {with_project} python "
68
+ elif choice_file.suffix == ".ps1" or choice_file.suffix == ".sh":
69
+ exe = "."
70
+ elif choice_file.suffix == "":
71
+ exe = ""
72
+ else:
73
+ raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
95
74
 
96
- if args.module or (args.debug and args.choose_function): # because debugging tools do not support choosing functions and don't interplay with fire module. So the only way to have debugging and choose function options is to import the file as a module into a new script and run the function of interest there and debug the new script.
75
+ if args.module or (args.debug and args.choose_function):
76
+ # because debugging tools do not support choosing functions and don't interplay with fire module. So the only way to have debugging and choose function options is to import the file as a module into a new script and run the function of interest there and debug the new script.
97
77
  assert choice_file.suffix == ".py", f"File must be a python file to be imported as a module. Got {choice_file}"
98
- import_line = get_import_module_code(str(choice_file))
99
- if repo_root is not None:
100
- repo_root_add = f"""sys.path.append(r'{repo_root}')"""
101
- else:
102
- repo_root_add = ""
103
- txt: str = f"""
104
- try:
105
- {import_line}
106
- except (ImportError, ModuleNotFoundError) as ex:
107
- print(fr"❌ Failed to import `{choice_file}` as a module: {{ex}} ")
108
- print(fr"⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
109
- import sys
110
- sys.path.append(r'{PathExtended(choice_file).parent}')
111
- {repo_root_add}
112
- from {PathExtended(choice_file).stem} import *
113
- print(fr"✅ Successfully imported `{choice_file}`")
114
- """
115
- if choice_function is not None:
116
- txt = (
117
- txt
118
- + f"""
119
- res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})
120
- """
121
- )
78
+ from machineconfig.scripts.python.helpers_fire_command.file_wrangler import get_import_module_code, wrap_import_in_try_except
79
+ from machineconfig.utils.meta import lambda_to_python_script
80
+ from machineconfig.utils.code import print_code
122
81
 
123
- txt = (
124
- f"""
125
- try:
126
- from rich.panel import Panel
127
- from rich.console import Console
128
- from rich.syntax import Syntax
129
- console = Console()
130
- console.print(Panel(Syntax(code=r'''{txt}''', lexer='python'), title='Import Script'), style="bold red")
131
- except ImportError as _ex:
132
- print(r'''{txt}''')
133
- """
134
- + txt
82
+ import_code = get_import_module_code(str(choice_file))
83
+ import_code_robust = lambda_to_python_script(
84
+ lambda: wrap_import_in_try_except(
85
+ import_line=import_code, pyfile=str(choice_file), repo_root=str(repo_root) if repo_root is not None else None
86
+ ),
87
+ in_global=True,
88
+ import_module=False,
89
+ )
90
+ # print(f"🧩 Preparing import code for module import:\n{import_code}")
91
+ code_printing = lambda_to_python_script(
92
+ lambda: print_code(code=import_code_robust, lexer="python", desc="import as module code"),
93
+ in_global=True, import_module=False
135
94
  )
136
- choice_file = PathExtended.tmp().joinpath(f"tmp_scripts/python/{PathExtended(choice_file).parent.name}_{PathExtended(choice_file).stem}_{randstr()}.py")
95
+ print(f"🧩 Preparing import code for module import:\n{import_code}")
96
+ if choice_function is not None:
97
+ calling = f"""res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})"""
98
+ else:
99
+ calling = """# No function selected to call. You can add your code here."""
100
+ choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/python/{Path(choice_file).parent.name}_{Path(choice_file).stem}_{randstr()}.py")
137
101
  choice_file.parent.mkdir(parents=True, exist_ok=True)
138
- choice_file.write_text(txt, encoding="utf-8")
102
+ choice_file.write_text(import_code_robust + "\n" + code_printing + "\n" + calling, encoding="utf-8")
139
103
 
140
104
  # ========================= determining basic command structure: putting together exe & choice_file & choice_function & pdb
141
105
  if args.debug:
106
+ import platform
142
107
  if platform.system() == "Windows":
143
108
  command = f"{exe} -m ipdb {choice_file} " # pudb is not available on windows machines, use poor man's debugger instead.
144
109
  elif platform.system() in ["Linux", "Darwin"]:
@@ -148,84 +113,76 @@ except ImportError as _ex:
148
113
  elif args.module:
149
114
  # both selected function and kwargs are mentioned in the made up script, therefore no need for fire module.
150
115
  command = f"{exe} {choice_file} "
151
- elif choice_function is not None:
116
+ elif choice_function is not None and choice_file.suffix == ".py":
152
117
  command = f"{exe} -m fire {choice_file} {choice_function} {fire_args}"
153
118
  elif args.streamlit:
154
119
  # for .streamlit config to work, it needs to be in the current directory.
155
120
  if args.holdDirectory:
156
121
  command = f"{exe} {choice_file}"
157
122
  else:
158
- command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {PathExtended.cwd()}"
159
-
123
+ command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {Path.cwd()}"
160
124
  elif args.cmd:
161
125
  command = rf""" cd /d {choice_file.parent} & {exe} {choice_file.name} """
162
126
  else:
163
127
  if choice_file.suffix == "":
164
128
  command = f"{exe} {choice_file} {fire_args}"
165
129
  else:
166
- # command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {PathExtended.cwd()}"
167
130
  command = f"{exe} {choice_file} "
168
- if not args.cmd: command = f"{activate_ve_line}\n{command}"
131
+
132
+ if not args.cmd:
133
+ pass
169
134
  else:
170
135
  new_line = "\n"
171
- command = rf"""start cmd -Argument "/k {activate_ve_line.replace(".ps1", ".bat").replace(". ", "")} & {command.replace(new_line, " & ")} " """ # this works from powershell
136
+ command = rf"""start cmd -Argument "/k {command.replace(new_line, " & ")} " """ # this works from powershell
172
137
  if args.submit_to_cloud:
173
- command = f"""
174
- {activate_ve_line}
175
- python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
138
+ command = f"""uv run python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
176
139
  if choice_function is not None:
177
140
  command += f"--function {choice_function} "
178
141
 
179
- if args.Nprocess > 1:
180
- from machineconfig.cluster.sessions_managers.zellij_local import run_zellij_layout
181
- from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
182
- layout: LayoutConfig = {"layoutName": "fireNprocess", "layoutTabs": []}
183
- for an_arg in range(args.Nprocess):
184
- layout["layoutTabs"].append({"tabName": f"tab{an_arg}", "startDir": str(PathExtended.cwd()), "command": f"uv run -m fire {choice_file} {choice_function} --idx={an_arg} --idx_max={args.Nprocess}"})
185
- run_zellij_layout(layout_config=layout)
186
- return None
187
142
  if args.optimized:
188
143
  command = command.replace("python ", "python -OO ")
144
+
189
145
  from rich.panel import Panel
190
146
  from rich.console import Console
191
147
  from rich.syntax import Syntax
148
+
192
149
  console = Console()
193
150
  if args.zellij_tab is not None:
194
- comman_path__ = PathExtended.tmpfile(suffix=".sh")
151
+ comman_path__ = Path.home().joinpath(f"tmp_results/tmp_scripts/zellij_commands/{choice_file.stem}_{randstr()}.sh")
195
152
  comman_path__.parent.mkdir(parents=True, exist_ok=True)
196
153
  comman_path__.write_text(command, encoding="utf-8")
197
154
  console.print(Panel(Syntax(command, lexer="shell"), title=f"🔥 fire command @ {comman_path__}: "), style="bold red")
198
155
  import subprocess
156
+
199
157
  existing_tab_names = subprocess.run(["zellij", "action", "query-tab-names"], capture_output=True, text=True, check=True).stdout.splitlines()
200
158
  if args.zellij_tab in existing_tab_names:
201
159
  print(f"⚠️ Tab name `{args.zellij_tab}` already exists. Please choose a different name.")
202
160
  args.zellij_tab += f"_{randstr(3)}"
203
161
  from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
162
+
204
163
  command = run_command_in_zellij_tab(command=str(comman_path__), tab_name=args.zellij_tab, cwd=None)
205
164
  if args.watch:
206
165
  command = "watchexec --restart --exts py,sh,ps1 " + command
207
166
  if args.git_pull:
208
167
  command = f"\ngit -C {choice_file.parent} pull\n" + command
209
168
  if args.PathExport:
210
- if platform.system() in ["Linux", "Darwin"]:
211
- export_line = f"""export PYTHONPATH="{repo_root}""" + """:${PYTHONPATH}" """
212
- elif platform.system() == "Windows":
213
- export_line = f"""$env:PYTHONPATH="{repo_root}""" + """:$env:PYTHONPATH" """
214
- else:
215
- raise NotImplementedError(f"Platform {platform.system()} not supported.")
169
+ from machineconfig.scripts.python.helpers_fire_command.file_wrangler import add_to_path
170
+
171
+ export_line = add_to_path(path_variable="PYTHONPATH", directory=str(repo_root))
216
172
  command = export_line + "\n" + command
217
173
  if args.loop:
174
+ import platform
218
175
  if platform.system() in ["Linux", "Darwin"]:
219
176
  command = command + "\nsleep 0.5"
220
177
  elif platform.system() == "Windows":
221
178
  command = "$ErrorActionPreference = 'SilentlyContinue';\n" + command + "\nStart-Sleep -Seconds 0.5"
222
179
  else:
223
180
  raise NotImplementedError(f"Platform {platform.system()} not supported.")
224
- from machineconfig.utils.code import run_shell_script
225
- run_shell_script(command)
181
+ from machineconfig.utils.code import exit_then_run_shell_script
182
+ exit_then_run_shell_script(script=command, strict=False)
226
183
 
227
184
 
228
- def main(
185
+ def fire(
229
186
  ctx: typer.Context,
230
187
  path: Annotated[str, typer.Argument(help="Path to the Python file to run")] = ".",
231
188
  function: Annotated[Optional[str], typer.Argument(help="Function to run")] = None,
@@ -233,25 +190,28 @@ def main(
233
190
  cmd: Annotated[bool, typer.Option("--cmd", "-B", help="Create a cmd fire command to launch the job asynchronously")] = False,
234
191
  interactive: Annotated[bool, typer.Option("--interactive", "-i", help="Whether to run the job interactively using IPython")] = False,
235
192
  debug: Annotated[bool, typer.Option("--debug", "-d", help="Enable debug mode")] = False,
236
- choose_function: Annotated[bool, typer.Option("--choose_function", "-c", help="Choose function interactively")] = False,
193
+ choose_function: Annotated[bool, typer.Option("--choose-function", "-c", help="Choose function interactively")] = False,
237
194
  loop: Annotated[bool, typer.Option("--loop", "-l", help="Infinite recursion (runs again after completion/interruption)")] = False,
238
195
  jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="Open in a jupyter notebook")] = False,
239
- submit_to_cloud: Annotated[bool, typer.Option("--submit_to_cloud", "-C", help="Submit to cloud compute")] = False,
240
- remote: Annotated[bool, typer.Option("--remote", "-r", help="Launch on a remote machine")] = False,
196
+ marimo: Annotated[bool, typer.Option("--marimo", "-M", help="Open in a marimo notebook")] = False,
241
197
  module: Annotated[bool, typer.Option("--module", "-m", help="Launch the main file")] = False,
198
+ optimized: Annotated[bool, typer.Option("--optimized", "-O", help="Run the optimized version of the function")] = False,
199
+ zellij_tab: Annotated[Optional[str], typer.Option("--zellij-tab", "-z", help="Open in a new zellij tab")] = None,
200
+ submit_to_cloud: Annotated[bool, typer.Option("--submit-to-cloud", "-C", help="Submit to cloud compute")] = False,
201
+ remote: Annotated[bool, typer.Option("--remote", "-r", help="Launch on a remote machine")] = False,
242
202
  streamlit: Annotated[bool, typer.Option("--streamlit", "-S", help="Run as streamlit app")] = False,
243
203
  environment: Annotated[str, typer.Option("--environment", "-E", help="Choose ip, localhost, hostname or arbitrary url")] = "",
244
- holdDirectory: Annotated[bool, typer.Option("--holdDirectory", "-D", help="Hold current directory and avoid cd'ing to the script directory")] = False,
204
+ holdDirectory: Annotated[
205
+ bool, typer.Option("--holdDirectory", "-D", help="Hold current directory and avoid cd'ing to the script directory")
206
+ ] = False,
245
207
  PathExport: Annotated[bool, typer.Option("--PathExport", "-P", help="Augment the PYTHONPATH with repo root")] = False,
246
- git_pull: Annotated[bool, typer.Option("--git_pull", "-g", help="Start by pulling the git repo")] = False,
247
- optimized: Annotated[bool, typer.Option("--optimized", "-O", help="Run the optimized version of the function")] = False,
248
- Nprocess: Annotated[int, typer.Option("--Nprocess", "-p", help="Number of processes to use")] = 1,
249
- zellij_tab: Annotated[Optional[str], typer.Option("--zellij_tab", "-z", help="Open in a new zellij tab")] = None,
208
+ git_pull: Annotated[bool, typer.Option("--git-pull", "-g", help="Start by pulling the git repo")] = False,
250
209
  watch: Annotated[bool, typer.Option("--watch", "-w", help="Watch the file for changes")] = False,
251
210
  ) -> None:
252
211
  """Main function to process fire jobs arguments."""
253
212
 
254
213
  # Get Fire arguments from context
214
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import FireJobArgs, parse_fire_args_from_context
255
215
  fire_args = parse_fire_args_from_context(ctx)
256
216
 
257
217
  args = FireJobArgs(
@@ -264,6 +224,7 @@ def main(
264
224
  choose_function=choose_function,
265
225
  loop=loop,
266
226
  jupyter=jupyter,
227
+ marimo=marimo,
267
228
  submit_to_cloud=submit_to_cloud,
268
229
  remote=remote,
269
230
  module=module,
@@ -273,7 +234,6 @@ def main(
273
234
  PathExport=PathExport,
274
235
  git_pull=git_pull,
275
236
  optimized=optimized,
276
- Nprocess=Nprocess,
277
237
  zellij_tab=zellij_tab,
278
238
  watch=watch,
279
239
  )
@@ -290,18 +250,18 @@ def main(
290
250
  sys.exit(1)
291
251
 
292
252
 
293
- def main_from_parser():
294
- # from trogon.typer import init_tui
295
- # from trogon.typer import init_tui
253
+ def get_app():
296
254
  from typer import Typer
297
255
 
298
256
  app = Typer(add_completion=False)
299
- app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(main)
300
- # typer.run(main)
301
- # init_tui(app)
257
+ app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(fire)
258
+ return app
259
+
260
+
261
+ def main():
262
+ app = get_app()
302
263
  app()
303
264
 
304
265
 
305
266
  if __name__ == "__main__":
306
- # options, func_args = parse_pyfile(file_path="C:/Users/aalsaf01/code/machineconfig/myresources/crocodile/core.py")
307
- main_from_parser()
267
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import FireJobArgs
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env -S uv run --no-dev --project /home/alex/code/machineconfig --script
2
1
  """Sx & Rx
3
2
 
4
3
  TODO: add support for cases in which source or target has non 22 default port number and is defineda as user@host:port:path which makes 2 colons in the string.
@@ -7,26 +6,50 @@ Currently, the only way to work around this is to predifine the host in ~/.ssh/c
7
6
  """
8
7
 
9
8
  import typer
10
- from typing_extensions import Annotated
11
- from rich.console import Console
12
- from rich.panel import Panel
9
+ from typing import Annotated
13
10
 
14
- from machineconfig.utils.ssh import SSH
15
- from machineconfig.utils.path_extended import PathExtended
16
- from machineconfig.scripts.python.helpers.helpers2 import ES
17
- from machineconfig.utils.accessories import pprint
18
11
 
19
-
20
- console = Console()
21
-
22
-
23
- def main(
12
+ def ftpx(
24
13
  source: Annotated[str, typer.Argument(help="Source path (machine:path)")],
25
14
  target: Annotated[str, typer.Argument(help="Target path (machine:path)")],
26
15
  recursive: Annotated[bool, typer.Option("--recursive", "-r", help="Send recursively.")] = False,
27
16
  zipFirst: Annotated[bool, typer.Option("--zipFirst", "-z", help="Zip before sending.")] = False,
28
17
  cloud: Annotated[bool, typer.Option("--cloud", "-c", help="Transfer through the cloud.")] = False,
18
+ overwrite_existing: Annotated[bool, typer.Option("--overwrite-existing", "-o", help="Overwrite existing files on remote when sending from local to remote.")] = False,
29
19
  ) -> None:
20
+ from pathlib import Path
21
+ if target == "wsl" or source == "wsl":
22
+ from machineconfig.utils.ssh_utils.wsl import copy_when_inside_windows
23
+ if target == "wsl":
24
+ target_obj = Path(source).expanduser().absolute().relative_to(Path.home())
25
+ source_obj = target_obj
26
+ else:
27
+ source_obj = Path(target).expanduser().absolute().relative_to(Path.home())
28
+ target_obj = source_obj
29
+ copy_when_inside_windows(source_obj, target_obj, overwrite_existing)
30
+ return
31
+ elif source == "win" or target == "win":
32
+ if source == "win":
33
+ source_obj = Path(target).expanduser().absolute().relative_to(Path.home())
34
+ target_obj = source_obj
35
+ else:
36
+ target_obj = Path(source).expanduser().absolute().relative_to(Path.home())
37
+ source_obj = target_obj
38
+ from machineconfig.utils.ssh_utils.wsl import copy_when_inside_wsl
39
+ copy_when_inside_wsl(source_obj, target_obj, overwrite_existing)
40
+ return
41
+
42
+ from rich.console import Console
43
+ from rich.panel import Panel
44
+
45
+ from machineconfig.utils.ssh import SSH
46
+ from machineconfig.utils.path_extended import PathExtended
47
+ from machineconfig.scripts.python.helpers_cloud.helpers2 import ES
48
+ from machineconfig.utils.accessories import pprint
49
+
50
+
51
+ console = Console()
52
+
30
53
  console.print(
31
54
  Panel(
32
55
  "\n".join(
@@ -106,7 +129,7 @@ def main(
106
129
  from paramiko.ssh_exception import AuthenticationException # type: ignore
107
130
 
108
131
  try:
109
- ssh = SSH(rf"{machine}")
132
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=True)
110
133
  except AuthenticationException:
111
134
  console.print(
112
135
  Panel(
@@ -124,7 +147,7 @@ def main(
124
147
  import getpass
125
148
 
126
149
  pwd = getpass.getpass()
127
- ssh = SSH(rf"{machine}", pwd=pwd)
150
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=pwd, port=22, enable_compression=True)
128
151
 
129
152
  if cloud:
130
153
  console.print(
@@ -134,7 +157,7 @@ def main(
134
157
  border_style="cyan",
135
158
  )
136
159
  )
137
- ssh.run(f"cloud_copy {resolved_source} :^", desc="Uploading from remote to the cloud.").print()
160
+ ssh.run_shell_cmd_on_remote(command=f"cloud_copy {resolved_source} :^", verbose_output=True, description="Uploading from remote to the cloud.", strict_stderr=False, strict_return_code=False)
138
161
  console.print(
139
162
  Panel.fit(
140
163
  "⬇️ Cloud transfer mode — downloading from cloud to local...",
@@ -142,12 +165,14 @@ def main(
142
165
  border_style="cyan",
143
166
  )
144
167
  )
145
- ssh.run_locally(f"cloud_copy :^ {resolved_target}").print()
168
+ ssh.run_shell_cmd_on_local(command=f"cloud_copy :^ {resolved_target}")
146
169
  received_file = PathExtended(resolved_target) # type: ignore
147
170
  else:
148
171
  if source_is_remote:
149
- assert resolved_source is not None, """
150
- ❌ Path Error: Source must be a remote path (machine:path)"""
172
+ if resolved_source is None:
173
+ typer.echo("""❌ Path Error: Source must be a remote path (machine:path)""")
174
+ typer.Exit(code=1)
175
+ return
151
176
  target_display = resolved_target or "<auto>"
152
177
  console.print(
153
178
  Panel(
@@ -164,7 +189,7 @@ def main(
164
189
  padding=(1, 2),
165
190
  )
166
191
  )
167
- received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
192
+ received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, compress_with_zip=zipFirst, recursive=recursive)
168
193
  else:
169
194
  assert resolved_source is not None, """
170
195
  ❌ Path Error: Target must be a remote path (machine:path)"""
@@ -184,7 +209,7 @@ def main(
184
209
  padding=(1, 2),
185
210
  )
186
211
  )
187
- received_file = ssh.copy_from_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
212
+ received_file = ssh.copy_from_here(source_path=resolved_source, target_rel2home=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=overwrite_existing)
188
213
 
189
214
  if source_is_remote and isinstance(received_file, PathExtended):
190
215
  console.print(
@@ -211,10 +236,12 @@ def main(
211
236
  )
212
237
 
213
238
 
214
- def main_from_parser() -> None:
239
+ def main() -> None:
215
240
  """Entry point function that uses typer to parse arguments and call main."""
216
- typer.run(main)
241
+ app = typer.Typer()
242
+ app.command(no_args_is_help=True, help="File transfer utility though SSH.")(ftpx)
243
+ app()
217
244
 
218
245
 
219
246
  if __name__ == "__main__":
220
- main_from_parser()
247
+ main()
@@ -0,0 +1,74 @@
1
+
2
+ import ast
3
+ import os
4
+ from typing import TypedDict
5
+
6
+
7
+ class SymbolInfo(TypedDict):
8
+ """Represents a symbol (module, class, or function) in the repository."""
9
+ type: str
10
+ name: str
11
+ path: str
12
+ # line: int | None
13
+ # column: int | None
14
+ docstring: str
15
+
16
+
17
+ def _get_docstring(node: ast.AsyncFunctionDef | ast.FunctionDef | ast.ClassDef | ast.Module) -> str:
18
+ """Extract docstring from an AST node."""
19
+ return ast.get_docstring(node) or ""
20
+
21
+
22
+ def _extract_symbols(tree: ast.AST, module_path: str, source: str) -> list[SymbolInfo]:
23
+ """Extract symbols from an AST tree."""
24
+ symbols: list[SymbolInfo] = []
25
+
26
+ for node in ast.walk(tree):
27
+ if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef):
28
+ symbol: SymbolInfo = {
29
+ "type": "function",
30
+ "name": node.name,
31
+ "path": f"{module_path}.{node.name}",
32
+ "docstring": _get_docstring(node),
33
+ }
34
+ symbols.append(symbol)
35
+ elif isinstance(node, ast.ClassDef):
36
+ symbol: SymbolInfo = {
37
+ "type": "class",
38
+ "name": node.name,
39
+ "path": f"{module_path}.{node.name}",
40
+ "docstring": _get_docstring(node),
41
+ }
42
+ symbols.append(symbol)
43
+
44
+ return symbols
45
+
46
+
47
+ def get_repo_symbols(repo_path: str) -> list[SymbolInfo]:
48
+ skip_dirs = {'.venv', 'venv', '__pycache__', '.mypy_cache', '.pytest_cache', '.git'}
49
+ results: list[SymbolInfo] = []
50
+ counter: int = 0
51
+ for root, dirs, files in os.walk(repo_path):
52
+ dirs[:] = [d for d in dirs if d not in skip_dirs and not d.startswith('.')]
53
+ for file in files:
54
+ if not file.endswith(".py"):
55
+ continue
56
+ file_path = os.path.join(root, file)
57
+ module_path = (
58
+ os.path.relpath(file_path, repo_path)
59
+ .replace(os.sep, ".")
60
+ .removesuffix(".py")
61
+ )
62
+ try:
63
+ if counter % 100 == 0: print(f"🔍 Parsing {counter}: {file_path}...")
64
+ with open(file_path, encoding="utf-8") as f:
65
+ source = f.read()
66
+ tree = ast.parse(source, filename=file_path)
67
+ symbols = _extract_symbols(tree, module_path, source)
68
+ results.extend(symbols)
69
+ except Exception as e:
70
+ print(f"⚠️ Error parsing {file_path}: {e}")
71
+ continue
72
+ counter += 1
73
+
74
+ return results