machineconfig 6.23__py3-none-any.whl → 8.12__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (402) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  5. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  6. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  7. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  8. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  9. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  10. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  12. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  13. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  14. machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
  15. machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
  16. machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
  17. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  18. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
  19. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
  20. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
  21. machineconfig/jobs/installer/check_installations.py +0 -1
  22. machineconfig/jobs/installer/installer_data.json +1408 -201
  23. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  24. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  25. machineconfig/jobs/installer/package_groups.py +63 -92
  26. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  27. machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
  28. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  29. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  31. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  32. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  34. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  35. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  37. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  38. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  39. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  43. machineconfig/logger.py +0 -1
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +2 -1
  46. machineconfig/profile/create_links_export.py +64 -18
  47. machineconfig/profile/create_shell_profile.py +90 -132
  48. machineconfig/profile/mapper.toml +18 -8
  49. machineconfig/scripts/__init__.py +0 -4
  50. machineconfig/scripts/linux/wrap_mcfg +46 -0
  51. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  52. machineconfig/scripts/python/agents.py +82 -60
  53. machineconfig/scripts/python/ai/initai.py +1 -19
  54. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  55. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  56. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  57. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  58. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  59. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  60. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  61. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  62. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  63. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  64. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  65. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  66. machineconfig/scripts/python/cloud.py +14 -9
  67. machineconfig/scripts/python/croshell.py +135 -117
  68. machineconfig/scripts/python/devops.py +48 -25
  69. machineconfig/scripts/python/devops_navigator.py +1 -5
  70. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  71. machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
  72. machineconfig/scripts/python/fire_jobs.py +127 -118
  73. machineconfig/scripts/python/ftpx.py +44 -17
  74. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  75. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  76. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  77. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  78. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  79. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  80. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  81. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  82. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  83. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
  84. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  85. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  86. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  87. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  88. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  89. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  90. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  91. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  92. machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
  93. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
  94. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
  95. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
  96. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
  97. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  98. machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
  99. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  100. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  101. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  102. machineconfig/scripts/python/helpers_devops/cli_nw.py +221 -0
  103. machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
  104. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  105. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  106. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  107. machineconfig/scripts/python/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
  108. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
  109. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
  110. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
  111. machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
  112. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  113. machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
  114. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
  115. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
  116. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  117. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  118. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  119. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  120. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  121. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
  122. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
  123. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
  124. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
  125. machineconfig/scripts/python/helpers_network/address.py +176 -0
  126. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  127. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  128. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  129. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  130. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  131. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  132. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  133. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  134. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  135. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  136. machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
  137. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
  138. machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
  139. machineconfig/scripts/python/helpers_repos/grource.py +2 -2
  140. machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
  141. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  142. machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  143. machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
  144. machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
  145. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  146. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  147. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  148. machineconfig/scripts/python/interactive.py +26 -35
  149. machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
  150. machineconfig/scripts/python/msearch.py +72 -0
  151. machineconfig/scripts/python/sessions.py +101 -38
  152. machineconfig/scripts/python/terminal.py +136 -0
  153. machineconfig/scripts/python/utils.py +62 -0
  154. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  155. machineconfig/settings/broot/conf.toml +1 -1
  156. machineconfig/settings/helix/config.toml +16 -0
  157. machineconfig/settings/helix/languages.toml +13 -4
  158. machineconfig/settings/helix/yazi-picker.sh +12 -0
  159. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  160. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  161. machineconfig/settings/lf/linux/lfrc +10 -11
  162. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  163. machineconfig/settings/lf/windows/lfrc +15 -17
  164. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  165. machineconfig/settings/linters/.ruff.toml +1 -1
  166. machineconfig/settings/marimo/marimo.toml +80 -0
  167. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  168. machineconfig/settings/shells/bash/init.sh +57 -10
  169. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  170. machineconfig/settings/shells/nushell/config.nu +2 -35
  171. machineconfig/settings/shells/nushell/env.nu +45 -6
  172. machineconfig/settings/shells/nushell/init.nu +314 -0
  173. machineconfig/settings/shells/pwsh/init.ps1 +59 -23
  174. machineconfig/settings/shells/starship/starship.toml +16 -0
  175. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  176. machineconfig/settings/shells/wt/settings.json +32 -17
  177. machineconfig/settings/shells/zsh/init.sh +89 -0
  178. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  179. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  180. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  181. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  182. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  183. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  184. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  185. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  186. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  187. machineconfig/settings/television/cable_unix/env.toml +17 -0
  188. machineconfig/settings/television/cable_unix/files.toml +11 -0
  189. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  190. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  191. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  192. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  193. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  194. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  195. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  196. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  197. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  198. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  199. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  200. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  201. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  202. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  203. machineconfig/settings/television/cable_unix/text.toml +17 -0
  204. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  205. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  206. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  207. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  208. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  209. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  210. machineconfig/settings/television/cable_windows/env.toml +17 -0
  211. machineconfig/settings/television/cable_windows/files.toml +14 -0
  212. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  213. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  214. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  215. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  216. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  217. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  218. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  219. machineconfig/settings/television/cable_windows/text.toml +17 -0
  220. machineconfig/settings/yazi/init.lua +61 -0
  221. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  222. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  223. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  224. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  225. machineconfig/settings/yazi/theme.toml +4 -0
  226. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  227. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  228. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  229. machineconfig/setup_linux/__init__.py +2 -2
  230. machineconfig/setup_linux/apps_desktop.sh +8 -27
  231. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
  232. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  233. machineconfig/setup_mac/__init__.py +16 -0
  234. machineconfig/setup_mac/apps_gui.sh +248 -0
  235. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  236. machineconfig/setup_mac/uv.sh +36 -0
  237. machineconfig/setup_windows/__init__.py +3 -5
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  239. machineconfig/setup_windows/uv.ps1 +8 -1
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -10
  241. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  242. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  243. machineconfig/utils/accessories.py +7 -5
  244. machineconfig/utils/code.py +143 -167
  245. machineconfig/utils/files/art/fat_croco.txt +10 -0
  246. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  247. machineconfig/utils/files/art/happy_croco.txt +22 -0
  248. machineconfig/utils/files/art/water_croco.txt +11 -0
  249. machineconfig/utils/files/ascii_art.py +1 -1
  250. machineconfig/utils/files/headers.py +6 -11
  251. machineconfig/utils/files/read.py +3 -9
  252. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  253. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  254. machineconfig/utils/installer_utils/installer_class.py +44 -101
  255. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  256. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  257. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +39 -87
  258. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
  259. machineconfig/utils/io.py +77 -4
  260. machineconfig/utils/links.py +56 -38
  261. machineconfig/utils/meta.py +235 -145
  262. machineconfig/utils/options.py +46 -18
  263. machineconfig/utils/options_tv.py +119 -0
  264. machineconfig/utils/path_extended.py +46 -97
  265. machineconfig/utils/path_helper.py +76 -23
  266. machineconfig/utils/procs.py +10 -23
  267. machineconfig/utils/scheduler.py +84 -115
  268. machineconfig/utils/scheduling.py +0 -3
  269. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  271. machineconfig/utils/ssh.py +214 -476
  272. machineconfig/utils/ssh_utils/abc.py +5 -0
  273. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  274. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  275. machineconfig/utils/ssh_utils/utils.py +142 -0
  276. machineconfig/utils/ssh_utils/wsl.py +210 -0
  277. machineconfig/utils/terminal.py +3 -113
  278. machineconfig/utils/upgrade_packages.py +114 -28
  279. machineconfig/utils/ve.py +12 -4
  280. machineconfig-8.12.dist-info/METADATA +132 -0
  281. machineconfig-8.12.dist-info/RECORD +504 -0
  282. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
  283. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  284. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  285. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  286. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  287. machineconfig/jobs/python/vscode/api.py +0 -57
  288. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -12
  289. machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
  290. machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
  291. machineconfig/scripts/linux/fzf2g +0 -21
  292. machineconfig/scripts/linux/fzfag +0 -17
  293. machineconfig/scripts/linux/fzffg +0 -25
  294. machineconfig/scripts/linux/fzfrga +0 -21
  295. machineconfig/scripts/linux/other/share_smb +0 -1
  296. machineconfig/scripts/linux/other/switch_ip +0 -20
  297. machineconfig/scripts/linux/skrg +0 -4
  298. machineconfig/scripts/linux/warp-cli.sh +0 -122
  299. machineconfig/scripts/linux/z_ls +0 -104
  300. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  301. machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
  302. machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
  303. machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
  304. machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
  305. machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
  306. machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
  307. machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
  308. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  309. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  310. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  311. machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
  312. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  313. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  314. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  315. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  316. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  317. machineconfig/scripts/python/repos_helpers/action.py +0 -378
  318. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
  319. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  320. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  321. machineconfig/scripts/windows/fzfrga.bat +0 -20
  322. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  323. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  324. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  325. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  326. machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  327. machineconfig/settings/yazi/keymap.toml +0 -0
  328. machineconfig/settings/yazi/yazi.toml +0 -4
  329. machineconfig/setup_linux/apps.sh +0 -66
  330. machineconfig/setup_linux/nix/cli_installation.sh +0 -137
  331. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  332. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  333. machineconfig/setup_windows/apps.ps1 +0 -62
  334. machineconfig/setup_windows/others/obs.ps1 +0 -4
  335. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  336. machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  337. machineconfig/utils/installer_utils/installer.py +0 -225
  338. machineconfig-6.23.dist-info/METADATA +0 -84
  339. machineconfig-6.23.dist-info/RECORD +0 -428
  340. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  341. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
  342. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
  343. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
  344. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  345. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
  346. machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  347. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  348. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  349. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  350. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  351. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  352. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  353. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  354. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  355. machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
  356. machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
  357. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
  358. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  359. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  360. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  361. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  362. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  363. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  364. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  365. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  366. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  367. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  368. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  369. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  370. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  371. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  372. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  373. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  374. machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
  375. machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  376. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  377. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  378. machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  379. machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
  380. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
  381. /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
  382. /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
  383. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
  384. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
  385. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
  386. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
  387. /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
  388. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
  389. /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  390. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  391. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  392. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
  393. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
  394. /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
  395. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  396. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  397. /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
  398. /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
  399. /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
  400. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  401. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
  402. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
@@ -1,32 +1,56 @@
1
1
 
2
- from pathlib import Path
3
2
  from typing import Optional, Literal, Annotated
4
3
  import typer
5
4
 
6
- def balance_load(layout_path: Annotated[Path, typer.Argument(..., help="Path to the layout.json file")],
7
- max_thresh: Annotated[int, typer.Option(..., help="Maximum tabs per layout")],
8
- thresh_type: Annotated[Literal['number', 'weight'], typer.Option(..., help="Threshold type")],
9
- breaking_method: Annotated[Literal['moreLayouts', 'combineTabs'], typer.Option(..., help="Breaking method")],
10
- output_path: Annotated[Optional[Path], typer.Option(..., help="Path to write the adjusted layout.json file")] = None):
5
+
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):
11
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
+
12
27
  from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
13
28
  import json
14
- layoutfile: LayoutsFile = json.loads(layout_path.read_text())
29
+ layoutfile: LayoutsFile = json.loads(layout_path_obj.read_text())
15
30
  layout_configs = layoutfile["layouts"]
16
31
  from machineconfig.cluster.sessions_managers.utils.load_balancer import limit_tab_num
17
- 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])
18
33
  layoutfile["layouts"] = new_layouts
19
- 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'
20
35
  target_file.parent.mkdir(parents=True, exist_ok=True)
21
36
  target_file.write_text(data=json.dumps(layoutfile, indent=4), encoding="utf-8")
22
37
  typer.echo(f"Adjusted layout saved to {target_file}")
23
38
 
24
39
 
25
- 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"]:
26
43
  import json
27
44
  from machineconfig.utils.options import choose_from_options
28
45
  from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
29
- layout_file: LayoutsFile = json.loads(layouts_json_file.read_text(encoding="utf-8"))
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)
30
54
  if len(layout_file["layouts"]) == 0:
31
55
  raise ValueError(f"No layouts found in {layouts_json_file}")
32
56
  if selected_layouts_names is None: # choose all, or interactively
@@ -34,7 +58,7 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
34
58
  return layout_file["layouts"]
35
59
  options = [layout["layoutName"] for layout in layout_file["layouts"]]
36
60
  from machineconfig.utils.options import choose_from_options
37
- 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")
38
62
  print(f"Selected layout(s): {selected_layouts_names}")
39
63
  # Extract the configs from the names:
40
64
  layouts_chosen: list[LayoutConfig] = []
@@ -49,35 +73,36 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
49
73
  return layouts_chosen
50
74
 
51
75
 
52
- def find_layout_file(layout_path: str, ) -> Path:
53
- from machineconfig.utils.path_extended import PathExtended
54
- from machineconfig.scripts.python.helpers_fire.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
55
78
  from machineconfig.utils.options import choose_from_options
56
79
  from machineconfig.utils.path_helper import match_file_name, sanitize_path
80
+ from pathlib import Path
57
81
  path_obj = sanitize_path(layout_path)
58
82
  if not path_obj.exists():
59
- 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"})
60
84
  elif path_obj.is_dir():
61
85
  print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
62
- files = search_for_files_of_interest(path_obj)
86
+ files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
63
87
  print(f"🔍 Got #{len(files)} results.")
64
- choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
65
- 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()
66
90
  else:
67
91
  choice_file = path_obj
68
- return choice_file
92
+ return str(choice_file)
69
93
 
70
94
 
71
95
  def run(ctx: typer.Context,
72
96
  layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
73
- max_tabs: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
74
- max_layouts: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
75
- sleep_inbetween: Annotated[float, typer.Option(..., help="Sleep time in seconds between launching layouts")] = 1.0,
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,
76
100
  monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
77
101
  parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
78
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,
79
103
  choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
80
- choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-ia", help="Select layouts interactively")] = False
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,
81
106
  ):
82
107
  """
83
108
  Launch terminal sessions based on a layout configuration file.
@@ -86,7 +111,7 @@ def run(ctx: typer.Context,
86
111
  typer.echo(ctx.get_help())
87
112
  raise typer.Exit()
88
113
  layout_path_resolved = find_layout_file(layout_path=layout_path)
89
- 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)
90
115
 
91
116
  # ============= Basic sanity checks =============
92
117
  if parallel and len(layouts_selected) > max_layouts:
@@ -130,22 +155,60 @@ def run(ctx: typer.Context,
130
155
  print(f"❌ Unsupported platform: {platform.system()}")
131
156
 
132
157
 
133
- def kill_process():
134
- from machineconfig.utils.procs import main
135
- main()
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"
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
+
136
196
 
137
197
  def get_app():
138
- layouts_app = typer.Typer(help="Layouts management subcommands", no_args_is_help=True)
139
- from machineconfig.scripts.python.sessions_helpers.sessions_multiprocess import create_from_function
140
- layouts_app.command("create-from-function", no_args_is_help=True, help="[c] Create a layout from a function")(create_from_function)
141
- layouts_app.command("c", no_args_is_help=True, help="Create a layout from a function", hidden=True)(create_from_function)
142
- layouts_app.command("run", no_args_is_help=True, help="[r] Run the selected layout(s)")(run)
143
- layouts_app.command("r", no_args_is_help=True, help="Run the selected layout(s)", hidden=True)(run)
144
- layouts_app.command("balance-load", no_args_is_help=True, help="[b] Balance the load across sessions")(balance_load)
145
- layouts_app.command("b", no_args_is_help=True, help="Balance the load across sessions", hidden=True)(balance_load)
146
- layouts_app.command("kill-process", no_args_is_help=False, help="[k] Choose a process to kill")(kill_process)
147
- layouts_app.command("k", no_args_is_help=False, help="Choose a process to kill", hidden=True)(kill_process)
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=create_from_function.__doc__, short_help="[c] Create a layout from a function")(create_from_function)
202
+ layouts_app.command("c", no_args_is_help=True, help=create_from_function.__doc__, hidden=True)(create_from_function)
203
+
204
+ layouts_app.command("run", no_args_is_help=True, help=run.__doc__, short_help="[r] Run the selected layout(s)")(run)
205
+ layouts_app.command("r", no_args_is_help=True, help=run.__doc__, hidden=True)(run)
206
+
207
+ layouts_app.command("balance-load", no_args_is_help=True, help=balance_load.__doc__, short_help="[b] Balance the load across sessions")(balance_load)
208
+ layouts_app.command("b", no_args_is_help=True, help=balance_load.__doc__, hidden=True)(balance_load)
148
209
 
210
+ layouts_app.command("create-template", no_args_is_help=False, help=create_template.__doc__, short_help="[t] Create a layout template file")(create_template)
211
+ layouts_app.command("t", no_args_is_help=False, help=create_template.__doc__, hidden=True)(create_template)
149
212
  return layouts_app
150
213
 
151
214
 
@@ -0,0 +1,136 @@
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
+ """Choose a Zellij session to attach to."""
17
+ if name is not None:
18
+ result = f"zellij attach {name}"
19
+ from machineconfig.utils.code import exit_then_run_shell_script
20
+ exit_then_run_shell_script(result, strict=True)
21
+
22
+ if new_session:
23
+ cmd = """
24
+ zellij --layout st2
25
+ """
26
+ if kill_all:
27
+ cmd = f"""zellij kill-sessions
28
+ {cmd}"""
29
+ from machineconfig.utils.code import exit_then_run_shell_script
30
+ exit_then_run_shell_script(script=cmd, strict=True)
31
+ typer.Exit()
32
+ return
33
+ cmd = "zellij list-sessions"
34
+ import subprocess
35
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
36
+ # filter out empty lines and keep raw lines (they contain creation info)
37
+ sessions = [s for s in sessions if s.strip()]
38
+ sessions.sort(key=lambda s: "EXITED" in s)
39
+
40
+ if "current" in sessions:
41
+ print("Already in a Zellij session, avoiding nesting and exiting.")
42
+ raise typer.Exit()
43
+ if len(sessions) == 0:
44
+ print("No Zellij sessions found, creating a new one.")
45
+ result = """zellij --layout st2"""
46
+ elif len(sessions) == 1:
47
+ session_name = sessions[0].split(" [Created")[0]
48
+ print(f"Only one Zellij session found: {session_name}, attaching to it.")
49
+ result = f"zellij attach {session_name}"
50
+ else:
51
+ from machineconfig.utils.options import choose_from_options
52
+ # Artificially inject a "NEW SESSION" option so the user can create one from the list
53
+ NEW_SESSION_LABEL = "NEW SESSION"
54
+ options = [NEW_SESSION_LABEL] + sessions
55
+ session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
56
+ if session_name == NEW_SESSION_LABEL:
57
+ cmd = "zellij --layout st2"
58
+ if kill_all:
59
+ cmd = f"zellij kill-sessions\n{cmd}"
60
+ from machineconfig.utils.code import exit_then_run_shell_script
61
+ exit_then_run_shell_script(cmd, strict=True)
62
+ raise typer.Exit()
63
+ session_name = session_name.split(" [Created")[0]
64
+ result = f"zellij attach {session_name}"
65
+ from machineconfig.utils.code import exit_then_run_shell_script
66
+ exit_then_run_shell_script(result, strict=True)
67
+
68
+
69
+
70
+ def get_session_tabs() -> list[tuple[str, str]]:
71
+ """Get all Zellij session tabs."""
72
+ cmd = "zellij list-sessions"
73
+ import subprocess
74
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
75
+ sessions = [strip_ansi_codes(s) for s in sessions]
76
+ active_sessions = [s for s in sessions if "EXITED" not in s]
77
+ result: list[tuple[str, str]] = []
78
+ for session_line in active_sessions:
79
+ session_name = session_line.split(" [Created")[0].strip()
80
+ # Query tab names for the session
81
+ tab_cmd = f"zellij --session {session_name} action query-tab-names"
82
+ try:
83
+ tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
84
+ for tab in tabs:
85
+ if tab.strip():
86
+ result.append((session_name, tab.strip()))
87
+ except subprocess.CalledProcessError:
88
+ # Skip if query fails
89
+ continue
90
+ print(result)
91
+ return result
92
+
93
+
94
+ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
95
+ """Start a Windows Terminal layout by name."""
96
+ from pathlib import Path
97
+ layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
98
+ if not layouts_file.exists():
99
+ typer.echo(f"❌ Layouts file not found: {layouts_file}")
100
+ # available
101
+ raise typer.Exit(code=1)
102
+ import json
103
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
104
+ layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
105
+ chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
106
+ if not chosen_layout:
107
+ typer.echo(f"❌ Layout '{layout_name}' not found in layouts file.")
108
+ available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
109
+ typer.echo(f"Available layouts: {', '.join(available_layouts)}")
110
+ raise typer.Exit(code=1)
111
+ from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
112
+ run_wt_layout(layout_config=chosen_layout)
113
+ # cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
114
+ # from machineconfig.utils.code import exit_then_run_shell_script
115
+ # exit_then_run_shell_script(cmd, strict=True)
116
+
117
+
118
+ def get_app():
119
+ app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=False)
120
+ 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)
121
+ app.command(name="z", hidden=True, no_args_is_help=False, help=choose_zellij_session.__doc__)(choose_zellij_session)
122
+
123
+ 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)
124
+ app.command(name="w", hidden=True, no_args_is_help=True, help=start_wt.__doc__)(start_wt)
125
+
126
+ 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)
127
+ app.command(name="zt", hidden=True, no_args_is_help=False, help=get_session_tabs.__doc__)(get_session_tabs)
128
+ return app
129
+
130
+ def main():
131
+ app = get_app()
132
+ app()
133
+
134
+
135
+ if __name__ == "__main__":
136
+ main()
@@ -0,0 +1,62 @@
1
+ from machineconfig.scripts.python.helpers_utils.pdf import merge_pdfs, compress_pdf
2
+ from machineconfig.scripts.python.helpers_utils.python 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
+
60
+ def main():
61
+ app = get_app()
62
+ app()
@@ -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
+
@@ -2,4 +2,4 @@
2
2
 
3
3
  terminal_title = "{file} 🐄"
4
4
 
5
- capture_mouse: false
5
+ capture_mouse = false
@@ -25,3 +25,19 @@ enable = true
25
25
  max-wrap = 25 # increase value to reduce forced mid-word wrapping
26
26
  max-indent-retain = 0
27
27
  wrap-indicator = "" # set wrap-indicator to "" to hide it
28
+
29
+
30
+ # https://yazi-rs.github.io/docs/tips#helix-with-zellij
31
+ # ~/.config/helix/config.toml
32
+ [keys.normal]
33
+ C-y = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh open %{buffer_name}"
34
+
35
+ # ~/.config/helix/config.toml
36
+
37
+ # [keys.normal.C-y]
38
+ # Open the file(s) in the current window
39
+ # y = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh open %{buffer_name}"
40
+ # Open the file(s) in a vertical split
41
+ # v = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh vsplit %{buffer_name}"
42
+ # Open the file(s) in a horizontal split
43
+ # h = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh hsplit %{buffer_name}"
@@ -1,13 +1,22 @@
1
- # adopted from https://github.com/helix-editor/helix/wiki/How-to-install-the-default-language-servers#python---pyright--ruff--black
1
+ # adopted from https://github.com/helix-editor/helix/wiki/Language-Server-Configurations
2
2
  # adopted from https://github.com/helix-editor/helix/discussions/6623
3
- # You will need: npm install pyright -g; pip install ruff-lsp; pip install black
3
+ # You will need: uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp
4
4
 
5
5
  [[language]]
6
6
  name = "python"
7
- language-servers = [ "pyright", "ruff" ]
7
+ language-servers = ["pylsp", "pyright", "ruff", "pyrefly"]
8
+
9
+ [language-server.pyrefly]
10
+ command = "pyrefly"
11
+ args = [ "lsp" ]
12
+
13
+ [language-server.pylsp.config.pylsp]
14
+ plugins.pylsp_mypy.enabled = true
15
+ plugins.pylsp_mypy.live_mode = true
16
+
8
17
 
9
18
  [language-server.pyright.config.python.analysis]
10
- typeCheckingMode = "basic"
19
+ typeCheckingMode = "strict"
11
20
 
12
21
  [language-server.ruff]
13
22
  command = "ruff-lsp"
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env bash
2
+
3
+ paths=$(yazi "$2" --chooser-file=/dev/stdout | while read -r; do printf "%q " "$REPLY"; done)
4
+
5
+ if [[ -n "$paths" ]]; then
6
+ zellij action toggle-floating-panes
7
+ zellij action write 27 # send <Escape> key
8
+ zellij action write-chars ":$1 $paths"
9
+ zellij action write 13 # send <Enter> key
10
+ else
11
+ zellij action toggle-floating-panes
12
+ fi
@@ -13,6 +13,7 @@
13
13
  # bind '"\C-o":"lfcd\C-m"' # bash
14
14
  # bindkey -s '^o' 'lfcd\n' # zsh
15
15
  #
16
+
16
17
  lfcd () {
17
18
  # 🔄 Create temporary file for directory tracking
18
19
  tmp="$(mktemp)"
@@ -20,8 +20,9 @@ case "$file" in
20
20
  echo "x: $x, y: $y, width: $width, height: $height"
21
21
 
22
22
  if [ -n "$x" ]; then
23
- echo "📐 Dimensions provided by caller, passing to viu"
24
- viu "$file" -x "$x" -y "$y" -w "$width" -h "$height"
23
+ # echo "📐 Dimensions provided by caller, passing to viu"
24
+ # viu "$file" -x "$x" -y "$y" -w "$width" -h "$height"
25
+ # chafa --fit-width -f sixel "$file"
25
26
  echo "✅ Finished viu"
26
27
  chafa "$file"
27
28
  echo "✅ Finished chafa"
@@ -14,8 +14,8 @@ set number true # show line numbers
14
14
 
15
15
  set preview true # preview file on the right pane
16
16
  # set previewer chafa --format sixel --work 9 --optimize 9 --stretch --zoom --size 140x80
17
- set previewer ~/code/machineconfig/src/machineconfig/settings/lf/linux/exe/previewer.sh
18
- set cleaner ~/code/machineconfig/src/machineconfig/settings/lf/linux/exe/cleaner.sh
17
+ set previewer ~/.config/machineconfig/settings/lf/linux/exe/previewer.sh
18
+ set cleaner ~/.config/machineconfig/settings/lf/linux/exe/cleaner.sh
19
19
  # set previewer pistol
20
20
 
21
21
  # set sixels true
@@ -48,7 +48,7 @@ set ratios '1:2:3' # ratio of pane widths
48
48
 
49
49
 
50
50
  # test image viewer
51
- map Q !~/code/machineconfig/src/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
51
+ map Q !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh "$f"
52
52
 
53
53
  # key bindings
54
54
  map vmap v # default is invert
@@ -70,7 +70,6 @@ map <c-u> # half-up
70
70
  # e edit
71
71
  map e # edit modal key.
72
72
  map eh $hx $f
73
- map eH !source ~/code/machineconfig/.venv/bin/activate;hx $f
74
73
  map en $nano $f
75
74
  map el $lvim $f
76
75
  map ev $nvim $f
@@ -84,12 +83,12 @@ map <enter> open
84
83
  map w
85
84
  map ww bash
86
85
  # map wp $powershell
87
- map wr $~/scripts/croshell
86
+ map wr $croshell
88
87
  # map wm $cmd
89
- map i !~/code/machineconfig/src/machineconfig/settings/lf/linux/exe/previewer.sh $f
88
+ map i !~/.config/machineconfig/settings/lf/linux/exe/previewer.sh $f
90
89
  map I !cat $f | gum pager
91
- map R $~/scripts/croshell -r $f
92
- map O $~/scripts/croshell -rj $f
90
+ map R $croshell $f
91
+ map O $croshell -j $f
93
92
 
94
93
 
95
94
  # o file/folder Operations
@@ -118,8 +117,8 @@ map jD cd ~/Downloads
118
117
  map jx cd ~/dotfiles
119
118
  # map jm cd ~/code/machineconfig/src/machineconfig
120
119
  map jh cd ~
121
- map jj $~/scripts/croshell -j --read $f
122
- # map jj $lvim ~/code/machineconfig/src/machineconfig/settings/lf/linux/lfrc
120
+ map jj $croshell -j --read $f
121
+ # map jj $lvim ~/.config/machineconfig/settings/lf/linux/lfrc
123
122
 
124
123
  # from https://github.com/gokcehan/lf/wiki/Integrations#zoxide
125
124
  cmd zi ${{
@@ -163,7 +162,7 @@ cmd fzf_jump ${{
163
162
  }}
164
163
 
165
164
 
166
- cmd fzf2g $(~/scripts/fzf2g.sh $args[1])
165
+ cmd fzf2g $(fzf2g.sh $args[1])
167
166
  # map F $nano fzf2g $args[1]
168
167
 
169
168
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  function lfcd {
19
19
  $tmp = [System.IO.Path]::GetTempFileName()
20
- ~\AppData\Local\Microsoft\WindowsApps\lf.exe -last-dir-path="$tmp" $args
20
+ & "$env:USERPROFILE\AppData\Local\Microsoft\WindowsApps\lf.exe" -last-dir-path="$tmp" $args
21
21
  if (Test-Path -PathType Leaf "$tmp")
22
22
  {
23
23
  $dir = Get-Content "$tmp"