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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -1,33 +1,56 @@
1
1
 
2
- from pathlib import Path
3
- from typing import Optional, Literal
2
+ from typing import Optional, Literal, Annotated
4
3
  import typer
5
4
 
6
5
 
7
- def balance_load(layout_path: Path = typer.Argument(..., help="Path to the layout.json file"),
8
- max_thresh: int = typer.Option(..., help="Maximum tabs per layout"),
9
- thresh_type: Literal['number', 'weight'] = typer.Option(..., help="Threshold type"),
10
- breaking_method: Literal['moreLayouts', 'combineTabs'] = typer.Option(..., help="Breaking method"),
11
- output_path: Optional[Path] = typer.Option(None, help="Path to write the adjusted layout.json file")):
6
+ def balance_load(layout_path: Annotated[str, typer.Argument(..., help="Path to the layout.json file")],
7
+ max_thresh: Annotated[int, typer.Option(..., "--max-threshold", "-m", help="Maximum tabs per layout")],
8
+ thresh_type: Annotated[Literal['number', 'n', 'weight', 'w'], typer.Option(..., "--threshold-type", "-t", help="Threshold type")],
9
+ breaking_method: Annotated[Literal['moreLayouts', 'ml', 'combineTabs', 'ct'], typer.Option(..., "--breaking-method", "-b", help="Breaking method")],
10
+ output_path: Annotated[Optional[str], typer.Option(..., "--output-path", "-o", help="Path to write the adjusted layout.json file")] = None):
12
11
  """Adjust layout file to limit max tabs per layout, etc."""
12
+ thresh_type_resolved: dict[str, Literal['number', 'weight']] = {
13
+ 'number': 'number',
14
+ 'n': 'number',
15
+ 'weight': 'weight',
16
+ 'w': 'weight'
17
+ }
18
+ breaking_method_resolved: dict[str, Literal['moreLayouts', 'combineTabs']] = {
19
+ 'moreLayouts': 'moreLayouts',
20
+ 'ml': 'moreLayouts',
21
+ 'combineTabs': 'combineTabs',
22
+ 'ct': 'combineTabs'
23
+ }
24
+ from pathlib import Path
25
+ layout_path_obj = Path(layout_path).expanduser().absolute()
26
+
13
27
  from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
14
28
  import json
15
- layoutfile: LayoutsFile = json.loads(layout_path.read_text())
29
+ layoutfile: LayoutsFile = json.loads(layout_path_obj.read_text())
16
30
  layout_configs = layoutfile["layouts"]
17
31
  from machineconfig.cluster.sessions_managers.utils.load_balancer import limit_tab_num
18
- new_layouts = limit_tab_num(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=thresh_type, breaking_method=breaking_method)
32
+ new_layouts = limit_tab_num(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=thresh_type_resolved[thresh_type], breaking_method=breaking_method_resolved[breaking_method])
19
33
  layoutfile["layouts"] = new_layouts
20
- target_file = output_path if output_path is not None else layout_path.parent / f'{layout_path.stem}_adjusted_{max_thresh}_{thresh_type}_{breaking_method}.json'
34
+ target_file = Path(output_path) if output_path is not None else layout_path_obj.parent / f'{layout_path_obj.stem}_adjusted_{max_thresh}_{thresh_type}_{breaking_method}.json'
21
35
  target_file.parent.mkdir(parents=True, exist_ok=True)
22
36
  target_file.write_text(data=json.dumps(layoutfile, indent=4), encoding="utf-8")
23
37
  typer.echo(f"Adjusted layout saved to {target_file}")
24
38
 
25
39
 
26
- def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list[str]], select_interactively: bool) -> list["LayoutConfig"]:
40
+ def select_layout(layouts_json_file: str, selected_layouts_names: Optional[list[str]], select_interactively: bool,
41
+ subsitute_home: bool
42
+ ) -> list["LayoutConfig"]:
27
43
  import json
28
44
  from machineconfig.utils.options import choose_from_options
29
- from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig, LayoutsFile
30
- layout_file: LayoutsFile = json.loads(layouts_json_file.read_text(encoding="utf-8"))
45
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
46
+ from pathlib import Path
47
+ json_str = Path(layouts_json_file).read_text(encoding="utf-8")
48
+ if subsitute_home:
49
+ json_str = json_str.replace("~", str(Path.home())).replace("$HOME", str(Path.home()))
50
+ json_str = json_str.replace("""Command": "f """, """Command": "~/.config/machineconfig/scripts/wrap_mcfg fire """)
51
+ json_str = json_str.replace("""Command": "s """, """Command": "~/.config/machineconfig/scripts/wrap_mcfg sessions """)
52
+
53
+ layout_file: LayoutsFile = json.loads(json_str)
31
54
  if len(layout_file["layouts"]) == 0:
32
55
  raise ValueError(f"No layouts found in {layouts_json_file}")
33
56
  if selected_layouts_names is None: # choose all, or interactively
@@ -35,7 +58,7 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
35
58
  return layout_file["layouts"]
36
59
  options = [layout["layoutName"] for layout in layout_file["layouts"]]
37
60
  from machineconfig.utils.options import choose_from_options
38
- selected_layouts_names = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:", fzf=True, msg="Choose one option")
61
+ selected_layouts_names = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:", tv=True, msg="Choose one option")
39
62
  print(f"Selected layout(s): {selected_layouts_names}")
40
63
  # Extract the configs from the names:
41
64
  layouts_chosen: list[LayoutConfig] = []
@@ -50,35 +73,36 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
50
73
  return layouts_chosen
51
74
 
52
75
 
53
- def find_layout_file(layout_path: str, ) -> Path:
54
- from machineconfig.utils.path_extended import PathExtended
55
- from machineconfig.scripts.python.helpers.helpers4 import search_for_files_of_interest
76
+ def find_layout_file(layout_path: str, ) -> str:
77
+ from machineconfig.utils.path_helper import search_for_files_of_interest
56
78
  from machineconfig.utils.options import choose_from_options
57
79
  from machineconfig.utils.path_helper import match_file_name, sanitize_path
80
+ from pathlib import Path
58
81
  path_obj = sanitize_path(layout_path)
59
82
  if not path_obj.exists():
60
- choice_file = match_file_name(sub_string=layout_path, search_root=PathExtended.cwd(), suffixes={".json"})
83
+ choice_file = match_file_name(sub_string=layout_path, search_root=Path.cwd(), suffixes={".json"})
61
84
  elif path_obj.is_dir():
62
85
  print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
63
- files = search_for_files_of_interest(path_obj)
86
+ files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
64
87
  print(f"🔍 Got #{len(files)} results.")
65
- choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
66
- choice_file = PathExtended(choice_file)
88
+ choice_file = choose_from_options(multi=False, options=files, tv=True, msg="Choose one option")
89
+ choice_file = Path(choice_file).expanduser().absolute()
67
90
  else:
68
91
  choice_file = path_obj
69
- return choice_file
70
-
71
-
72
- def launch(ctx: typer.Context,
73
- layout_path: Optional[str] = typer.Argument(None, help="Path to the layout.json file"),
74
- max_tabs: int = typer.Option(10, help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch."),
75
- max_layouts: int = typer.Option(10, help="A Sanity checker that throws an error if the total number of layouts exceeds this number."),
76
- sleep_inbetween: float = typer.Option(1.0, help="Sleep time in seconds between launching layouts"),
77
- monitor: bool = typer.Option(False, "--monitor", "-m", help="Monitor the layout sessions for completion"),
78
- parallel: bool = typer.Option(False, "--parallel", "-p", help="Launch multiple layouts in parallel"),
79
- kill_upon_completion: bool = typer.Option(False, "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)"),
80
- choose: Optional[str] = typer.Option(None, "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed"),
81
- choose_interactively: bool = typer.Option(False, "--choose-interactively", "-ia", help="Select layouts interactively")
92
+ return str(choice_file)
93
+
94
+
95
+ def run(ctx: typer.Context,
96
+ layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
97
+ max_tabs: Annotated[int, typer.Option(..., "--max-tabs", "-mt", help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
98
+ max_layouts: Annotated[int, typer.Option(..., "--max-layouts", "-ml", help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
99
+ sleep_inbetween: Annotated[float, typer.Option(..., "--sleep-inbetween", "-si", help="Sleep time in seconds between launching layouts")] = 1.0,
100
+ monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
101
+ parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
102
+ kill_upon_completion: Annotated[bool, typer.Option(..., "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)")] = False,
103
+ choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
104
+ choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-i", help="Select layouts interactively")] = False,
105
+ subsitute_home: Annotated[bool, typer.Option(..., "--substitute-home", "-sh", help="Substitute ~ and $HOME in layout file with actual home directory path")] = False,
82
106
  ):
83
107
  """
84
108
  Launch terminal sessions based on a layout configuration file.
@@ -87,10 +111,10 @@ def launch(ctx: typer.Context,
87
111
  typer.echo(ctx.get_help())
88
112
  raise typer.Exit()
89
113
  layout_path_resolved = find_layout_file(layout_path=layout_path)
90
- layouts_selected = select_layout(layouts_json_file=layout_path_resolved, selected_layouts_names=choose.split(",") if choose else None, select_interactively=choose_interactively)
114
+ layouts_selected = select_layout(layouts_json_file=layout_path_resolved, selected_layouts_names=choose.split(",") if choose else None, select_interactively=choose_interactively, subsitute_home=subsitute_home)
91
115
 
92
116
  # ============= Basic sanity checks =============
93
- if len(layouts_selected) > max_layouts:
117
+ if parallel and len(layouts_selected) > max_layouts:
94
118
  raise ValueError(f"Number of layouts {len(layouts_selected)} exceeds the maximum allowed {max_layouts}. Please adjust your layout file.")
95
119
  for a_layout in layouts_selected:
96
120
  if len(a_layout["layoutTabs"]) > max_tabs:
@@ -99,7 +123,6 @@ def launch(ctx: typer.Context,
99
123
  if not confirm:
100
124
  typer.echo("Aborting launch.")
101
125
  raise typer.Exit(0)
102
-
103
126
  import time
104
127
  import platform
105
128
  if platform.system() == "Linux" or platform.system() == "Darwin":
@@ -132,15 +155,66 @@ def launch(ctx: typer.Context,
132
155
  print(f"❌ Unsupported platform: {platform.system()}")
133
156
 
134
157
 
135
- def main_from_parser():
136
- layouts_app = typer.Typer(help="Layouts management subcommands")
137
- layouts_app.command("run")(launch)
138
- layouts_app.command("balance-load")(balance_load)
139
- import sys
140
- if len(sys.argv) == 1:
141
- layouts_app(["--help"])
158
+ def create_template(name: Annotated[Optional[str], typer.Argument(..., help="Name of the layout template to create")] = None,
159
+ num_tabs: Annotated[int, typer.Option(..., "--num-tabs", "-t", help="Number of tabs to include in the template")] = 3,
160
+ ):
161
+ """Create a layout template file."""
162
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile, TabConfig
163
+ from pathlib import Path
164
+ tabs: list[TabConfig] = []
165
+ for i in range(1, num_tabs + 1):
166
+ tab: TabConfig = {
167
+ "tabName": f"Tab{i}",
168
+ "startDir": "~/" + str(Path.cwd().relative_to(Path.home())),
169
+ "command": "bash",
170
+ }
171
+ tabs.append(tab)
172
+ layouts: list[LayoutConfig] = [
173
+ {
174
+ "layoutName": f"{Path.cwd().name}Layout",
175
+ "layoutTabs": tabs,
176
+ }
177
+ ]
178
+ file: LayoutsFile = {
179
+ "$schema": "https://bit.ly/cfglayout", # type: ignore
180
+ "version": "0.1",
181
+ "layouts": layouts
182
+ }
183
+ import json
184
+ json_string = json.dumps(file, indent=4)
185
+ if name is None:
186
+ layout_path = Path.cwd() / "layout.json"
142
187
  else:
143
- layouts_app()
188
+ layout_path = Path.cwd() / (name.replace(".json", "") + ".json")
189
+ layout_path.parent.mkdir(parents=True, exist_ok=True)
190
+ if layout_path.exists():
191
+ print(f"❌ File {layout_path} already exists. Aborting to avoid overwriting.")
192
+ return
193
+ layout_path.write_text(json_string, encoding="utf-8")
194
+ print(f"✅ Created layout template at {layout_path}")
195
+
196
+
197
+ def get_app():
198
+ layouts_app = typer.Typer(help="Layouts management subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
199
+ from machineconfig.scripts.python.helpers_sessions.sessions_multiprocess import create_from_function
200
+
201
+ layouts_app.command("create-from-function", no_args_is_help=True, help="[c] Create a layout from a function")(create_from_function)
202
+ layouts_app.command("c", no_args_is_help=True, help="Create a layout from a function", hidden=True)(create_from_function)
203
+
204
+ layouts_app.command("run", no_args_is_help=True, help="[r] Run the selected layout(s)")(run)
205
+ layouts_app.command("r", no_args_is_help=True, help="Run the selected layout(s)", hidden=True)(run)
206
+
207
+ layouts_app.command("balance-load", no_args_is_help=True, help="[b] Balance the load across sessions")(balance_load)
208
+ layouts_app.command("b", no_args_is_help=True, help="Balance the load across sessions", hidden=True)(balance_load)
209
+
210
+ layouts_app.command("create-template", no_args_is_help=False, help="[t] Create a layout template file")(create_template)
211
+ layouts_app.command("t", no_args_is_help=False, help="Create a layout template file", hidden=True)(create_template)
212
+ return layouts_app
213
+
214
+
215
+ def main():
216
+ layouts_app = get_app()
217
+ layouts_app()
144
218
 
145
219
 
146
220
  if __name__ == "__main__":
@@ -0,0 +1,133 @@
1
+
2
+ import typer
3
+ from typing import Annotated, Optional
4
+
5
+
6
+ def strip_ansi_codes(text: str) -> str:
7
+ """Remove ANSI color codes from text."""
8
+ import re
9
+ return re.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', text)
10
+
11
+
12
+ def choose_zellij_session(
13
+ name: Annotated[Optional[str], typer.Argument(help="Name of the Zellij session to attach to. If not provided, a list will be shown to choose from.")] = None,
14
+ new_session: Annotated[bool, typer.Option("--new-session", "-n", help="Create a new Zellij session instead of attaching to an existing one.", show_default=True)] = False,
15
+ kill_all: Annotated[bool, typer.Option("--kill-all", "-k", help="Kill all existing Zellij sessions before creating a new one.", show_default=True)] = False):
16
+ if name is not None:
17
+ result = f"zellij attach {name}"
18
+ from machineconfig.utils.code import exit_then_run_shell_script
19
+ exit_then_run_shell_script(result, strict=True)
20
+
21
+ if new_session:
22
+ cmd = """
23
+ zellij --layout st2
24
+ """
25
+ if kill_all:
26
+ cmd = f"""zellij kill-sessions
27
+ {cmd}"""
28
+ from machineconfig.utils.code import exit_then_run_shell_script
29
+ exit_then_run_shell_script(script=cmd, strict=True)
30
+ typer.Exit()
31
+ return
32
+ cmd = "zellij list-sessions"
33
+ import subprocess
34
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
35
+ # filter out empty lines and keep raw lines (they contain creation info)
36
+ sessions = [s for s in sessions if s.strip()]
37
+ sessions.sort(key=lambda s: "EXITED" in s)
38
+
39
+ if "current" in sessions:
40
+ print("Already in a Zellij session, avoiding nesting and exiting.")
41
+ raise typer.Exit()
42
+ if len(sessions) == 0:
43
+ print("No Zellij sessions found, creating a new one.")
44
+ result = """zellij --layout st2"""
45
+ elif len(sessions) == 1:
46
+ session_name = sessions[0].split(" [Created")[0]
47
+ print(f"Only one Zellij session found: {session_name}, attaching to it.")
48
+ result = f"zellij attach {session_name}"
49
+ else:
50
+ from machineconfig.utils.options import choose_from_options
51
+ # Artificially inject a "NEW SESSION" option so the user can create one from the list
52
+ NEW_SESSION_LABEL = "NEW SESSION"
53
+ options = [NEW_SESSION_LABEL] + sessions
54
+ session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
55
+ if session_name == NEW_SESSION_LABEL:
56
+ cmd = "zellij --layout st2"
57
+ if kill_all:
58
+ cmd = f"zellij kill-sessions\n{cmd}"
59
+ from machineconfig.utils.code import exit_then_run_shell_script
60
+ exit_then_run_shell_script(cmd, strict=True)
61
+ raise typer.Exit()
62
+ session_name = session_name.split(" [Created")[0]
63
+ result = f"zellij attach {session_name}"
64
+ from machineconfig.utils.code import exit_then_run_shell_script
65
+ exit_then_run_shell_script(result, strict=True)
66
+
67
+
68
+
69
+ def get_session_tabs() -> list[tuple[str, str]]:
70
+ cmd = "zellij list-sessions"
71
+ import subprocess
72
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
73
+ sessions = [strip_ansi_codes(s) for s in sessions]
74
+ active_sessions = [s for s in sessions if "EXITED" not in s]
75
+ result: list[tuple[str, str]] = []
76
+ for session_line in active_sessions:
77
+ session_name = session_line.split(" [Created")[0].strip()
78
+ # Query tab names for the session
79
+ tab_cmd = f"zellij --session {session_name} action query-tab-names"
80
+ try:
81
+ tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
82
+ for tab in tabs:
83
+ if tab.strip():
84
+ result.append((session_name, tab.strip()))
85
+ except subprocess.CalledProcessError:
86
+ # Skip if query fails
87
+ continue
88
+ print(result)
89
+ return result
90
+
91
+
92
+ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
93
+ from pathlib import Path
94
+ layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
95
+ if not layouts_file.exists():
96
+ typer.echo(f"❌ Layouts file not found: {layouts_file}")
97
+ # available
98
+ raise typer.Exit(code=1)
99
+ import json
100
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
101
+ layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
102
+ chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
103
+ if not chosen_layout:
104
+ typer.echo(f"❌ Layout '{layout_name}' not found in layouts file.")
105
+ available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
106
+ typer.echo(f"Available layouts: {', '.join(available_layouts)}")
107
+ raise typer.Exit(code=1)
108
+ from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
109
+ run_wt_layout(layout_config=chosen_layout)
110
+ # cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
111
+ # from machineconfig.utils.code import exit_then_run_shell_script
112
+ # exit_then_run_shell_script(cmd, strict=True)
113
+
114
+
115
+ def get_app():
116
+ app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=False)
117
+ app.command(name="attach-to-zellij", no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
118
+ app.command(name="z", hidden=True, no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
119
+
120
+ app.command(name="start-wt", no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
121
+ app.command(name="w", hidden=True, no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
122
+
123
+ app.command(name="get-session-tabs", no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
124
+ app.command(name="zt", hidden=True, no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
125
+ return app
126
+
127
+ def main():
128
+ app = get_app()
129
+ app()
130
+
131
+
132
+ if __name__ == "__main__":
133
+ main()
@@ -0,0 +1,64 @@
1
+ from machineconfig.scripts.python.helpers_devops.cli_utils import merge_pdfs, compress_pdf
2
+ from machineconfig.scripts.python.helpers_utils.path import edit_file_with_hx, get_machine_specs, init_project, tui_env
3
+ from machineconfig.scripts.python.helpers_utils.download import download
4
+ import typer
5
+ from typing import Annotated
6
+
7
+
8
+ def kill_process(
9
+ # name: Annotated[Optional[str], typer.Option(..., "--name", "-n", help="Name of the process to kill")],
10
+ # command: Annotated[str, typer.Option(..., "--command", "-c", help="Match by command line instead of process name")] = "",
11
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactively choose the process to kill")] = True):
12
+ from machineconfig.utils.procs import main, ProcessManager
13
+ if interactive:
14
+ main()
15
+ return
16
+ _ = ProcessManager
17
+ # pm = ProcessManager()
18
+ # if command:
19
+ # pm.filter_and_kill(name=command
20
+ # )
21
+
22
+
23
+ def upgrade_packages():
24
+ from machineconfig.utils.upgrade_packages import generate_uv_add_commands
25
+ from pathlib import Path
26
+ generate_uv_add_commands(pyproject_path=Path.cwd() / "pyproject.toml", output_path=Path.cwd() / "pyproject_init.sh")
27
+
28
+
29
+ def get_app() -> typer.Typer:
30
+ app = typer.Typer(help="🛠️ utilities operations", no_args_is_help=True, add_help_option=False, add_completion=False)
31
+ app.command(name="kill-process", no_args_is_help=False, help="⚔️ [k] Choose a process to kill")(kill_process)
32
+ app.command(name="k", no_args_is_help=False, help="Choose a process to kill", hidden=True)(kill_process)
33
+
34
+ app.command("environment", no_args_is_help=False, help="📚 [v] NAVIGATE ENV/PATH variable with TUI")(tui_env)
35
+ app.command("v", no_args_is_help=False, help="NAVIGATE ENV/PATH variable with TUI", hidden=True)(tui_env)
36
+
37
+ app.command(name="upgrade-packages", no_args_is_help=False, help="⬆️ [up] Upgrade project dependencies.")(upgrade_packages)
38
+ app.command(name="up", no_args_is_help=False, hidden=True)(upgrade_packages)
39
+
40
+ app.command(name="download", no_args_is_help=True, help="⬇️ [d] Download a file from a URL and optionally decompress it.")(download)
41
+ app.command(name="d", no_args_is_help=True, hidden=True)(download)
42
+ app.command(name="get-machine-specs", no_args_is_help=False, help="💻 [g] Get machine specifications.")(get_machine_specs)
43
+ app.command(name="g", no_args_is_help=False, hidden=True)(get_machine_specs)
44
+ app.command(name="init-project", no_args_is_help=False, help="🚀 [i] Initialize a project with a uv virtual environment and install dev packages.")(init_project)
45
+ app.command(name="i", no_args_is_help=False, hidden=True)(init_project)
46
+ app.command(name="edit", no_args_is_help=False, help="✏️ [e] Open a file in the default editor.")(edit_file_with_hx)
47
+ app.command(name="e", no_args_is_help=False, hidden=True)(edit_file_with_hx)
48
+
49
+ app.command(name="pdf-merge", no_args_is_help=True, help="📄 [pm] Merge two PDF files into one.")(merge_pdfs)
50
+ app.command(name="pm", no_args_is_help=True, hidden=True)(merge_pdfs)
51
+ app.command(name="pdf-compress", no_args_is_help=True, help="📦 [pc] Compress a PDF file.")(compress_pdf)
52
+ app.command(name="pc", no_args_is_help=True, hidden=True)(compress_pdf)
53
+
54
+ # app.command(name="copy", no_args_is_help=True, help="[c] Copy files or directories.")(copy)
55
+ # app.command(name="c", no_args_is_help=True, hidden=True)(copy)
56
+
57
+ return app
58
+
59
+ # def func():
60
+ # import pycr
61
+
62
+ def main():
63
+ app = get_app()
64
+ app()
@@ -0,0 +1,92 @@
1
+
2
+ <#
3
+ .SYNOPSIS
4
+ Restores a Thunderbird profile from a backup.
5
+
6
+ .DESCRIPTION
7
+ This script automates the restoration of a Thunderbird profile. It finds the
8
+ default backup profile located in ~/.thunderbird and copies its contents to
9
+ the active Thunderbird profile folder in AppData/Roaming.
10
+
11
+ WARNING: This script will overwrite the current active Thunderbird profile.
12
+ Ensure Thunderbird is closed before running.
13
+ #>
14
+
15
+ # --- Configuration ---
16
+ $ErrorActionPreference = "Stop"
17
+
18
+ # --- Script ---
19
+
20
+ # 1. Define the root paths for backup and active profiles
21
+ $thunderbirdBackupRoot = "$env:USERPROFILE\.thunderbird"
22
+ $thunderbirdAppdataRoot = "$env:APPDATA\Thunderbird"
23
+
24
+ Write-Host "Thunderbird Profile Restore Script"
25
+ Write-Host "-----------------------------------"
26
+
27
+ # 2. Find the default profile path from the backup's profiles.ini
28
+ try {
29
+ $backupIniPath = Join-Path $thunderbirdBackupRoot "profiles.ini"
30
+ $backupProfileRelativePath = (Get-Content $backupIniPath | Select-String -Pattern '^Path=' | Select-Object -First 1) -replace '^Path=', ''
31
+ $backupProfileFullPath = Join-Path $thunderbirdBackupRoot $backupProfileRelativePath
32
+ Write-Host "Found backup profile: $backupProfileFullPath" -ForegroundColor Green
33
+ }
34
+ catch {
35
+ Write-Error "Could not find or read the backup profiles.ini at '$backupIniPath'."
36
+ exit 1
37
+ }
38
+
39
+ # 3. Find the default profile path from the active installation's profiles.ini
40
+ try {
41
+ $activeIniPath = Join-Path $thunderbirdAppdataRoot "profiles.ini"
42
+ $activeProfileRelativePath = (Get-Content $activeIniPath | Select-String -Pattern '^Path=' | Select-Object -First 1) -replace '^Path=', ''
43
+ $activeProfileFullPath = Join-Path $thunderbirdAppdataRoot $activeProfileRelativePath
44
+ Write-Host "Found active profile: $activeProfileFullPath" -ForegroundColor Green
45
+ }
46
+ catch {
47
+ Write-Error "Could not find or read the active profiles.ini at '$activeIniPath'."
48
+ exit 1
49
+ }
50
+
51
+ # 4. Safety Check: Confirm both profile paths exist
52
+ if (-not (Test-Path -Path $backupProfileFullPath -PathType Container)) {
53
+ Write-Error "Backup profile directory does not exist: $backupProfileFullPath"
54
+ exit 1
55
+ }
56
+ if (-not (Test-Path -Path $activeProfileFullPath -PathType Container)) {
57
+ Write-Error "Active profile directory does not exist: $activeProfileFullPath"
58
+ exit 1
59
+ }
60
+
61
+ # 5. CRITICAL: Get user confirmation before proceeding
62
+ Write-Warning "This will completely overwrite the profile at '$activeProfileFullPath' with the contents of the backup."
63
+ $confirmation = Read-Host "Are you absolutely sure you want to continue? (y/n)"
64
+
65
+ if ($confirmation -ne 'y') {
66
+ Write-Host "Operation cancelled by user." -ForegroundColor Yellow
67
+ exit 0
68
+ }
69
+
70
+ # 6. Ensure Thunderbird is not running
71
+ Write-Host "Checking for running Thunderbird process..."
72
+ $thunderbirdProcess = Get-Process thunderbird -ErrorAction SilentlyContinue
73
+ if ($thunderbirdProcess) {
74
+ Write-Host "Closing Thunderbird to prevent file conflicts..."
75
+ Stop-Process -InputObject $thunderbirdProcess -Force
76
+ Start-Sleep -Seconds 3 # Give it a moment to close gracefully
77
+ } else {
78
+ Write-Host "Thunderbird is not running. Good."
79
+ }
80
+
81
+ # 7. Copy the backup profile to the active profile directory using robocopy
82
+ Write-Host "Starting profile restoration... (This may take a while)"
83
+ try {
84
+ robocopy $backupProfileFullPath $activeProfileFullPath /MIR /E /IS /IT /NFL /NDL /NJH /NJS /nc /ns /np
85
+ Write-Host "Profile restoration complete!" -ForegroundColor Green
86
+ Write-Host "You can now start Thunderbird."
87
+ }
88
+ catch {
89
+ Write-Error "An error occurred during the file copy operation."
90
+ exit 1
91
+ }
92
+
@@ -17,10 +17,8 @@ $sharePath=''
17
17
  $driveLetter=''
18
18
  $options = "rw,sec=sys,no_subtree_check"
19
19
 
20
- # . activate_ve
21
- . $HOME/code/machineconfig/.venv/Scripts/activate.ps1
22
20
 
23
- python -m machineconfig.scripts.python.mount_nfs
21
+ uv run python -m machineconfig.scripts.python.mount_nfs
24
22
  . $HOME/tmp_results/shells/python_return_command.ps1
25
23
 
26
24
  # Configure NFS server
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.13 --no-dev --project $HOME/code/machineconfig python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=7.98" python -m machineconfig.scripts.python.mount_ssh
11
11
 
12
12
  net use T: \\sshfs.kr\$user@$host.local
13
13
  # this worked: net use T: \\sshfs\alex@alex-p51s-5.local
@@ -4,12 +4,6 @@ $Path = $HOME + '\data\share_smb'
4
4
 
5
5
  Get-SmbShare
6
6
 
7
-
8
- #. activate_ve
9
- #python -m machineconfig.scripts.python.share_smb
10
- #. $HOME/tmp_results/shells/python_return_command.ps1
11
-
12
- # make $path dir if it does not exist
13
7
  if (!(Test-Path -Path $Path)) {
14
8
  New-Item -ItemType Directory -Path $Path
15
9
  }
@@ -0,0 +1,63 @@
1
+ function wrap_in_shell_script {
2
+ param(
3
+ [Parameter(Mandatory=$true)]
4
+ [string]$Command,
5
+
6
+ [Parameter(ValueFromRemainingArguments=$true)]
7
+ [string[]]$Arguments
8
+ )
9
+
10
+ # Generate a random name (based on current timestamp hashed with SHA256)
11
+ # Compute SHA256 of the timestamp string (don't pipe the string to Get-FileHash
12
+ # because that attempts to treat the input as a path). Take the first 16 hex
13
+ # chars as the random name.
14
+ $ts = Get-Date -Format o
15
+ try {
16
+ $sha = [System.Security.Cryptography.SHA256]::Create()
17
+ $bytes = [System.Text.Encoding]::UTF8.GetBytes($ts)
18
+ $hashBytes = $sha.ComputeHash($bytes)
19
+ $hash = [System.BitConverter]::ToString($hashBytes).Replace("-", "").ToLower()
20
+ $randomName = $hash.Substring(0, 16)
21
+ } finally {
22
+ if ($sha) { $sha.Dispose() }
23
+ }
24
+
25
+ # Define the output path
26
+ $env:OP_PROGRAM_PATH = "$HOME/tmp_results/tmp_scripts/machineconfig/${randomName}.ps1"
27
+
28
+ # Run the specified command with its arguments
29
+ & $Command @Arguments
30
+
31
+ # Check if the file exists
32
+ if (Test-Path $env:OP_PROGRAM_PATH) {
33
+ Write-Host "🚀 Taking over from python script @ $env:OP_PROGRAM_PATH"
34
+ try {
35
+ bat --style=full --theme=OneHalfDark --paging=never "$env:OP_PROGRAM_PATH"
36
+ } catch {
37
+ # Write-Host "⚠️ Warning: Failed to display script content with 'bat'. Proceeding to execute the script."
38
+ Write-Host " "
39
+ }
40
+ & $env:OP_PROGRAM_PATH
41
+ # Write-Host "✅ '$Command' execution completed."
42
+
43
+ } else {
44
+ # Write-Host "✅ '$Command' execution completed."
45
+ Write-Host " "
46
+ }
47
+
48
+ # Clean up the temporary environment variable so it doesn't leak to other processes/sessions
49
+ try {
50
+ Remove-Item Env:\OP_PROGRAM_PATH -ErrorAction SilentlyContinue
51
+ } catch {
52
+ # best-effort cleanup; ignore any errors
53
+ }
54
+
55
+ # Also explicitly clear the variable in the current process
56
+ $env:OP_PROGRAM_PATH = $null
57
+ }
58
+
59
+ # Call the function with any arguments passed to the script
60
+ if ($args.Count -gt 0) {
61
+ wrap_in_shell_script @args
62
+ }
63
+
@@ -1,7 +1,5 @@
1
1
  #!/bin/bash
2
- #=======================================================================
3
2
  # 🌳 BROOT SHELL INTEGRATION 🌳
4
- #=======================================================================
5
3
  # This script was automatically generated by the broot program
6
4
  # More information can be found in https://github.com/Canop/broot
7
5
  #
@@ -40,7 +38,6 @@ function br {
40
38
  fi
41
39
  }
42
40
 
43
- #=======================================================================
44
41
  # ℹ️ USAGE:
45
42
  # br [options]
46
43
  #
@@ -48,4 +45,3 @@ function br {
48
45
  # br # Open broot in the current directory
49
46
  # br /path/to/dir # Open broot in the specified directory
50
47
  # br -h # Show broot help
51
- #=======================================================================
@@ -2,4 +2,4 @@
2
2
 
3
3
  terminal_title = "{file} 🐄"
4
4
 
5
- capture_mouse: false
5
+ capture_mouse = false