machineconfig 6.82__py3-none-any.whl → 8.51__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/run_cluster.py +1 -1
  3. machineconfig/cluster/remote/run_remote.py +1 -1
  4. machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
  5. machineconfig/cluster/sessions_managers/wt_local.py +17 -222
  6. machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
  7. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  8. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  10. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  12. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  13. machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
  14. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  15. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  16. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  17. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  18. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  19. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  20. machineconfig/jobs/installer/installer_data.json +1500 -310
  21. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  22. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  23. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  24. machineconfig/jobs/installer/package_groups.py +62 -91
  25. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  26. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
  27. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  28. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  29. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  31. machineconfig/jobs/installer/python_scripts/hx.py +214 -0
  32. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
  34. machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
  35. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  37. machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
  38. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  39. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  43. machineconfig/logger.py +1 -2
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +79 -21
  46. machineconfig/profile/create_links_export.py +87 -36
  47. machineconfig/profile/create_shell_profile.py +92 -127
  48. machineconfig/profile/mapper_data.toml +45 -0
  49. machineconfig/profile/mapper_dotfiles.toml +249 -0
  50. machineconfig/scripts/__init__.py +0 -4
  51. machineconfig/scripts/linux/wrap_mcfg +46 -0
  52. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  53. machineconfig/scripts/python/agents.py +85 -165
  54. machineconfig/scripts/python/ai/initai.py +4 -2
  55. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  56. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  57. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  58. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  59. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  60. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  61. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  62. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  63. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  64. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  65. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +6 -6
  66. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
  67. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  68. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  69. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  70. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  71. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  72. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  73. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  74. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
  75. machineconfig/scripts/python/cloud.py +58 -11
  76. machineconfig/scripts/python/croshell.py +10 -162
  77. machineconfig/scripts/python/devops.py +73 -36
  78. machineconfig/scripts/python/devops_navigator.py +16 -6
  79. machineconfig/scripts/python/fire_jobs.py +8 -222
  80. machineconfig/scripts/python/ftpx.py +7 -200
  81. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  82. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  83. machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
  84. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  85. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  86. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  87. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  88. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  89. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  90. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  91. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
  92. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
  93. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  94. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  95. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  96. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  97. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  98. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  99. machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
  100. machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
  101. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
  102. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
  103. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
  104. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
  106. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  107. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  108. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
  109. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  110. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  111. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  112. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  113. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  114. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
  115. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  116. machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
  117. machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
  118. machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
  119. machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
  120. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  121. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
  122. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  123. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
  124. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  125. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  126. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  127. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
  128. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
  129. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  130. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  131. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
  132. machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
  133. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  134. machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
  135. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  136. machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  137. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  138. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  139. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  140. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  141. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  142. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  143. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  144. machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
  145. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  146. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  147. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
  148. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
  149. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  150. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  151. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  152. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  153. machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
  154. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  155. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  156. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
  157. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
  158. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
  159. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
  160. machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
  161. machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
  162. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  163. machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
  164. machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
  165. machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
  166. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  167. machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
  168. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  169. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  170. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
  171. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  172. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  173. machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
  174. machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
  175. machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
  176. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  177. machineconfig/scripts/python/mcfg_entry.py +143 -0
  178. machineconfig/scripts/python/msearch.py +26 -0
  179. machineconfig/scripts/python/sessions.py +69 -135
  180. machineconfig/scripts/python/terminal.py +58 -0
  181. machineconfig/scripts/python/utils.py +115 -38
  182. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  183. machineconfig/settings/atuin/config.toml +294 -0
  184. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  185. machineconfig/settings/broot/conf.toml +1 -1
  186. machineconfig/settings/helix/config.toml +16 -0
  187. machineconfig/settings/helix/languages.toml +13 -4
  188. machineconfig/settings/helix/yazi-picker.sh +12 -0
  189. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  190. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  191. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  192. machineconfig/settings/lf/windows/lfrc +14 -16
  193. machineconfig/settings/linters/.ruff.toml +2 -1
  194. machineconfig/settings/marimo/marimo.toml +1 -1
  195. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  196. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  197. machineconfig/settings/shells/bash/init.sh +47 -12
  198. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  199. machineconfig/settings/shells/nushell/config.nu +25 -33
  200. machineconfig/settings/shells/nushell/env.nu +21 -8
  201. machineconfig/settings/shells/nushell/init.nu +138 -0
  202. machineconfig/settings/shells/pwsh/init.ps1 +111 -17
  203. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  204. machineconfig/settings/shells/starship/starship.toml +16 -0
  205. machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
  206. machineconfig/settings/shells/wt/settings.json +27 -18
  207. machineconfig/settings/shells/zsh/init.sh +42 -23
  208. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  209. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  210. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  211. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  212. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  213. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  214. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  215. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  216. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  217. machineconfig/settings/television/cable_unix/env.toml +17 -0
  218. machineconfig/settings/television/cable_unix/files.toml +11 -0
  219. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  220. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  221. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  222. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  223. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  224. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  225. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  226. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  227. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  228. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  229. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  230. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  231. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  232. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  233. machineconfig/settings/television/cable_unix/text.toml +17 -0
  234. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  235. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  236. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  237. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  238. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  239. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  240. machineconfig/settings/television/cable_windows/env.toml +17 -0
  241. machineconfig/settings/television/cable_windows/files.toml +14 -0
  242. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  243. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  244. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  245. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  246. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  247. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  248. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  249. machineconfig/settings/television/cable_windows/text.toml +17 -0
  250. machineconfig/settings/tv/config.toml +234 -0
  251. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  252. machineconfig/settings/wsl/.wslconfig +5 -30
  253. machineconfig/settings/wt/__init__.py +0 -0
  254. machineconfig/settings/yazi/init.lua +61 -0
  255. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  256. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  257. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  258. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  259. machineconfig/settings/yazi/theme.toml +4 -0
  260. machineconfig/settings/yazi/yazi_linux.toml +94 -0
  261. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  262. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  263. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  264. machineconfig/setup_linux/__init__.py +2 -2
  265. machineconfig/setup_linux/apps_desktop.sh +8 -27
  266. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  267. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
  268. machineconfig/setup_mac/__init__.py +1 -4
  269. machineconfig/setup_mac/apps_gui.sh +248 -0
  270. machineconfig/setup_windows/__init__.py +2 -5
  271. machineconfig/setup_windows/uv.ps1 +8 -1
  272. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
  273. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
  274. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  275. machineconfig/type_hinting/sql/__init__.py +1 -0
  276. machineconfig/type_hinting/sql/base.py +216 -0
  277. machineconfig/type_hinting/sql/core_schema.py +64 -0
  278. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  279. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  280. machineconfig/type_hinting/typedict/__init__.py +1 -0
  281. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  282. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  283. machineconfig/type_hinting/typedict/generators.py +231 -0
  284. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  285. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  286. machineconfig/utils/accessories.py +31 -4
  287. machineconfig/utils/code.py +163 -51
  288. machineconfig/utils/files/ascii_art.py +11 -15
  289. machineconfig/utils/files/headers.py +6 -7
  290. machineconfig/utils/files/read.py +8 -1
  291. machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
  292. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  293. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  294. machineconfig/utils/installer_utils/installer_class.py +53 -102
  295. machineconfig/utils/installer_utils/installer_cli.py +161 -0
  296. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  297. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
  298. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
  299. machineconfig/utils/io.py +94 -9
  300. machineconfig/utils/links.py +56 -38
  301. machineconfig/utils/meta.py +38 -21
  302. machineconfig/utils/options.py +81 -23
  303. machineconfig/utils/options_utils/__init__.py +0 -0
  304. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  305. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  306. machineconfig/utils/options_utils/tv_options.py +37 -0
  307. machineconfig/utils/path_extended.py +52 -102
  308. machineconfig/utils/path_helper.py +76 -23
  309. machineconfig/utils/procs.py +1 -1
  310. machineconfig/utils/scheduler.py +26 -53
  311. machineconfig/utils/scheduling.py +0 -2
  312. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  313. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  314. machineconfig/utils/source_of_truth.py +6 -1
  315. machineconfig/utils/ssh.py +216 -419
  316. machineconfig/utils/ssh_utils/abc.py +5 -0
  317. machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
  318. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  319. machineconfig/utils/ssh_utils/utils.py +158 -0
  320. machineconfig/utils/ssh_utils/wsl.py +147 -0
  321. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  322. machineconfig/utils/terminal.py +1 -0
  323. machineconfig/utils/upgrade_packages.py +107 -35
  324. machineconfig/utils/ve.py +12 -4
  325. machineconfig-8.51.dist-info/METADATA +140 -0
  326. machineconfig-8.51.dist-info/RECORD +543 -0
  327. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
  328. machineconfig/jobs/installer/check_installations.py +0 -248
  329. machineconfig/jobs/installer/custom/hx.py +0 -140
  330. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  331. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  332. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  333. machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
  334. machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
  335. machineconfig/profile/backup.toml +0 -49
  336. machineconfig/profile/mapper.toml +0 -256
  337. machineconfig/scripts/linux/fzf2g +0 -21
  338. machineconfig/scripts/linux/fzfag +0 -17
  339. machineconfig/scripts/linux/fzffg +0 -25
  340. machineconfig/scripts/linux/fzfrga +0 -21
  341. machineconfig/scripts/linux/mcfgs +0 -38
  342. machineconfig/scripts/linux/other/share_smb +0 -1
  343. machineconfig/scripts/linux/other/switch_ip +0 -20
  344. machineconfig/scripts/linux/skrg +0 -4
  345. machineconfig/scripts/linux/warp-cli.sh +0 -122
  346. machineconfig/scripts/linux/z_ls +0 -104
  347. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  348. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -120
  349. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
  350. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  351. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
  352. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
  353. machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
  354. machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
  355. machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
  356. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  357. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  358. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  359. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  360. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  361. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  362. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  363. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  364. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  365. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
  366. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  367. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
  368. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  369. machineconfig/scripts/python/mcfg.py +0 -48
  370. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  371. machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
  372. machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
  373. machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
  374. machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
  375. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  376. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  377. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  378. machineconfig/scripts/windows/fzfrga.bat +0 -20
  379. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  380. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  381. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  382. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  383. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  384. machineconfig/settings/yazi/yazi.toml +0 -4
  385. machineconfig/setup_linux/apps.sh +0 -66
  386. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  387. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  388. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  389. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  390. machineconfig/setup_mac/apps.sh +0 -73
  391. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  392. machineconfig/setup_windows/apps.ps1 +0 -62
  393. machineconfig/setup_windows/others/obs.ps1 +0 -4
  394. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  395. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  396. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  397. machineconfig/utils/installer_utils/installer.py +0 -225
  398. machineconfig/utils/tst.py +0 -20
  399. machineconfig-6.82.dist-info/METADATA +0 -82
  400. machineconfig-6.82.dist-info/RECORD +0 -441
  401. machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  402. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  403. machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
  404. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  405. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  406. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  407. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  408. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  409. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  410. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  411. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  412. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  413. machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  414. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  415. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  416. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  417. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  418. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  419. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  420. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  421. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  422. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  423. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  424. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  425. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  426. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  427. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  428. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  429. machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
  430. machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  431. machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
  432. machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
  433. machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  434. machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  435. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
  437. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  438. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  439. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
  440. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  441. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
  442. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  443. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
  444. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  445. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  446. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  447. /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
  448. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
  449. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  450. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
  451. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  452. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  453. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  454. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  455. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
  456. /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
  457. /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
  458. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  459. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  460. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  461. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,197 @@
1
+
2
+
3
+ """run python/shell scripts from pre-defined directorys, or, run command/file in the machineconfig environment
4
+
5
+ Recursively Searched Predefined Directories:
6
+
7
+
8
+ * 'private' : $HOME/dotfiles/scripts
9
+
10
+ * 'public' : $HOME/.config/machineconfig/scripts
11
+
12
+ * 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
13
+
14
+ * 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
15
+
16
+ * 'custom' : custom directories from comma separated entry 'scripts' under 'general' section @ ~/dotfiles/machineconfig/defaults.ini
17
+
18
+ """
19
+
20
+
21
+ import typer
22
+ from typing import Annotated, Optional, Literal
23
+
24
+
25
+ def run_py_script(ctx: typer.Context,
26
+ name: Annotated[str, typer.Argument(help="Name of script to run, e.g., 'a' for a.py, or command to execute")] = "",
27
+ where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d", "custom", "c"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
28
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of scripts to run")] = False,
29
+ command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False,
30
+ list_scripts: Annotated[bool, typer.Option(..., "--list", "-l", help="List available scripts in all locations")] = False,
31
+ ) -> None:
32
+ if command:
33
+ exec(name)
34
+ return
35
+
36
+ from pathlib import Path
37
+ if list_scripts:
38
+ from machineconfig.scripts.python.helpers.helpers_search.script_help import list_available_scripts
39
+ list_available_scripts(where=where)
40
+ return
41
+
42
+ if not interactive and not name:
43
+ typer.echo("❌ ERROR: You must provide a script name or use --interactive option to select a script.")
44
+ raise typer.Exit(code=1)
45
+ target_file: Optional[Path] = None
46
+
47
+ if where in ["dynamic", "d"]:
48
+ # src/machineconfig/jobs/scripts/python_scripts/a.py
49
+ if "." in name: resolved_names: list[str] = [name]
50
+ else: resolved_names = [f"{name}{a_suffix}" for a_suffix in [".py", ".sh", "", ".ps1", ".bat", ".cmd"]]
51
+ urls = [f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/jobs/scripts_dynamic/{a_resolved_name}""" for a_resolved_name in resolved_names]
52
+ for a_url in urls:
53
+ try:
54
+ print(f"Fetching temporary script from {a_url} ...")
55
+ import requests
56
+ response = requests.get(a_url)
57
+ if response.status_code != 200:
58
+ print(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}")
59
+ raise RuntimeError(f"Could not fetch script '{name}.py' from repository.")
60
+ script_content = response.text
61
+ target_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", f"{name}.py")
62
+ target_file.parent.mkdir(parents=True, exist_ok=True)
63
+ target_file.write_text(script_content, encoding="utf-8")
64
+ except Exception as _e:
65
+ pass
66
+
67
+
68
+ if target_file is None and Path(name).is_file():
69
+ if name.endswith(".py"):
70
+ import machineconfig
71
+ import subprocess
72
+ import sys
73
+ subprocess.run([sys.executable, name], cwd=machineconfig.__path__[0])
74
+ return
75
+ else:
76
+ if Path(name).suffix in [".sh", ".ps1", ".bat", ".cmd", ""]:
77
+ target_file = Path(name)
78
+ else:
79
+ print(f"❌ Error: File '{name}' is not a recognized script type. Supported types are {'.py', '.sh', '.ps1', '.bat', '.cmd', ''}.")
80
+ raise typer.Exit(code=1)
81
+
82
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT, DEFAULTS_PATH
83
+ private_root = Path.home().joinpath("dotfiles/scripts") # local directory
84
+ public_root = CONFIG_ROOT.joinpath("scripts") # local machineconfig directory
85
+ library_root = LIBRARY_ROOT.joinpath("jobs", "scripts")
86
+
87
+ def get_custom_roots() -> list[Path]:
88
+ custom_roots: list[Path] = []
89
+ if DEFAULTS_PATH.is_file():
90
+ from configparser import ConfigParser
91
+ config = ConfigParser()
92
+ config.read(DEFAULTS_PATH)
93
+ if config.has_section("general") and config.has_option("general", "scripts"):
94
+ custom_dirs = config.get("general", "scripts").split(",")
95
+ for custom_dir in custom_dirs:
96
+ custom_path = Path(custom_dir.strip()).expanduser().resolve()
97
+ if custom_path.is_dir():
98
+ custom_roots.append(custom_path)
99
+ return custom_roots
100
+
101
+ roots: list[Path] = []
102
+ match where:
103
+ case "all" | "a":
104
+ roots = [private_root, public_root, library_root] + get_custom_roots()
105
+ case "private" | "p":
106
+ roots = [private_root]
107
+ case "public" | "b":
108
+ roots = [public_root]
109
+ case "library" | "l":
110
+ roots = [library_root]
111
+ case "dynamic" | "d":
112
+ roots = []
113
+ case "custom" | "c":
114
+ roots = get_custom_roots()
115
+
116
+ suffixes: list[str]
117
+ if "." in name:
118
+ suffixes = [""]
119
+ else:
120
+ import platform
121
+ if platform.system() == "Windows":
122
+ suffixes = [".py", ".bat", ".cmd", ".ps1"]
123
+ elif platform.system() == "Darwin" or platform.system() == "Linux":
124
+ suffixes = [""] # files without suffix could be shell scripts, and that already cover files with .sh suffix without duplications
125
+ else:
126
+ suffixes = [".py"]
127
+
128
+ # Finding target file
129
+ potential_matches: list[Path] = []
130
+ if target_file is None:
131
+ for a_root in roots:
132
+ for a_suffix in suffixes:
133
+ if a_root.joinpath(f"{name}{a_suffix}").is_file():
134
+ target_file = a_root.joinpath(f"{name}{a_suffix}")
135
+ break # perfect match
136
+ potential_matches += [a_file for a_file in a_root.rglob(f"*{name}*{a_suffix}") if a_file.is_file()]
137
+
138
+ if target_file is None:
139
+ if len(potential_matches) == 1:
140
+ target_file = potential_matches[0]
141
+ elif len(potential_matches) == 0:
142
+ typer.echo(ctx.get_help())
143
+ typer.echo()
144
+ typer.echo(typer.style(f"❌ ERROR: Could not find script '{name}'.", fg=typer.colors.RED, bold=True))
145
+ typer.echo("Searched in:")
146
+ for r in roots:
147
+ typer.echo(f" - {r}")
148
+ raise typer.Exit(code=1)
149
+ else:
150
+ typer.echo(typer.style(f"Warning: Could not find script '{name}'. Checked {len(potential_matches)} candidate files, trying interactively:", fg=typer.colors.YELLOW))
151
+ from machineconfig.utils.options import choose_from_options
152
+ options = [str(p) for p in potential_matches]
153
+ chosen_file_part = choose_from_options(options, multi=False, msg="Select the script to run:", tv=True, preview="bat")
154
+ target_file = Path(chosen_file_part)
155
+
156
+ typer.echo(typer.style(f"✅ Found script at: {target_file}", fg=typer.colors.GREEN))
157
+ if target_file.suffix == ".py":
158
+ from machineconfig.utils.code import get_uv_command_executing_python_file, exit_then_run_shell_script
159
+ shell_script = get_uv_command_executing_python_file(python_file=str(target_file), uv_project_dir=None, uv_with=None, prepend_print=False)
160
+ exit_then_run_shell_script(script=shell_script)
161
+ else:
162
+ from machineconfig.utils.code import exit_then_run_shell_file
163
+ exit_then_run_shell_file(script_path=str(target_file), strict=True)
164
+
165
+
166
+ def copy_script_to_local(ctx: typer.Context,
167
+ name: Annotated[str, typer.Argument(help="Name of the temporary python script to copy, e.g., 'a' for a.py")],
168
+ alias: Annotated[Optional[str], typer.Option("--alias", "-a", help="Whether to create call it a different name locally")] = None
169
+ ) -> None:
170
+ """
171
+ Copy a temporary python script stored in machineconfig/scripts/python/helpers/tmp_py_scripts to the local machine.
172
+ """
173
+ url = f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/scripts/python/helpers/tmp_py_scripts/{name}.py"""
174
+ import requests
175
+ response = requests.get(url)
176
+ if response.status_code != 200:
177
+ typer.echo(ctx.get_help())
178
+ typer.echo()
179
+ typer.echo(typer.style(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}", fg=typer.colors.RED, bold=True))
180
+ raise typer.Exit(code=1)
181
+ script_content = response.text
182
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
183
+ local_path = CONFIG_ROOT.joinpath(f"scripts_python/{alias or name}.py")
184
+ with open(local_path, "w") as f:
185
+ f.write(script_content)
186
+ typer.echo(typer.style(f"✅ Script '{name}.py' has been copied to '{local_path}'.", fg=typer.colors.GREEN))
187
+
188
+
189
+ def get_app():
190
+ app = typer.Typer(
191
+ name="run-tmp-script",
192
+ help="Helper to run temporary python scripts stored in machineconfig/scripts/python/helpers/tmp_py_scripts",
193
+ no_args_is_help=True,
194
+ )
195
+ from machineconfig.jobs.scripts_dynamic import a
196
+ app.command()(a.main)
197
+ return app
@@ -0,0 +1,41 @@
1
+ $presets = @{
2
+ "nerd-font-symbols" = "Changes the symbols for each module to use Nerd Font symbols."
3
+ "no-nerd-font" = "Changes the symbols so that no Nerd Font symbols are used."
4
+ "bracketed-segments" = "Changes the format to show segments in brackets."
5
+ "plain-text-symbols" = "Changes the symbols for each module into plain text."
6
+ "no-runtime-versions" = "Hides the version of language runtimes."
7
+ "no-empty-icons" = "Does not show icons if the toolset is not found."
8
+ "pure-preset" = "Emulates the look and behavior of Pure."
9
+ "pastel-powerline" = "Inspired by M365Princess."
10
+ "tokyo-night" = "Inspired by tokyo-night-vscode-theme."
11
+ "gruvbox-rainbow" = "Inspired by Pastel Powerline and Tokyo Night."
12
+ "jetpack" = "Pseudo minimalist preset inspired by geometry and spaceship."
13
+ }
14
+
15
+ $input_list = $presets.Keys | ForEach-Object { "$_`t$($presets[$_])" }
16
+
17
+ $preview_config = "$env:TEMP/starship_preview.toml"
18
+
19
+ # Preview command for PowerShell
20
+ # We need to split the line and get the first part.
21
+ # tv replaces {} with the line.
22
+ # We use powershell -c for the preview command to be safe and consistent.
23
+
24
+ $preview_cmd = "powershell -c `"`$preset = '{}'.Split('`t')[0]; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`""
25
+
26
+ if (Get-Command "tv" -ErrorAction SilentlyContinue) {
27
+ $selected_line = $input_list | tv --preview-command $preview_cmd --preview-size 50
28
+ } elseif (Get-Command "fzf" -ErrorAction SilentlyContinue) {
29
+ # fzf fallback
30
+ $selected_line = $input_list | fzf --ansi --delimiter "`t" --with-nth 1,2 --preview "powershell -c `"`$preset = {1}; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`"" --preview-window bottom:50%
31
+ } else {
32
+ Write-Host "Error: 'tv' or 'fzf' not found."
33
+ exit 1
34
+ }
35
+
36
+ if ($selected_line) {
37
+ $selected_preset = $selected_line.Split("`t")[0]
38
+ Write-Host "Applying $selected_preset..."
39
+ starship preset $selected_preset -o "$HOME/.config/starship.toml"
40
+ Write-Host "Done!"
41
+ }
@@ -0,0 +1,48 @@
1
+ #!/bin/bash
2
+
3
+ # Ensure UTF-8 encoding for symbols and CLI tools
4
+ export LANG=C.UTF-8
5
+ export LC_ALL=C.UTF-8
6
+ export LC_CTYPE=C.UTF-8
7
+ export PYTHONIOENCODING=utf-8
8
+
9
+ # Presets
10
+ presets=(
11
+ "nerd-font-symbols Changes the symbols for each module to use Nerd Font symbols."
12
+ "no-nerd-font Changes the symbols so that no Nerd Font symbols are used."
13
+ "bracketed-segments Changes the format to show segments in brackets."
14
+ "plain-text-symbols Changes the symbols for each module into plain text."
15
+ "no-runtime-versions Hides the version of language runtimes."
16
+ "no-empty-icons Does not show icons if the toolset is not found."
17
+ "pure-preset Emulates the look and behavior of Pure."
18
+ "pastel-powerline Inspired by M365Princess."
19
+ "tokyo-night Inspired by tokyo-night-vscode-theme."
20
+ "gruvbox-rainbow Inspired by Pastel Powerline and Tokyo Night."
21
+ "jetpack Pseudo minimalist preset inspired by geometry and spaceship."
22
+ )
23
+
24
+ # Join presets with newlines
25
+ input_data=$(printf "%s\n" "${presets[@]}")
26
+
27
+ preview_config="/tmp/starship_preview.toml"
28
+ # Preview command needs to extract the first column (preset name) from the line
29
+ # {} will be replaced by the selected line
30
+ # We use awk to handle multiple spaces as delimiter
31
+ preview_cmd="preset=\$(echo '{}' | awk '{print \$1}'); starship preset \"\$preset\" > $preview_config && LANG=C.UTF-8 LC_ALL=C.UTF-8 STARSHIP_CONFIG=$preview_config STARSHIP_SHELL=fish starship prompt"
32
+
33
+ if command -v tv &> /dev/null; then
34
+ # tv requires input from stdin if no source-command is given
35
+ selected_line=$(printf "%s" "$input_data" | LANG=C.UTF-8 LC_ALL=C.UTF-8 tv --ansi --preview-command "$preview_cmd" --preview-size 50)
36
+ elif command -v fzf &> /dev/null; then
37
+ selected_line=$(printf "%s" "$input_data" | LANG=C.UTF-8 LC_ALL=C.UTF-8 fzf --ansi --preview "preset=\$(echo {} | awk '{print \$1}'); starship preset \$preset > $preview_config && LANG=C.UTF-8 LC_ALL=C.UTF-8 STARSHIP_CONFIG=$preview_config STARSHIP_SHELL=fish starship prompt" --preview-window bottom:30%)
38
+ else
39
+ echo "Error: 'tv' or 'fzf' not found."
40
+ exit 1
41
+ fi
42
+
43
+ if [ -n "$selected_line" ]; then
44
+ selected_preset=$(echo "$selected_line" | awk '{print $1}')
45
+ echo "Applying $selected_preset..."
46
+ starship preset "$selected_preset" -o ~/.config/starship.toml
47
+ echo "Done!"
48
+ fi
@@ -3,7 +3,7 @@ Choose a theme for Wezterm
3
3
  """
4
4
 
5
5
  from machineconfig.utils.options import choose_from_options
6
- from machineconfig.utils.path_extended import PathExtended
6
+ from pathlib import Path
7
7
  from typing import Any
8
8
  import time
9
9
  from rich.panel import Panel
@@ -45,21 +45,21 @@ schemes_list = [
45
45
 
46
46
  def main2():
47
47
  console.print(Panel("🎨 WezTerm Theme Selector", title_align="left", border_style="green"))
48
- option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm", fzf=True, msg="Use arrow keys to navigate, Enter to select a theme")
48
+ option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm", tv=True, msg="Use arrow keys to navigate, Enter to select a theme")
49
49
  set_theme(option)
50
50
  print(f"✅ Theme set to: {option}")
51
51
 
52
52
 
53
53
  def set_theme(theme: str):
54
54
  print(f"🔄 Setting WezTerm theme to: {theme}")
55
- txt_lines = PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
55
+ txt_lines = Path.home().joinpath(".config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
56
56
  res_lines = []
57
57
  for line in txt_lines:
58
58
  if "config.color_scheme = " in line:
59
59
  res_lines.append(f"config.color_scheme = '{theme}'")
60
60
  else:
61
61
  res_lines.append(line)
62
- PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
62
+ Path.home().joinpath(".config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
63
63
  time.sleep(0.1)
64
64
  print("💾 Configuration saved")
65
65
 
@@ -1,24 +1,7 @@
1
-
2
1
  from typing import Optional
3
2
  import os
4
- from machineconfig.utils.path_extended import PathExtended
5
-
6
-
7
- def search_for_files_of_interest(path_obj: PathExtended):
8
- if path_obj.joinpath(".venv").exists():
9
- path_objects = path_obj.search("*", not_in=[".venv"])
10
- files: list[PathExtended] = []
11
- for a_path_obj in path_objects:
12
- files += search_for_files_of_interest(path_obj=a_path_obj)
13
- return files
14
- if path_obj.is_file():
15
- return [path_obj]
16
- py_files = path_obj.search(pattern="*.py", not_in=["__init__.py"], r=True)
17
- ps_files = path_obj.search(pattern="*.ps1", r=True)
18
- sh_files = path_obj.search(pattern="*.sh", r=True)
19
- files = py_files + ps_files + sh_files
20
- return files
21
-
3
+ from pathlib import Path
4
+ import platform
22
5
 
23
6
 
24
7
  def parse_pyfile(file_path: str):
@@ -29,7 +12,7 @@ def parse_pyfile(file_path: str):
29
12
  func_args: list[list[args_spec]] = [[]] # this firt prepopulated dict is for the option 'RUN AS MAIN' which has no args
30
13
  import ast
31
14
 
32
- parsed_ast = ast.parse(PathExtended(file_path).read_text(encoding="utf-8"))
15
+ parsed_ast = ast.parse(Path(file_path).read_text(encoding="utf-8"))
33
16
  functions = [node for node in ast.walk(parsed_ast) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]
34
17
  module__doc__ = ast.get_docstring(parsed_ast)
35
18
  main_option = f"RUN AS MAIN -- {module__doc__ if module__doc__ is not None else 'NoDocs'}"
@@ -110,3 +93,57 @@ def get_import_module_code(module_path: str):
110
93
  module_name = "IncorrectModuleName"
111
94
  # TODO: use py_compile to check if the statement is valid code to avoid syntax errors that can't be caught.
112
95
  return f"from {module_name} import *"
96
+
97
+
98
+ def wrap_import_in_try_except(import_line: str, pyfile: str, repo_root: Optional[str] = None) -> None:
99
+ try:
100
+ exec(import_line) # type: ignore
101
+ except (ImportError, ModuleNotFoundError) as ex:
102
+ print(fr"❌ Failed to import `{pyfile}` as a module: {ex} ")
103
+ print("⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
104
+ import sys
105
+ from pathlib import Path
106
+ sys.path.append(str(Path(pyfile).parent))
107
+ if repo_root is not None:
108
+ sys.path.append(repo_root)
109
+ exec(f"from {Path(pyfile).stem} import *")
110
+ print(fr"✅ Successfully imported `{pyfile}`")
111
+
112
+
113
+ def add_to_path(path_variable: str, directory: str) -> str:
114
+ """
115
+ Generate shell script to add directory to path_variable.
116
+ Handles both Windows (cmd) and Unix-like systems (bash/zsh).
117
+ Checks if variable exists before appending, otherwise creates it.
118
+ """
119
+ system = platform.system()
120
+
121
+ if system == "Windows":
122
+ script = f"""# Check if {path_variable} is defined
123
+ if (Test-Path env:{path_variable}) {{
124
+ Write-Host "Adding {directory} to existing {path_variable}"
125
+ $currentValue = [Environment]::GetEnvironmentVariable("{path_variable}", "User")
126
+ $newValue = "$currentValue;{directory}"
127
+ [Environment]::SetEnvironmentVariable("{path_variable}", $newValue, "User")
128
+ $env:{path_variable} = $newValue
129
+ }} else {{
130
+ Write-Host "Creating new {path_variable} variable"
131
+ [Environment]::SetEnvironmentVariable("{path_variable}", "{directory}", "User")
132
+ $env:{path_variable} = "{directory}"
133
+ }}
134
+ Write-Host "{path_variable} is now: $env:{path_variable}\""""
135
+ return script
136
+ else:
137
+ script = f"""#!/bin/bash
138
+ # Check if {path_variable} is defined and not empty
139
+ if [ -z "${{{path_variable}}}" ]; then
140
+ echo "Creating new {path_variable} variable"
141
+ export {path_variable}="{directory}"
142
+ else
143
+ echo "Adding {directory} to existing {path_variable}"
144
+ export {path_variable}="${{{path_variable}}}:{directory}"
145
+ fi
146
+ echo "{path_variable} is now: ${{{path_variable}}}"
147
+ """
148
+ return script
149
+
@@ -19,6 +19,7 @@ class FireJobArgs:
19
19
  submit_to_cloud: bool = False
20
20
  remote: bool = False
21
21
  module: bool = False
22
+ script: bool = False
22
23
  streamlit: bool = False
23
24
  environment: str = ""
24
25
  holdDirectory: bool = False
@@ -0,0 +1,233 @@
1
+ """Pure Python implementation for fire_jobs route command - no typer dependencies."""
2
+
3
+ from typing import Optional, Callable
4
+ from pathlib import Path
5
+ from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_args_helper import FireJobArgs
6
+
7
+ RandStrFunc = Callable[[int], str]
8
+
9
+
10
+ def route(args: FireJobArgs, fire_args: str) -> None:
11
+ """Route execution based on args configuration."""
12
+ from machineconfig.utils.path_helper import get_choice_file
13
+ from machineconfig.utils.accessories import get_repo_root, randstr
14
+
15
+ choice_file = get_choice_file(args.path, suffixes=None)
16
+ repo_root = get_repo_root(choice_file)
17
+ print(f"💾 Selected file: {choice_file}.\nRepo root: {repo_root}")
18
+
19
+ if args.marimo:
20
+ _handle_marimo(choice_file=choice_file, repo_root=repo_root, randstr_func=randstr)
21
+ return
22
+
23
+ kwargs_dict = _prepare_kwargs(args=args, choice_file=choice_file)
24
+ choice_function = _choose_function(args=args, choice_file=choice_file, kwargs_dict=kwargs_dict)
25
+ if isinstance(choice_function, tuple):
26
+ choice_function, choice_file, kwargs_dict = choice_function
27
+
28
+ command = _build_command(args=args, choice_file=choice_file, choice_function=choice_function, kwargs_dict=kwargs_dict, repo_root=repo_root, fire_args=fire_args, randstr_func=randstr)
29
+ command = _apply_command_modifiers(args=args, command=command, choice_file=choice_file, repo_root=repo_root, randstr_func=randstr)
30
+
31
+ from machineconfig.utils.code import exit_then_run_shell_script
32
+ exit_then_run_shell_script(script=command, strict=False)
33
+
34
+
35
+ def _handle_marimo(choice_file: Path, repo_root: Optional[Path], randstr_func: RandStrFunc) -> None:
36
+ """Handle marimo notebook launch."""
37
+ print(f"🧽 Preparing to launch Marimo notebook for `{choice_file}`...")
38
+ tmp_dir = Path.home().joinpath(f"tmp_results/tmp_scripts/marimo/{choice_file.stem}_{randstr_func(10)}")
39
+ tmp_dir.mkdir(parents=True, exist_ok=True)
40
+ script = f"""
41
+ cd {tmp_dir}
42
+ uv run --python 3.14 --with marimo marimo convert {choice_file} -o marimo_nb.py
43
+ uv run --project {repo_root} --with marimo marimo edit --host 0.0.0.0 marimo_nb.py
44
+ """
45
+ from machineconfig.utils.code import exit_then_run_shell_script
46
+ print(f"🚀 Launching Marimo notebook for `{choice_file}`...")
47
+ exit_then_run_shell_script(script)
48
+
49
+
50
+ def _prepare_kwargs(args: FireJobArgs, choice_file: Path) -> dict[str, object]:
51
+ """Prepare kwargs dict from args."""
52
+ if choice_file.suffix == ".py":
53
+ from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_args_helper import extract_kwargs
54
+ return extract_kwargs(args)
55
+ return {}
56
+
57
+
58
+ def _choose_function(args: FireJobArgs, choice_file: Path, kwargs_dict: dict[str, object]) -> Optional[str] | tuple[Optional[str], Path, dict[str, object]]:
59
+ """Choose function to run, possibly interactively."""
60
+ if args.choose_function:
61
+ from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
62
+ choice_function, choice_file, kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict)
63
+ return (choice_function, choice_file, kwargs_dict)
64
+ return args.function
65
+
66
+
67
+ def _build_command(args: FireJobArgs, choice_file: Path, choice_function: Optional[str], kwargs_dict: dict[str, object], repo_root: Optional[Path], fire_args: str, randstr_func: RandStrFunc) -> str:
68
+ """Build the execution command."""
69
+ if choice_file.suffix == ".py":
70
+ exe_line = _build_python_exe_line(args=args, choice_file=choice_file, repo_root=repo_root)
71
+ choice_file_adjusted = _adjust_choice_file(args=args, choice_file=choice_file, repo_root=repo_root)
72
+
73
+ if args.script or (args.debug and args.choose_function):
74
+ choice_file = _create_import_script(choice_file=choice_file, choice_function=choice_function, kwargs_dict=kwargs_dict, repo_root=repo_root, randstr_func=randstr_func)
75
+ choice_file_adjusted = str(choice_file)
76
+
77
+ return _build_final_command(args=args, exe_line=exe_line, choice_file=choice_file, choice_file_adjusted=choice_file_adjusted, choice_function=choice_function, fire_args=fire_args)
78
+ elif choice_file.suffix in (".ps1", ".sh"):
79
+ return f". {choice_file}"
80
+ elif choice_file.suffix == "":
81
+ return str(choice_file)
82
+ else:
83
+ raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
84
+
85
+
86
+ def _build_python_exe_line(args: FireJobArgs, choice_file: Path, repo_root: Optional[Path]) -> str:
87
+ """Build Python execution line."""
88
+ module_line = "-m" if args.module else ""
89
+ with_project = f"--project {repo_root} " if repo_root is not None else ""
90
+ interactive_line = "-i" if args.interactive else ""
91
+
92
+ if args.interactive:
93
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
94
+ _ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(init_path=choice_file)
95
+ if ipy_profile is None:
96
+ ipy_profile = "default"
97
+ ipython_line = f"--no-banner --profile {ipy_profile} "
98
+ else:
99
+ ipython_line = ""
100
+
101
+ if args.streamlit:
102
+ from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import get_command_streamlit
103
+ interpreter_line = get_command_streamlit(choice_file=choice_file, environment=args.environment, repo_root=repo_root)
104
+ elif args.jupyter:
105
+ interpreter_line = "jupyter-lab"
106
+ else:
107
+ interpreter_line = "python" if not args.interactive else "ipython"
108
+
109
+ return f"uv run {with_project} {interpreter_line} {interactive_line} {module_line} {ipython_line}"
110
+
111
+
112
+ def _adjust_choice_file(args: FireJobArgs, choice_file: Path, repo_root: Optional[Path]) -> str:
113
+ """Adjust choice file path for module mode."""
114
+ if args.module and choice_file.suffix == ".py":
115
+ if repo_root is not None:
116
+ return ".".join(Path(choice_file).relative_to(repo_root).parts).replace(".py", "")
117
+ else:
118
+ return ".".join(Path(choice_file).relative_to(Path.cwd()).parts).replace(".py", "")
119
+ return str(choice_file)
120
+
121
+
122
+ def _create_import_script(choice_file: Path, choice_function: Optional[str], kwargs_dict: dict[str, object], repo_root: Optional[Path], randstr_func: RandStrFunc) -> Path:
123
+ """Create a script that imports the module and calls the function."""
124
+ from machineconfig.scripts.python.helpers.helpers_fire_command.file_wrangler import get_import_module_code, wrap_import_in_try_except
125
+ from machineconfig.utils.meta import lambda_to_python_script
126
+ from machineconfig.utils.code import print_code
127
+
128
+ import_code = get_import_module_code(str(choice_file))
129
+ import_code_robust = lambda_to_python_script(
130
+ lambda: wrap_import_in_try_except(
131
+ import_line=import_code, pyfile=str(choice_file), repo_root=str(repo_root) if repo_root is not None else None
132
+ ),
133
+ in_global=True,
134
+ import_module=False,
135
+ )
136
+ code_printing = lambda_to_python_script(
137
+ lambda: print_code(code=import_code_robust, lexer="python", desc="import as module code"),
138
+ in_global=True, import_module=False
139
+ )
140
+ print(f"🧩 Preparing import code for module import:\n{import_code}")
141
+ if choice_function is not None:
142
+ calling = f"""res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})"""
143
+ else:
144
+ calling = """# No function selected to call. You can add your code here."""
145
+ new_choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/python/{Path(choice_file).parent.name}_{Path(choice_file).stem}_{randstr_func(10)}.py")
146
+ new_choice_file.parent.mkdir(parents=True, exist_ok=True)
147
+ new_choice_file.write_text(import_code_robust + "\n" + code_printing + "\n" + calling, encoding="utf-8")
148
+ return new_choice_file
149
+
150
+
151
+ def _build_final_command(args: FireJobArgs, exe_line: str, choice_file: Path, choice_file_adjusted: str, choice_function: Optional[str], fire_args: str) -> str:
152
+ """Build the final command string."""
153
+ if args.debug:
154
+ import platform
155
+ if platform.system() == "Windows":
156
+ return f"{exe_line} -m ipdb {choice_file_adjusted} "
157
+ elif platform.system() in ["Linux", "Darwin"]:
158
+ return f"{exe_line} -m pudb {choice_file_adjusted} "
159
+ else:
160
+ raise NotImplementedError(f"Platform {platform.system()} not supported.")
161
+ elif args.module:
162
+ return f"{exe_line} {choice_file_adjusted} "
163
+ elif choice_function is not None and choice_file.suffix == ".py":
164
+ return f"{exe_line} -m fire {choice_file_adjusted} {choice_function} {fire_args}"
165
+ elif args.streamlit:
166
+ if args.holdDirectory:
167
+ return f"{exe_line} {choice_file}"
168
+ else:
169
+ return f"cd {choice_file.parent}\n{exe_line} {choice_file.name}\ncd {Path.cwd()}"
170
+ elif args.cmd:
171
+ return rf""" cd /d {choice_file.parent} & {exe_line} {choice_file.name} """
172
+ elif choice_file.suffix == "":
173
+ return f"{exe_line} {choice_file} {fire_args}"
174
+ else:
175
+ return f"{exe_line} {choice_file} "
176
+
177
+
178
+ def _apply_command_modifiers(args: FireJobArgs, command: str, choice_file: Path, repo_root: Optional[Path], randstr_func: RandStrFunc) -> str:
179
+ """Apply various command modifiers based on args."""
180
+ from rich.panel import Panel
181
+ from rich.console import Console
182
+ from rich.syntax import Syntax
183
+
184
+ console = Console()
185
+
186
+ if args.cmd:
187
+ new_line = "\n"
188
+ command = rf"""start cmd -Argument "/k {command.replace(new_line, " & ")} " """
189
+
190
+ if args.submit_to_cloud:
191
+ command = f"""uv run python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
192
+ if args.function is not None:
193
+ command += f"--function {args.function} "
194
+
195
+ if args.optimized:
196
+ command = command.replace("python ", "python -OO ")
197
+
198
+ if args.zellij_tab is not None:
199
+ comman_path__ = Path.home().joinpath(f"tmp_results/tmp_scripts/zellij_commands/{choice_file.stem}_{randstr_func(10)}.sh")
200
+ comman_path__.parent.mkdir(parents=True, exist_ok=True)
201
+ comman_path__.write_text(command, encoding="utf-8")
202
+ console.print(Panel(Syntax(command, lexer="shell"), title=f"🔥 fire command @ {comman_path__}: "), style="bold red")
203
+ import subprocess
204
+
205
+ existing_tab_names = subprocess.run(["zellij", "action", "query-tab-names"], capture_output=True, text=True, check=True).stdout.splitlines()
206
+ if args.zellij_tab in existing_tab_names:
207
+ print(f"⚠️ Tab name `{args.zellij_tab}` already exists. Please choose a different name.")
208
+ args.zellij_tab += f"_{randstr_func(3)}"
209
+ from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
210
+
211
+ command = run_command_in_zellij_tab(command=str(comman_path__), tab_name=args.zellij_tab, cwd=None)
212
+
213
+ if args.watch:
214
+ command = "watchexec --restart --exts py,sh,ps1 " + command
215
+
216
+ if args.git_pull:
217
+ command = f"\ngit -C {choice_file.parent} pull\n" + command
218
+
219
+ if args.PathExport:
220
+ from machineconfig.scripts.python.helpers.helpers_fire_command.file_wrangler import add_to_path
221
+ export_line = add_to_path(path_variable="PYTHONPATH", directory=str(repo_root))
222
+ command = export_line + "\n" + command
223
+
224
+ if args.loop:
225
+ import platform
226
+ if platform.system() in ["Linux", "Darwin"]:
227
+ command = command + "\nsleep 0.5"
228
+ elif platform.system() == "Windows":
229
+ command = "$ErrorActionPreference = 'SilentlyContinue';\n" + command + "\nStart-Sleep -Seconds 0.5"
230
+ else:
231
+ raise NotImplementedError(f"Platform {platform.system()} not supported.")
232
+
233
+ return command