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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (331) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +26 -20
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  26. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  27. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  28. machineconfig/logger.py +1 -1
  29. machineconfig/profile/create_helper.py +21 -10
  30. machineconfig/profile/create_links.py +77 -20
  31. machineconfig/profile/create_links_export.py +63 -58
  32. machineconfig/profile/create_shell_profile.py +14 -0
  33. machineconfig/profile/mapper_data.toml +45 -0
  34. machineconfig/profile/mapper_dotfiles.toml +249 -0
  35. machineconfig/scripts/python/agents.py +76 -171
  36. machineconfig/scripts/python/ai/initai.py +3 -1
  37. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  38. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  39. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  40. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  42. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  44. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  46. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  47. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  48. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  49. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  50. machineconfig/scripts/python/cloud.py +58 -11
  51. machineconfig/scripts/python/croshell.py +4 -155
  52. machineconfig/scripts/python/devops.py +57 -38
  53. machineconfig/scripts/python/devops_navigator.py +17 -3
  54. machineconfig/scripts/python/fire_jobs.py +10 -193
  55. machineconfig/scripts/python/ftpx.py +5 -224
  56. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  57. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  58. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  59. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  62. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  64. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  65. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  70. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  71. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  72. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  75. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  76. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  77. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  78. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  79. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  80. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  85. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_nw.py +69 -82
  86. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +47 -22
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  89. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  98. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  99. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  100. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  101. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  102. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  103. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  104. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  105. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  106. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +1 -1
  107. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  108. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  109. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  110. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  111. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  112. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  113. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  114. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  115. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  116. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  117. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_ssh.py +2 -2
  118. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  119. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  120. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  121. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  122. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  123. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  124. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +118 -34
  125. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  126. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  127. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  128. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  129. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  130. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  131. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  132. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  133. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  134. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  135. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  136. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  137. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  138. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  139. machineconfig/scripts/python/mcfg_entry.py +133 -48
  140. machineconfig/scripts/python/msearch.py +16 -61
  141. machineconfig/scripts/python/sessions.py +68 -203
  142. machineconfig/scripts/python/terminal.py +27 -102
  143. machineconfig/scripts/python/utils.py +101 -22
  144. machineconfig/settings/atuin/config.toml +294 -0
  145. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  146. machineconfig/settings/linters/.ruff.toml +2 -1
  147. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  148. machineconfig/settings/shells/bash/init.sh +6 -3
  149. machineconfig/settings/shells/nushell/config.nu +23 -1
  150. machineconfig/settings/shells/nushell/env.nu +22 -48
  151. machineconfig/settings/shells/nushell/init.nu +64 -240
  152. machineconfig/settings/shells/pwsh/init.ps1 +69 -1
  153. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  154. machineconfig/settings/shells/wezterm/wezterm.lua +4 -1
  155. machineconfig/settings/shells/wt/settings.json +21 -21
  156. machineconfig/settings/shells/zsh/init.sh +25 -4
  157. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  158. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  159. machineconfig/settings/tv/config.toml +234 -0
  160. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  161. machineconfig/settings/wsl/.wslconfig +5 -30
  162. machineconfig/settings/wt/__init__.py +0 -0
  163. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  164. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  165. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  166. machineconfig/setup_linux/__init__.py +0 -1
  167. machineconfig/setup_linux/apps_desktop.sh +8 -27
  168. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  169. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  170. machineconfig/setup_mac/__init__.py +0 -2
  171. machineconfig/setup_windows/__init__.py +2 -5
  172. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  173. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  174. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  175. machineconfig/type_hinting/sql/__init__.py +1 -0
  176. machineconfig/type_hinting/sql/base.py +216 -0
  177. machineconfig/type_hinting/sql/core_schema.py +64 -0
  178. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  179. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  180. machineconfig/type_hinting/typedict/__init__.py +1 -0
  181. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  182. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  183. machineconfig/type_hinting/typedict/generators.py +231 -0
  184. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  185. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  186. machineconfig/utils/accessories.py +24 -0
  187. machineconfig/utils/code.py +78 -33
  188. machineconfig/utils/files/ascii_art.py +10 -14
  189. machineconfig/utils/files/headers.py +3 -5
  190. machineconfig/utils/files/read.py +8 -1
  191. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  192. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  193. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  194. machineconfig/utils/installer_utils/installer_class.py +12 -4
  195. machineconfig/utils/installer_utils/installer_cli.py +1 -15
  196. machineconfig/utils/installer_utils/installer_helper.py +2 -2
  197. machineconfig/utils/installer_utils/installer_locator_utils.py +13 -13
  198. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  199. machineconfig/utils/io.py +25 -8
  200. machineconfig/utils/meta.py +6 -4
  201. machineconfig/utils/options.py +49 -19
  202. machineconfig/utils/options_utils/__init__.py +0 -0
  203. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  204. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  205. machineconfig/utils/options_utils/tv_options.py +37 -0
  206. machineconfig/utils/path_extended.py +8 -7
  207. machineconfig/utils/scheduler.py +8 -2
  208. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  209. machineconfig/utils/source_of_truth.py +6 -1
  210. machineconfig/utils/ssh.py +73 -23
  211. machineconfig/utils/ssh_utils/abc.py +1 -1
  212. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  213. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  214. machineconfig/utils/ssh_utils/utils.py +23 -7
  215. machineconfig/utils/ssh_utils/wsl.py +107 -170
  216. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  217. machineconfig/utils/upgrade_packages.py +4 -8
  218. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/METADATA +30 -22
  219. machineconfig-8.51.dist-info/RECORD +543 -0
  220. machineconfig/jobs/installer/check_installations.py +0 -248
  221. machineconfig/profile/backup.toml +0 -49
  222. machineconfig/profile/mapper.toml +0 -263
  223. machineconfig/scripts/linux/other/switch_ip +0 -20
  224. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  225. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  226. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  227. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  228. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  229. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  230. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  231. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  232. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  233. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  234. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  235. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  236. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  237. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  238. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  239. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  240. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  241. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  242. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  243. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  244. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  245. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  246. machineconfig/setup_windows/others/obs.ps1 +0 -4
  247. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  248. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  249. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  250. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  251. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  252. machineconfig/utils/options_tv.py +0 -119
  253. machineconfig/utils/tst.py +0 -20
  254. machineconfig-7.98.dist-info/RECORD +0 -504
  255. /machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  256. /machineconfig/{scripts/python/helpers_agents → jobs/installer/python_scripts}/__init__.py +0 -0
  257. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  258. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  259. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  260. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  261. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  262. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  263. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  264. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  265. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  266. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  267. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  268. /machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  269. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  270. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_drive +0 -0
  271. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nfs +0 -0
  272. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  273. /machineconfig/{scripts/python/helpers_network → jobs/scripts/bash_scripts}/mount_smb +0 -0
  274. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  275. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  276. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  277. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  278. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  279. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  280. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  281. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  282. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  283. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  284. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  285. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  286. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  287. /machineconfig/scripts/python/{helpers_agents/agentic_frameworks → graph}/__init__.py +0 -0
  288. /machineconfig/scripts/python/{helpers_cloud → helpers}/__init__.py +0 -0
  289. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  290. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  291. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_agents}/__init__.py +0 -0
  292. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  293. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  294. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  295. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  296. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  297. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  298. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  299. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_cloud}/__init__.py +0 -0
  300. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  301. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  302. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_croshell}/__init__.py +0 -0
  303. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  304. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  305. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  306. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  307. /machineconfig/scripts/python/{helpers_network → helpers/helpers_devops}/__init__.py +0 -0
  308. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops/themes}/__init__.py +0 -0
  309. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  310. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_fire_command}/__init__.py +0 -0
  311. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  312. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/f.py +0 -0
  313. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_streamlit_helper.py +0 -0
  314. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  316. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_network/__init__.py} +0 -0
  317. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nfs.py +0 -0
  318. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/mount_nw_drive.py +0 -0
  319. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  320. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  321. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  322. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  323. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  324. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  325. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  326. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  327. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  328. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  329. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  330. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +0 -0
  331. {machineconfig-7.98.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -1,71 +1,26 @@
1
+ """msearch - Machineconfig search helper."""
1
2
 
2
3
  import typer
3
4
  from typing import Annotated
4
5
 
5
6
 
6
7
  def machineconfig_search(
7
- directory: Annotated[str, typer.Option(..., "--directory", "-d", help="The directory to search")] = ".",
8
- ast: Annotated[bool, typer.Option(..., "--ast", "-a", help="The abstract syntax tree search/ tree sitter search of symbols")] = False,
9
- symantic: Annotated[bool, typer.Option(..., "--symantic", "-s", help="The symantic search of symbols")] = False,
10
- extension: Annotated[str, typer.Option(..., "--extension", "-e", help="File extension to filter by (e.g., .py, .js)")] = "",
11
- file: Annotated[bool, typer.Option(..., "--file", "-f", help="File search using fzf")] = False,
12
- no_dotfiles: Annotated[bool, typer.Option(..., "--no-dotfiles", "-D", help="Exclude dotfiles from search")] = False,
13
- rga: Annotated[bool, typer.Option(..., "--rga", "-a", help="Use ripgrep-all for searching instead of ripgrep")] = False,
14
- install_dependencies: Annotated[bool, typer.Option(..., "--install-dependencies", "-p", help="Install required dependencies if missing")] = False
15
- ):
16
- if install_dependencies:
17
- from machineconfig.utils.installer_utils.installer_cli import install_if_missing
18
- install_if_missing("fzf")
19
- install_if_missing("tv")
20
- install_if_missing("bat")
21
- install_if_missing("fd")
22
- install_if_missing("rg") # ripgrep
23
- install_if_missing("rga") # ripgrep-all
24
- # install_if_missing("tree-sitter-cli")
25
- return
26
- if symantic:
27
- script = ""
28
- for an_ex in extension.split(","):
29
- script = script + f"""\nparse *.{an_ex} """
30
- from machineconfig.utils.code import run_shell_script
31
- run_shell_script(script=script)
32
- return
33
- if ast:
34
- from machineconfig.scripts.python.helpers.ast_search import get_repo_symbols
35
- symbols = get_repo_symbols(directory)
36
- from machineconfig.utils.options import choose_from_options
37
- try:
38
- res = choose_from_options(options=symbols, msg="Select a symbol to search for:", tv=True, multi=False)
39
- from rich import print_json
40
- import json
41
- res_json = json.dumps(res, indent=4)
42
- print_json(res_json)
43
- return None
44
- except Exception as e:
45
- print(f"❌ Error during selection: {e}")
46
- return None
47
- if file:
48
- script = """fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}' """
49
- if no_dotfiles:
50
- script = "fd | " + script
51
- from machineconfig.utils.code import run_shell_script
52
- run_shell_script(script=script)
53
- return
54
- from machineconfig.scripts.python.helpers_msearch import FZFG_LINUX_PATH, FZFG_WINDOWS_PATH
55
- import platform
56
- if platform.system() == "Linux" or platform.system() == "Darwin":
57
- script = FZFG_LINUX_PATH.read_text(encoding="utf-8")
58
- elif platform.system() == "Windows":
59
- script = FZFG_WINDOWS_PATH.read_text(encoding="utf-8")
60
- else:
61
- raise RuntimeError("Unsupported platform")
62
- if rga:
63
- script = script.replace("rg ", "rga ").replace("ripgrep", "ripgrep-all")
64
- from machineconfig.utils.code import exit_then_run_shell_script
65
- exit_then_run_shell_script(script=script, strict=False)
8
+ path: Annotated[str, typer.Argument(help="The directory/file to search")] = ".",
9
+ ast: Annotated[bool, typer.Option(..., "--ast", "-a", help="The abstract syntax tree search/ tree sitter search of symbols")] = False,
10
+ symantic: Annotated[bool, typer.Option(..., "--symantic", "-s", help="The symantic search of symbols")] = False,
11
+ extension: Annotated[str, typer.Option(..., "--extension", "-E", help="File extension to filter by (e.g., .py, .js)")] = "",
12
+ file: Annotated[bool, typer.Option(..., "--file", "-f", help="File search using fzf")] = False,
13
+ no_dotfiles: Annotated[bool, typer.Option(..., "--no-dotfiles", "-D", help="Exclude dotfiles from search")] = False,
14
+ rga: Annotated[bool, typer.Option(..., "--rga", "-A", help="Use ripgrep-all for searching all (non text files) instead of ripgrep")] = False,
15
+ edit: Annotated[bool, typer.Option(..., "--edit", "-e", help="Open selection in editor (helix)")] = False,
16
+ install_dependencies: Annotated[bool, typer.Option(..., "--install-req", "-i", help="Install required dependencies if missing")] = False,
17
+ ) -> None:
18
+ """Machineconfig search helper."""
19
+ from machineconfig.scripts.python.helpers.helpers_msearch.msearch_impl import machineconfig_search as impl
20
+ impl(path=path, ast=ast, symantic=symantic, extension=extension, file=file, no_dotfiles=no_dotfiles, rga=rga, edit=edit, install_dependencies=install_dependencies)
66
21
 
67
22
 
68
- def main():
23
+ def main() -> None:
69
24
  app = typer.Typer(add_completion=False, no_args_is_help=True)
70
- app.command(name="msearch", help="machineconfig search helper", no_args_is_help=False)(machineconfig_search)
25
+ app.command(name="msearch", help=machineconfig_search.__doc__, short_help="machineconfig search helper", no_args_is_help=False)(machineconfig_search)
71
26
  app()
@@ -1,221 +1,86 @@
1
+ """Sessions management commands - lazy loading subcommands."""
1
2
 
2
3
  from typing import Optional, Literal, Annotated
3
4
  import typer
4
5
 
5
6
 
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):
7
+ def balance_load(
8
+ layout_path: Annotated[str, typer.Argument(..., help="Path to the layout.json file")],
9
+ max_thresh: Annotated[int, typer.Option(..., "--max-threshold", "-m", help="Maximum tabs per layout")],
10
+ thresh_type: Annotated[Literal["number", "n", "weight", "w"], typer.Option(..., "--threshold-type", "-t", help="Threshold type")],
11
+ breaking_method: Annotated[Literal["moreLayouts", "ml", "combineTabs", "ct"], typer.Option(..., "--breaking-method", "-b", help="Breaking method")],
12
+ output_path: Annotated[Optional[str], typer.Option(..., "--output-path", "-o", help="Path to write the adjusted layout.json file")] = None,
13
+ ) -> None:
11
14
  """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
-
27
- from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
28
- import json
29
- layoutfile: LayoutsFile = json.loads(layout_path_obj.read_text())
30
- layout_configs = layoutfile["layouts"]
31
- from machineconfig.cluster.sessions_managers.utils.load_balancer import limit_tab_num
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])
33
- layoutfile["layouts"] = new_layouts
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'
35
- target_file.parent.mkdir(parents=True, exist_ok=True)
36
- target_file.write_text(data=json.dumps(layoutfile, indent=4), encoding="utf-8")
37
- typer.echo(f"Adjusted layout saved to {target_file}")
38
-
39
-
40
- def select_layout(layouts_json_file: str, selected_layouts_names: Optional[list[str]], select_interactively: bool,
41
- subsitute_home: bool
42
- ) -> list["LayoutConfig"]:
43
- import json
44
- from machineconfig.utils.options import choose_from_options
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)
54
- if len(layout_file["layouts"]) == 0:
55
- raise ValueError(f"No layouts found in {layouts_json_file}")
56
- if selected_layouts_names is None: # choose all, or interactively
57
- if not select_interactively:
58
- return layout_file["layouts"]
59
- options = [layout["layoutName"] for layout in layout_file["layouts"]]
60
- from machineconfig.utils.options import choose_from_options
61
- selected_layouts_names = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:", tv=True, msg="Choose one option")
62
- print(f"Selected layout(s): {selected_layouts_names}")
63
- # Extract the configs from the names:
64
- layouts_chosen: list[LayoutConfig] = []
65
- for name in selected_layouts_names:
66
- layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"] == name), None)
67
- if layout_chosen is None:
68
- layout_chosen = next((layout for layout in layout_file["layouts"] if layout["layoutName"].lower() == name.lower()), None)
69
- if layout_chosen is None:
70
- available_layouts = [layout["layoutName"] for layout in layout_file["layouts"]]
71
- raise ValueError(f"Layout '{name}' not found. Available layouts: {available_layouts}")
72
- layouts_chosen.append(layout_chosen)
73
- return layouts_chosen
74
-
75
-
76
- def find_layout_file(layout_path: str, ) -> str:
77
- from machineconfig.utils.path_helper import search_for_files_of_interest
78
- from machineconfig.utils.options import choose_from_options
79
- from machineconfig.utils.path_helper import match_file_name, sanitize_path
80
- from pathlib import Path
81
- path_obj = sanitize_path(layout_path)
82
- if not path_obj.exists():
83
- choice_file = match_file_name(sub_string=layout_path, search_root=Path.cwd(), suffixes={".json"})
84
- elif path_obj.is_dir():
85
- print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
86
- files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
87
- print(f"🔍 Got #{len(files)} results.")
88
- choice_file = choose_from_options(multi=False, options=files, tv=True, msg="Choose one option")
89
- choice_file = Path(choice_file).expanduser().absolute()
90
- else:
91
- choice_file = path_obj
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,
106
- ):
107
- """
108
- Launch terminal sessions based on a layout configuration file.
109
- """
15
+ from machineconfig.scripts.python.helpers.helpers_sessions.sessions_impl import balance_load as impl
16
+ impl(layout_path=layout_path, max_thresh=max_thresh, thresh_type=thresh_type, breaking_method=breaking_method, output_path=output_path)
17
+
18
+
19
+ def run(
20
+ ctx: typer.Context,
21
+ layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
22
+ sleep_inbetween: Annotated[float, typer.Option(..., "--sleep-inbetween", "-si", help="Sleep time in seconds between launching layouts")] = 1.0,
23
+ monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
24
+ parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
25
+ 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,
26
+ choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
27
+ choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-i", help="Select layouts interactively")] = False,
28
+ subsitute_home: Annotated[bool, typer.Option(..., "--substitute-home", "-sh", help="Substitute ~ and $HOME in layout file with actual home directory path")] = False,
29
+ 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.")] = 25,
30
+ 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.")] = 25,
31
+ ) -> None:
32
+ """Launch terminal sessions based on a layout configuration file."""
110
33
  if layout_path is None:
111
34
  typer.echo(ctx.get_help())
112
35
  raise typer.Exit()
113
- layout_path_resolved = find_layout_file(layout_path=layout_path)
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)
115
-
116
- # ============= Basic sanity checks =============
117
- if parallel and len(layouts_selected) > max_layouts:
118
- raise ValueError(f"Number of layouts {len(layouts_selected)} exceeds the maximum allowed {max_layouts}. Please adjust your layout file.")
119
- for a_layout in layouts_selected:
120
- if len(a_layout["layoutTabs"]) > max_tabs:
121
- typer.echo(f"Layout '{a_layout.get('layoutName', 'Unnamed')}' has {len(a_layout['layoutTabs'])} tabs which exceeds the max of {max_tabs}.")
122
- confirm = typer.confirm("Do you want to proceed with launching this layout?", default=False)
123
- if not confirm:
124
- typer.echo("Aborting launch.")
125
- raise typer.Exit(0)
126
- import time
127
- import platform
128
- if platform.system() == "Linux" or platform.system() == "Darwin":
129
- from machineconfig.cluster.sessions_managers.zellij_local_manager import ZellijLocalManager
130
- if not parallel: iterable = [[item] for item in layouts_selected]
131
- else: iterable = [layouts_selected]
132
- for i, a_layouts in enumerate(iterable):
133
- manager = ZellijLocalManager(session_layouts=a_layouts)
134
- manager.start_all_sessions(poll_interval=2, poll_seconds=2)
135
- if monitor:
136
- manager.run_monitoring_routine(wait_ms=2000)
137
- if kill_upon_completion:
138
- manager.kill_all_sessions()
139
- if i < len(layouts_selected) - 1: # Don't sleep after the last layout
140
- time.sleep(sleep_inbetween)
141
- elif platform.system() == "Windows":
142
- from machineconfig.cluster.sessions_managers.wt_local_manager import WTLocalManager
143
- if not parallel: iterable = [[item] for item in layouts_selected]
144
- else: iterable = [layouts_selected]
145
- for i, a_layouts in enumerate(iterable):
146
- manager = WTLocalManager(session_layouts=a_layouts)
147
- manager.start_all_sessions()
148
- if monitor:
149
- manager.run_monitoring_routine(wait_ms=2000)
150
- if kill_upon_completion:
151
- manager.kill_all_sessions()
152
- if i < len(layouts_selected) - 1: # Don't sleep after the last layout
153
- time.sleep(sleep_inbetween)
154
- else:
155
- print(f"❌ Unsupported platform: {platform.system()}")
156
-
157
-
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
- ):
36
+ from machineconfig.scripts.python.helpers.helpers_sessions.sessions_impl import run_layouts
37
+ try:
38
+ run_layouts(layout_path=layout_path, max_tabs=max_tabs, max_layouts=max_layouts, sleep_inbetween=sleep_inbetween, monitor=monitor, parallel=parallel, kill_upon_completion=kill_upon_completion, choose=choose, choose_interactively=choose_interactively, subsitute_home=subsitute_home)
39
+ except ValueError as e:
40
+ typer.echo(str(e))
41
+ raise typer.Exit(1) from e
42
+
43
+
44
+ def create_template(
45
+ name: Annotated[Optional[str], typer.Argument(..., help="Name of the layout template to create")] = None,
46
+ num_tabs: Annotated[int, typer.Option(..., "--num-tabs", "-t", help="Number of tabs to include in the template")] = 3,
47
+ ) -> None:
161
48
  """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"
187
- else:
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)
49
+ from machineconfig.scripts.python.helpers.helpers_sessions.sessions_impl import create_template as impl
50
+ impl(name=name, num_tabs=num_tabs)
51
+
52
+
53
+ def create_from_function(
54
+ num_process: Annotated[int, typer.Option(..., "--num-process", "-n", help="Number of parallel processes to run")],
55
+ path: Annotated[str, typer.Option(..., "--path", "-p", help="Path to a Python or Shell script file or a directory containing such files")] = ".",
56
+ function: Annotated[Optional[str], typer.Option(..., "--function", "-f", help="Function to run from the Python file. If not provided, you will be prompted to choose.")] = None,
57
+ ) -> None:
58
+ """Create a layout from a function to run in multiple processes."""
59
+ from machineconfig.scripts.python.helpers.helpers_sessions.sessions_multiprocess import create_from_function as impl
60
+ impl(num_process=num_process, path=path, function=function)
61
+
62
+
63
+ def get_app() -> typer.Typer:
64
+ layouts_app = typer.Typer(help="Layouts management subcommands", no_args_is_help=True, add_help_option=True, add_completion=False)
65
+
66
+ layouts_app.command("create-from-function", no_args_is_help=True, short_help="[c] Create a layout from a function")(create_from_function)
67
+ layouts_app.command("c", no_args_is_help=True, hidden=True)(create_from_function)
68
+
69
+ layouts_app.command("run", no_args_is_help=True, help=run.__doc__, short_help="[r] Run the selected layout(s)")(run)
70
+ layouts_app.command("r", no_args_is_help=True, help=run.__doc__, hidden=True)(run)
71
+
72
+ layouts_app.command("balance-load", no_args_is_help=True, help=balance_load.__doc__, short_help="[b] Balance the load across sessions")(balance_load)
73
+ layouts_app.command("b", no_args_is_help=True, help=balance_load.__doc__, hidden=True)(balance_load)
74
+
75
+ layouts_app.command("create-template", no_args_is_help=False, help=create_template.__doc__, short_help="[t] Create a layout template file")(create_template)
76
+ layouts_app.command("t", no_args_is_help=False, help=create_template.__doc__, hidden=True)(create_template)
212
77
  return layouts_app
213
78
 
214
79
 
215
- def main():
80
+ def main() -> None:
216
81
  layouts_app = get_app()
217
82
  layouts_app()
218
83
 
219
84
 
220
85
  if __name__ == "__main__":
221
- from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
86
+ pass
@@ -1,127 +1,52 @@
1
-
2
1
  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)
2
+ from typing import Annotated
10
3
 
11
4
 
12
5
  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,
6
+ name: Annotated[str | None, typer.Argument(help="Name of the Zellij session to attach to. If not provided, a list will be shown to choose from.")] = None,
14
7
  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.")
8
+ kill_all: Annotated[bool, typer.Option("--kill-all", "-k", help="Kill all existing Zellij sessions before creating a new one.", show_default=True)] = False) -> None:
9
+ """Choose a Zellij session to attach to."""
10
+ from machineconfig.scripts.python.helpers.helpers_terminal.terminal_impl import choose_zellij_session as impl
11
+ action, payload = impl(name=name, new_session=new_session, kill_all=kill_all)
12
+ if action == "error":
13
+ typer.echo(payload, err=True, color=True)
41
14
  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
-
15
+ if action == "run_script" and payload:
16
+ from machineconfig.utils.code import exit_then_run_shell_script
17
+ exit_then_run_shell_script(payload, strict=True)
67
18
 
68
19
 
69
20
  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
21
+ """Get all Zellij session tabs."""
22
+ from machineconfig.scripts.python.helpers.helpers_terminal.terminal_impl import get_session_tabs as impl
23
+ result = impl()
88
24
  print(result)
89
25
  return result
90
26
 
91
27
 
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)}")
28
+ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]) -> None:
29
+ """Start a Windows Terminal layout by name."""
30
+ from machineconfig.scripts.python.helpers.helpers_terminal.terminal_impl import start_wt as impl
31
+ status, message = impl(layout_name=layout_name)
32
+ if status == "error":
33
+ typer.echo(message)
107
34
  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
35
  # cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
111
36
  # from machineconfig.utils.code import exit_then_run_shell_script
112
37
  # exit_then_run_shell_script(cmd, strict=True)
113
38
 
114
39
 
115
40
  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)
41
+ app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=True, add_completion=False)
42
+ app.command(name="attach-to-zellij", no_args_is_help=False, help=choose_zellij_session.__doc__, short_help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
43
+ app.command(name="z", hidden=True, no_args_is_help=False, help=choose_zellij_session.__doc__)(choose_zellij_session)
119
44
 
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)
45
+ app.command(name="start-wt", no_args_is_help=True, help=start_wt.__doc__, short_help="[w] Start a Windows Terminal layout by name.")(start_wt)
46
+ app.command(name="w", hidden=True, no_args_is_help=True, help=start_wt.__doc__)(start_wt)
122
47
 
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)
48
+ app.command(name="get-session-tabs", no_args_is_help=False, help=get_session_tabs.__doc__, short_help="[zt] Get all Zellij session tabs.")(get_session_tabs)
49
+ app.command(name="zt", hidden=True, no_args_is_help=False, help=get_session_tabs.__doc__)(get_session_tabs)
125
50
  return app
126
51
 
127
52
  def main():