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

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

Potentially problematic release.


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

Files changed (389) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -7,138 +7,104 @@ 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]
63
-
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
44
+ if args.choose_function:
45
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
46
+
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.")
95
-
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.
97
- 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}')"""
52
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import get_command_streamlit
53
+
54
+ with_project = f"--project {repo_root} " if repo_root is not None else ""
55
+ if args.streamlit:
56
+ exe = get_command_streamlit(choice_file=choice_file, environment=args.environment, repo_root=repo_root)
57
+ exe = f"uv run {with_project} {exe} "
58
+ elif args.jupyter:
59
+ exe = f"uv run {with_project} jupyter-lab"
101
60
  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
- )
61
+ if args.interactive:
62
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
63
+ _ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(choice_file)
64
+ if ipy_profile is None:
65
+ ipy_profile = "default"
66
+ exe = f"uv run {with_project} ipython -i --no-banner --profile {ipy_profile} "
67
+ else:
68
+ exe = f"uv run {with_project} python "
69
+ elif choice_file.suffix == ".ps1" or choice_file.suffix == ".sh":
70
+ exe = "."
71
+ elif choice_file.suffix == "":
72
+ exe = ""
73
+ else:
74
+ raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
122
75
 
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
76
+ if args.module or (args.debug and args.choose_function):
77
+ # 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.
78
+ assert choice_file.suffix == ".py", f"File must be a python file to be imported as a module. Got {choice_file}"
79
+ from machineconfig.scripts.python.helpers_fire_command.file_wrangler import get_import_module_code, wrap_import_in_try_except
80
+ from machineconfig.utils.meta import lambda_to_python_script
81
+ from machineconfig.utils.code import print_code
82
+
83
+ import_code = get_import_module_code(str(choice_file))
84
+ import_code_robust = lambda_to_python_script(
85
+ lambda: wrap_import_in_try_except(
86
+ import_line=import_code, pyfile=str(choice_file), repo_root=str(repo_root) if repo_root is not None else None
87
+ ),
88
+ in_global=True,
89
+ import_module=False,
90
+ )
91
+ # print(f"🧩 Preparing import code for module import:\n{import_code}")
92
+ code_printing = lambda_to_python_script(
93
+ lambda: print_code(code=import_code_robust, lexer="python", desc="import as module code"),
94
+ in_global=True, import_module=False
135
95
  )
136
- choice_file = PathExtended.tmp().joinpath(f"tmp_scripts/python/{PathExtended(choice_file).parent.name}_{PathExtended(choice_file).stem}_{randstr()}.py")
96
+ print(f"🧩 Preparing import code for module import:\n{import_code}")
97
+ if choice_function is not None:
98
+ calling = f"""res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})"""
99
+ else:
100
+ calling = """# No function selected to call. You can add your code here."""
101
+ choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/python/{Path(choice_file).parent.name}_{Path(choice_file).stem}_{randstr()}.py")
137
102
  choice_file.parent.mkdir(parents=True, exist_ok=True)
138
- choice_file.write_text(txt, encoding="utf-8")
103
+ choice_file.write_text(import_code_robust + "\n" + code_printing + "\n" + calling, encoding="utf-8")
139
104
 
140
105
  # ========================= determining basic command structure: putting together exe & choice_file & choice_function & pdb
141
106
  if args.debug:
107
+ import platform
142
108
  if platform.system() == "Windows":
143
109
  command = f"{exe} -m ipdb {choice_file} " # pudb is not available on windows machines, use poor man's debugger instead.
144
110
  elif platform.system() in ["Linux", "Darwin"]:
@@ -148,84 +114,78 @@ except ImportError as _ex:
148
114
  elif args.module:
149
115
  # both selected function and kwargs are mentioned in the made up script, therefore no need for fire module.
150
116
  command = f"{exe} {choice_file} "
151
- elif choice_function is not None:
117
+ elif choice_function is not None and choice_file.suffix == ".py":
152
118
  command = f"{exe} -m fire {choice_file} {choice_function} {fire_args}"
153
119
  elif args.streamlit:
154
120
  # for .streamlit config to work, it needs to be in the current directory.
155
121
  if args.holdDirectory:
156
122
  command = f"{exe} {choice_file}"
157
123
  else:
158
- command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {PathExtended.cwd()}"
159
-
124
+ command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {Path.cwd()}"
160
125
  elif args.cmd:
161
126
  command = rf""" cd /d {choice_file.parent} & {exe} {choice_file.name} """
162
127
  else:
163
128
  if choice_file.suffix == "":
164
129
  command = f"{exe} {choice_file} {fire_args}"
165
130
  else:
166
- # command = f"cd {choice_file.parent}\n{exe} {choice_file.name}\ncd {PathExtended.cwd()}"
167
131
  command = f"{exe} {choice_file} "
168
- if not args.cmd: command = f"{activate_ve_line}\n{command}"
132
+
133
+ if not args.cmd:
134
+ pass
169
135
  else:
170
136
  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
137
+ command = rf"""start cmd -Argument "/k {command.replace(new_line, " & ")} " """ # this works from powershell
172
138
  if args.submit_to_cloud:
173
- command = f"""
174
- {activate_ve_line}
175
- python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
139
+ command = f"""uv run python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
176
140
  if choice_function is not None:
177
141
  command += f"--function {choice_function} "
178
142
 
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
143
  if args.optimized:
188
144
  command = command.replace("python ", "python -OO ")
145
+
189
146
  from rich.panel import Panel
190
147
  from rich.console import Console
191
148
  from rich.syntax import Syntax
149
+
192
150
  console = Console()
193
151
  if args.zellij_tab is not None:
194
- comman_path__ = PathExtended.tmpfile(suffix=".sh")
152
+ comman_path__ = Path.home().joinpath(f"tmp_results/tmp_scripts/zellij_commands/{choice_file.stem}_{randstr()}.sh")
195
153
  comman_path__.parent.mkdir(parents=True, exist_ok=True)
196
154
  comman_path__.write_text(command, encoding="utf-8")
197
155
  console.print(Panel(Syntax(command, lexer="shell"), title=f"🔥 fire command @ {comman_path__}: "), style="bold red")
198
156
  import subprocess
157
+
199
158
  existing_tab_names = subprocess.run(["zellij", "action", "query-tab-names"], capture_output=True, text=True, check=True).stdout.splitlines()
200
159
  if args.zellij_tab in existing_tab_names:
201
160
  print(f"⚠️ Tab name `{args.zellij_tab}` already exists. Please choose a different name.")
202
161
  args.zellij_tab += f"_{randstr(3)}"
203
162
  from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
163
+
204
164
  command = run_command_in_zellij_tab(command=str(comman_path__), tab_name=args.zellij_tab, cwd=None)
205
165
  if args.watch:
206
166
  command = "watchexec --restart --exts py,sh,ps1 " + command
207
167
  if args.git_pull:
208
168
  command = f"\ngit -C {choice_file.parent} pull\n" + command
209
169
  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.")
170
+ from machineconfig.scripts.python.helpers_fire_command.file_wrangler import add_to_path
171
+
172
+ export_line = add_to_path(path_variable="PYTHONPATH", directory=str(repo_root))
216
173
  command = export_line + "\n" + command
217
174
  if args.loop:
175
+ import platform
218
176
  if platform.system() in ["Linux", "Darwin"]:
219
177
  command = command + "\nsleep 0.5"
220
178
  elif platform.system() == "Windows":
221
179
  command = "$ErrorActionPreference = 'SilentlyContinue';\n" + command + "\nStart-Sleep -Seconds 0.5"
222
180
  else:
223
181
  raise NotImplementedError(f"Platform {platform.system()} not supported.")
224
- from machineconfig.utils.code import run_shell_script
225
- run_shell_script(command)
182
+
183
+ from machineconfig.utils.code import exit_then_run_shell_script
184
+
185
+ exit_then_run_shell_script(script=command, strict=False)
226
186
 
227
187
 
228
- def main(
188
+ def fire(
229
189
  ctx: typer.Context,
230
190
  path: Annotated[str, typer.Argument(help="Path to the Python file to run")] = ".",
231
191
  function: Annotated[Optional[str], typer.Argument(help="Function to run")] = None,
@@ -233,25 +193,28 @@ def main(
233
193
  cmd: Annotated[bool, typer.Option("--cmd", "-B", help="Create a cmd fire command to launch the job asynchronously")] = False,
234
194
  interactive: Annotated[bool, typer.Option("--interactive", "-i", help="Whether to run the job interactively using IPython")] = False,
235
195
  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,
196
+ choose_function: Annotated[bool, typer.Option("--choose-function", "-c", help="Choose function interactively")] = False,
237
197
  loop: Annotated[bool, typer.Option("--loop", "-l", help="Infinite recursion (runs again after completion/interruption)")] = False,
238
198
  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,
199
+ marimo: Annotated[bool, typer.Option("--marimo", "-M", help="Open in a marimo notebook")] = False,
241
200
  module: Annotated[bool, typer.Option("--module", "-m", help="Launch the main file")] = False,
201
+ optimized: Annotated[bool, typer.Option("--optimized", "-O", help="Run the optimized version of the function")] = False,
202
+ zellij_tab: Annotated[Optional[str], typer.Option("--zellij-tab", "-z", help="Open in a new zellij tab")] = None,
203
+ submit_to_cloud: Annotated[bool, typer.Option("--submit-to-cloud", "-C", help="Submit to cloud compute")] = False,
204
+ remote: Annotated[bool, typer.Option("--remote", "-r", help="Launch on a remote machine")] = False,
242
205
  streamlit: Annotated[bool, typer.Option("--streamlit", "-S", help="Run as streamlit app")] = False,
243
206
  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,
207
+ holdDirectory: Annotated[
208
+ bool, typer.Option("--holdDirectory", "-D", help="Hold current directory and avoid cd'ing to the script directory")
209
+ ] = False,
245
210
  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,
211
+ git_pull: Annotated[bool, typer.Option("--git-pull", "-g", help="Start by pulling the git repo")] = False,
250
212
  watch: Annotated[bool, typer.Option("--watch", "-w", help="Watch the file for changes")] = False,
251
213
  ) -> None:
252
214
  """Main function to process fire jobs arguments."""
253
215
 
254
216
  # Get Fire arguments from context
217
+ from machineconfig.scripts.python.helpers_fire_command.fire_jobs_args_helper import FireJobArgs, parse_fire_args_from_context
255
218
  fire_args = parse_fire_args_from_context(ctx)
256
219
 
257
220
  args = FireJobArgs(
@@ -264,6 +227,7 @@ def main(
264
227
  choose_function=choose_function,
265
228
  loop=loop,
266
229
  jupyter=jupyter,
230
+ marimo=marimo,
267
231
  submit_to_cloud=submit_to_cloud,
268
232
  remote=remote,
269
233
  module=module,
@@ -273,7 +237,6 @@ def main(
273
237
  PathExport=PathExport,
274
238
  git_pull=git_pull,
275
239
  optimized=optimized,
276
- Nprocess=Nprocess,
277
240
  zellij_tab=zellij_tab,
278
241
  watch=watch,
279
242
  )
@@ -290,18 +253,18 @@ def main(
290
253
  sys.exit(1)
291
254
 
292
255
 
293
- def main_from_parser():
294
- # from trogon.typer import init_tui
295
- # from trogon.typer import init_tui
256
+ def get_app():
296
257
  from typer import Typer
297
258
 
298
259
  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)
260
+ app.command(context_settings={"allow_extra_args": True, "allow_interspersed_args": False})(fire)
261
+ return app
262
+
263
+
264
+ def main():
265
+ app = get_app()
302
266
  app()
303
267
 
304
268
 
305
269
  if __name__ == "__main__":
306
- # options, func_args = parse_pyfile(file_path="C:/Users/aalsaf01/code/machineconfig/myresources/crocodile/core.py")
307
- main_from_parser()
270
+ 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,28 @@ 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,
29
18
  ) -> None:
19
+
20
+ from rich.console import Console
21
+ from rich.panel import Panel
22
+
23
+ from machineconfig.utils.ssh import SSH
24
+ from machineconfig.utils.path_extended import PathExtended
25
+ from machineconfig.scripts.python.helpers_cloud.helpers2 import ES
26
+ from machineconfig.utils.accessories import pprint
27
+
28
+
29
+ console = Console()
30
+
30
31
  console.print(
31
32
  Panel(
32
33
  "\n".join(
@@ -106,7 +107,7 @@ def main(
106
107
  from paramiko.ssh_exception import AuthenticationException # type: ignore
107
108
 
108
109
  try:
109
- ssh = SSH(rf"{machine}")
110
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=None, port=22, enable_compression=True)
110
111
  except AuthenticationException:
111
112
  console.print(
112
113
  Panel(
@@ -124,7 +125,7 @@ def main(
124
125
  import getpass
125
126
 
126
127
  pwd = getpass.getpass()
127
- ssh = SSH(rf"{machine}", pwd=pwd)
128
+ ssh = SSH(host=rf"{machine}", username=None, hostname=None, ssh_key_path=None, password=pwd, port=22, enable_compression=True)
128
129
 
129
130
  if cloud:
130
131
  console.print(
@@ -134,7 +135,7 @@ def main(
134
135
  border_style="cyan",
135
136
  )
136
137
  )
137
- ssh.run(f"cloud_copy {resolved_source} :^", desc="Uploading from remote to the cloud.").print()
138
+ ssh.run_shell(command=f"cloud_copy {resolved_source} :^", verbose_output=True, description="Uploading from remote to the cloud.", strict_stderr=False, strict_return_code=False)
138
139
  console.print(
139
140
  Panel.fit(
140
141
  "⬇️ Cloud transfer mode — downloading from cloud to local...",
@@ -142,12 +143,14 @@ def main(
142
143
  border_style="cyan",
143
144
  )
144
145
  )
145
- ssh.run_locally(f"cloud_copy :^ {resolved_target}").print()
146
+ ssh.run_locally(command=f"cloud_copy :^ {resolved_target}")
146
147
  received_file = PathExtended(resolved_target) # type: ignore
147
148
  else:
148
149
  if source_is_remote:
149
- assert resolved_source is not None, """
150
- ❌ Path Error: Source must be a remote path (machine:path)"""
150
+ if resolved_source is None:
151
+ typer.echo("""❌ Path Error: Source must be a remote path (machine:path)""")
152
+ typer.Exit(code=1)
153
+ return
151
154
  target_display = resolved_target or "<auto>"
152
155
  console.print(
153
156
  Panel(
@@ -164,7 +167,7 @@ def main(
164
167
  padding=(1, 2),
165
168
  )
166
169
  )
167
- received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
170
+ received_file = ssh.copy_to_here(source=resolved_source, target=resolved_target, compress_with_zip=zipFirst, recursive=recursive)
168
171
  else:
169
172
  assert resolved_source is not None, """
170
173
  ❌ Path Error: Target must be a remote path (machine:path)"""
@@ -184,7 +187,7 @@ def main(
184
187
  padding=(1, 2),
185
188
  )
186
189
  )
187
- received_file = ssh.copy_from_here(source=resolved_source, target=resolved_target, z=zipFirst, r=recursive)
190
+ received_file = ssh.copy_from_here(source_path=resolved_source, target_rel2home=resolved_target, compress_with_zip=zipFirst, recursive=recursive, overwrite_existing=False)
188
191
 
189
192
  if source_is_remote and isinstance(received_file, PathExtended):
190
193
  console.print(
@@ -211,10 +214,12 @@ def main(
211
214
  )
212
215
 
213
216
 
214
- def main_from_parser() -> None:
217
+ def main() -> None:
215
218
  """Entry point function that uses typer to parse arguments and call main."""
216
- typer.run(main)
219
+ app = typer.Typer()
220
+ app.command(no_args_is_help=True, help="File transfer utility though SSH.")(ftpx)
221
+ app()
217
222
 
218
223
 
219
224
  if __name__ == "__main__":
220
- main_from_parser()
225
+ main()
@@ -0,0 +1,14 @@
1
+ {
2
+ "models": {
3
+ "large": {
4
+ "model": "{model}",
5
+ "provider": "{provider}",
6
+ "max_tokens": 100000
7
+ }
8
+ },
9
+ "providers": {
10
+ "openrouter": {
11
+ "api_key": "{api_key}"
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,37 @@
1
+
2
+ from pathlib import Path
3
+ # import shlex
4
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
5
+
6
+
7
+ def fire_crush(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
8
+ match ai_spec["machine"]:
9
+ case "local":
10
+ cmd = f"""
11
+ crush run {prompt_path}
12
+ """
13
+ case "docker":
14
+ assert ai_spec["api_key"] is not None, "API key is required for Crush agent in docker mode."
15
+ json_path = Path(__file__).parent / "fire_crush.json"
16
+ json_template = json_path.read_text(encoding="utf-8")
17
+ json_filled = json_template.replace("{api_key}", ai_spec["api_key"]).replace("{model}", ai_spec["model"]).replace("{provider}", ai_spec["provider"])
18
+ from machineconfig.utils.accessories import randstr
19
+ temp_config_file_local = Path.home().joinpath("tmp_results/tmp_files/crush_" + randstr(8) + ".json")
20
+ temp_config_file_local.parent.mkdir(parents=True, exist_ok=True)
21
+ Path(temp_config_file_local).write_text(json_filled, encoding="utf-8")
22
+ cmd = f"""
23
+
24
+ # -e "PATH_PROMPT=$PATH_PROMPT"
25
+ # opencode --model "{ai_spec["provider"]}/{ai_spec["model"]}" run {prompt_path}
26
+
27
+
28
+ echo "Running prompt @ {prompt_path.relative_to(repo_root)} using Docker with Crush..."
29
+ docker run -it --rm \
30
+ -v "{repo_root}:/workspace/{repo_root.name}" \
31
+ -v "{temp_config_file_local}:/root/.local/share/crush/crush.json" \
32
+ -w "/workspace/{repo_root.name}" \
33
+ statistician/machineconfig-ai:latest \
34
+ bash -i -c "source ~/.bashrc && cd /workspace/{repo_root.name} && cat /root/.local/share/crush/crush.json && crush run 'Please act on contents of this prompt ./{prompt_path.relative_to(repo_root)}'"
35
+
36
+ """
37
+ return cmd
@@ -0,0 +1,22 @@
1
+
2
+
3
+ from pathlib import Path
4
+ # import shlex
5
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
6
+
7
+ def fire_cursor(ai_spec: AI_SPEC, prompt_path: Path) -> str:
8
+ match ai_spec["machine"]:
9
+ case "local":
10
+ # Export the environment variable so it's available to subshells
11
+ cmd = f"""
12
+
13
+ cursor-agent --print --output-format text {prompt_path}
14
+
15
+ """
16
+ case "docker":
17
+ cmd = f"""
18
+
19
+ cursor-agent --print --output-format text {prompt_path}
20
+
21
+ """
22
+ return cmd
@@ -0,0 +1,42 @@
1
+
2
+ from pathlib import Path
3
+ import shlex
4
+ from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
5
+
6
+
7
+ def fire_gemini(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
8
+ _ = ai_spec["provider"]
9
+ # model = "gemini-2.5-flash-lite"
10
+ # model = None # auto-select
11
+ # if model is None:
12
+ # model_arg = ""
13
+ # else:
14
+ model_arg = f"--model {shlex.quote(ai_spec['model'])}"
15
+ # Need a real shell for the pipeline; otherwise '| gemini ...' is passed as args to 'cat'
16
+ safe_path = shlex.quote(str(prompt_path))
17
+
18
+ match ai_spec["machine"]:
19
+ case "local":
20
+ # Export the environment variable so it's available to subshells
21
+ if ai_spec["api_key"] is not None:
22
+ define_api_key = f"""export GEMINI_API_KEY="{shlex.quote(ai_spec['api_key'])}" """
23
+ else:
24
+ define_api_key = "echo 'Warning: No GEMINI_API_KEY provided, hoping it is set in the environment.'"
25
+ cmd = f"""
26
+ {define_api_key}
27
+ echo "Using Gemini API key $GEMINI_API_KEY"
28
+ gemini {model_arg} --yolo --prompt {safe_path}
29
+ """
30
+
31
+
32
+ case "docker":
33
+ assert ai_spec["api_key"] is not None, "When using docker, api_key must be provided."
34
+ cmd = f"""
35
+ docker run -it --rm \
36
+ -e GEMINI_API_KEY="{ai_spec['api_key']}" \
37
+ -v "{repo_root}:/workspace/{repo_root.name}" \
38
+ -w "/workspace/{repo_root.name}" \
39
+ statistician/machineconfig-ai:latest \
40
+ gemini --prompt "$PATH_PROMPT"
41
+ """
42
+ return cmd