machineconfig 7.50__py3-none-any.whl → 8.14__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 (298) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/sessions_managers/utils/maker.py +23 -11
  3. machineconfig/cluster/sessions_managers/wt_local_manager.py +22 -19
  4. machineconfig/cluster/sessions_managers/wt_remote_manager.py +3 -1
  5. machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
  6. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  7. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  8. machineconfig/jobs/installer/installer_data.json +1185 -165
  9. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  10. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  11. machineconfig/jobs/installer/package_groups.py +52 -84
  12. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  13. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -2
  14. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  15. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +16 -12
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  21. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  23. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  24. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  25. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  26. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  27. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  28. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  29. machineconfig/logger.py +0 -1
  30. machineconfig/profile/create_helper.py +21 -22
  31. machineconfig/profile/create_links_export.py +25 -11
  32. machineconfig/profile/create_shell_profile.py +14 -3
  33. machineconfig/profile/mapper.toml +8 -6
  34. machineconfig/scripts/__init__.py +0 -4
  35. machineconfig/scripts/linux/wrap_mcfg +20 -21
  36. machineconfig/scripts/python/agents.py +74 -50
  37. machineconfig/scripts/python/ai/initai.py +1 -1
  38. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  39. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  40. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  41. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  42. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  43. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  44. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  45. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  46. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  47. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  48. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  49. machineconfig/scripts/python/cloud.py +6 -6
  50. machineconfig/scripts/python/croshell.py +67 -60
  51. machineconfig/scripts/python/devops.py +41 -21
  52. machineconfig/scripts/python/devops_navigator.py +0 -4
  53. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  54. machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
  55. machineconfig/scripts/python/fire_jobs.py +95 -67
  56. machineconfig/scripts/python/ftpx.py +44 -17
  57. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  58. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  59. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  60. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  61. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +1 -1
  62. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +9 -7
  63. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +21 -8
  64. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +0 -12
  65. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +30 -11
  66. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +9 -2
  67. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  68. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  69. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  70. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  71. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  72. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  73. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +8 -4
  74. machineconfig/scripts/python/helpers_agents/templates/template.sh +18 -8
  75. machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
  76. machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
  77. machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
  78. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
  79. machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
  80. machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
  81. machineconfig/scripts/python/helpers_devops/cli_config.py +19 -25
  82. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +22 -13
  83. machineconfig/scripts/python/helpers_devops/cli_nw.py +113 -26
  84. machineconfig/scripts/python/helpers_devops/cli_repos.py +37 -11
  85. machineconfig/scripts/python/helpers_devops/cli_self.py +95 -42
  86. machineconfig/scripts/python/helpers_devops/cli_share_file.py +9 -9
  87. machineconfig/scripts/python/helpers_devops/cli_share_server.py +13 -12
  88. machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
  89. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +4 -4
  90. machineconfig/scripts/python/helpers_devops/devops_status.py +7 -19
  91. machineconfig/scripts/python/helpers_devops/run_script.py +180 -0
  92. machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +1 -1
  93. machineconfig/scripts/python/helpers_fire_command/file_wrangler.py +2 -19
  94. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +1 -0
  95. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +25 -15
  96. machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfg +3 -3
  97. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +58 -1
  98. machineconfig/scripts/python/helpers_navigator/command_tree.py +50 -18
  99. machineconfig/scripts/python/helpers_network/address.py +176 -0
  100. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  101. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  102. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  103. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  104. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  105. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  106. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  107. machineconfig/scripts/python/helpers_repos/clone.py +0 -1
  108. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +13 -5
  109. machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
  110. machineconfig/scripts/python/helpers_repos/record.py +2 -1
  111. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  112. machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
  113. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +19 -13
  114. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  115. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  116. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  117. machineconfig/scripts/python/interactive.py +30 -31
  118. machineconfig/scripts/python/{machineconfig.py → mcfg_entry.py} +4 -5
  119. machineconfig/scripts/python/msearch.py +57 -6
  120. machineconfig/scripts/python/sessions.py +100 -31
  121. machineconfig/scripts/python/terminal.py +26 -17
  122. machineconfig/scripts/python/utils.py +17 -15
  123. machineconfig/scripts/windows/wrap_mcfg.ps1 +6 -3
  124. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  125. machineconfig/settings/linters/.ruff.toml +1 -1
  126. machineconfig/settings/shells/bash/init.sh +29 -2
  127. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  128. machineconfig/settings/shells/nushell/config.nu +2 -2
  129. machineconfig/settings/shells/nushell/env.nu +45 -6
  130. machineconfig/settings/shells/nushell/init.nu +282 -95
  131. machineconfig/settings/shells/pwsh/init.ps1 +1 -0
  132. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  133. machineconfig/settings/shells/zsh/init.sh +1 -8
  134. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  135. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  136. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  137. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  138. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  139. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  140. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  141. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  142. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  143. machineconfig/settings/television/cable_unix/env.toml +17 -0
  144. machineconfig/settings/television/cable_unix/files.toml +11 -0
  145. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  146. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  147. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  148. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  149. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  150. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  151. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  152. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  153. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  154. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  155. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  156. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  157. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  158. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  159. machineconfig/settings/television/cable_unix/text.toml +17 -0
  160. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  161. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  162. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  163. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  164. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  165. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  166. machineconfig/settings/television/cable_windows/env.toml +17 -0
  167. machineconfig/settings/television/cable_windows/files.toml +14 -0
  168. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  169. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  170. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  171. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  172. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  173. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  174. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  175. machineconfig/settings/television/cable_windows/text.toml +17 -0
  176. machineconfig/settings/wt/__init__.py +0 -0
  177. machineconfig/settings/yazi/init.lua +49 -24
  178. machineconfig/settings/yazi/keymap_linux.toml +19 -4
  179. machineconfig/settings/yazi/keymap_windows.toml +0 -1
  180. machineconfig/settings/yazi/shell/yazi_cd.ps1 +29 -5
  181. machineconfig/settings/yazi/theme.toml +4 -0
  182. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  183. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  184. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  185. machineconfig/setup_linux/__init__.py +1 -2
  186. machineconfig/setup_linux/apps_desktop.sh +8 -27
  187. machineconfig/setup_linux/web_shortcuts/interactive.sh +12 -10
  188. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  189. machineconfig/setup_mac/__init__.py +2 -3
  190. machineconfig/setup_windows/__init__.py +3 -5
  191. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  192. machineconfig/setup_windows/uv.ps1 +8 -1
  193. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +12 -10
  194. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  195. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  196. machineconfig/utils/accessories.py +7 -4
  197. machineconfig/utils/code.py +69 -27
  198. machineconfig/utils/files/headers.py +2 -2
  199. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  200. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  201. machineconfig/utils/installer_utils/installer_class.py +43 -100
  202. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  203. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  204. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +36 -85
  205. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -59
  206. machineconfig/utils/io.py +0 -1
  207. machineconfig/utils/links.py +2 -2
  208. machineconfig/utils/meta.py +30 -16
  209. machineconfig/utils/options.py +42 -24
  210. machineconfig/utils/options_tv.py +119 -0
  211. machineconfig/utils/path_extended.py +42 -20
  212. machineconfig/utils/path_helper.py +75 -22
  213. machineconfig/utils/procs.py +1 -1
  214. machineconfig/utils/scheduler.py +20 -53
  215. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  216. machineconfig/utils/ssh.py +159 -418
  217. machineconfig/utils/ssh_utils/abc.py +5 -0
  218. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  219. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  220. machineconfig/utils/ssh_utils/utils.py +142 -0
  221. machineconfig/utils/ssh_utils/wsl.py +210 -0
  222. machineconfig/utils/terminal.py +1 -0
  223. machineconfig/utils/upgrade_packages.py +6 -1
  224. machineconfig/utils/ve.py +12 -4
  225. machineconfig-8.14.dist-info/METADATA +132 -0
  226. {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/RECORD +264 -215
  227. {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/entry_points.txt +2 -4
  228. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  229. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  230. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  231. machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
  232. machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
  233. machineconfig/scripts/linux/other/switch_ip +0 -20
  234. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  235. machineconfig/scripts/python/define.py +0 -31
  236. machineconfig/scripts/python/explore.py +0 -49
  237. machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -246
  238. machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfag +0 -17
  239. machineconfig/scripts/python/helpers_msearch/scripts_linux/fzfrga +0 -21
  240. machineconfig/scripts/python/helpers_msearch/scripts_linux/skrg +0 -4
  241. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfb.ps1 +0 -3
  242. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfrga.bat +0 -20
  243. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  244. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  245. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  246. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  247. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  248. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  249. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  250. machineconfig/settings/yazi/yazi.toml +0 -17
  251. machineconfig/setup_linux/apps.sh +0 -66
  252. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  253. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  254. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  255. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  256. machineconfig/setup_mac/apps.sh +0 -73
  257. machineconfig/setup_windows/apps.ps1 +0 -62
  258. machineconfig/setup_windows/others/obs.ps1 +0 -4
  259. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  260. machineconfig/utils/installer_utils/installer.py +0 -221
  261. machineconfig-7.50.dist-info/METADATA +0 -92
  262. /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  263. /machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  264. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  265. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  266. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  267. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  268. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  269. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  270. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  271. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  272. /machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  273. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  274. /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  275. /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  276. /machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  277. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  278. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  279. /machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  280. /machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  281. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  282. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  283. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  284. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  285. /machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  286. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  287. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  288. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  289. /machineconfig/scripts/python/{nw → ai/utils}/__init__.py +0 -0
  290. /machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +0 -0
  291. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  292. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers_network}/__init__.py +0 -0
  293. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  294. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  295. /machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +0 -0
  296. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  297. {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/WHEEL +0 -0
  298. {machineconfig-7.50.dist-info → machineconfig-8.14.dist-info}/top_level.txt +0 -0
@@ -1,21 +1,72 @@
1
1
 
2
2
  import typer
3
+ from typing import Annotated
3
4
 
4
5
 
5
- def machineconfig_find():
6
+ 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 all (non text files) instead of ripgrep")] = False,
14
+ install_dependencies: Annotated[bool, typer.Option(..., "--install-req", "-p", help="Install required dependencies if missing")] = False
15
+ ):
16
+ """machineconfig search helper"""
17
+ if install_dependencies:
18
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
19
+ install_if_missing("fzf")
20
+ install_if_missing("tv")
21
+ install_if_missing("bat")
22
+ install_if_missing("fd")
23
+ install_if_missing("rg") # ripgrep
24
+ install_if_missing("rga") # ripgrep-all
25
+ # install_if_missing("tree-sitter-cli")
26
+ return
27
+ if symantic:
28
+ script = ""
29
+ for an_ex in extension.split(","):
30
+ script = script + f"""\nparse *.{an_ex} """
31
+ from machineconfig.utils.code import run_shell_script
32
+ run_shell_script(script=script)
33
+ return
34
+ if ast:
35
+ from machineconfig.scripts.python.helpers.ast_search import get_repo_symbols
36
+ symbols = get_repo_symbols(directory)
37
+ from machineconfig.utils.options import choose_from_options
38
+ try:
39
+ res = choose_from_options(options=symbols, msg="Select a symbol to search for:", tv=True, multi=False)
40
+ from rich import print_json
41
+ import json
42
+ res_json = json.dumps(res, indent=4)
43
+ print_json(res_json)
44
+ return None
45
+ except Exception as e:
46
+ print(f"❌ Error during selection: {e}")
47
+ return None
48
+ if file:
49
+ script = """fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}' """
50
+ if no_dotfiles:
51
+ script = "fd | " + script
52
+ from machineconfig.utils.code import run_shell_script
53
+ run_shell_script(script=script)
54
+ return
6
55
  from machineconfig.scripts.python.helpers_msearch import FZFG_LINUX_PATH, FZFG_WINDOWS_PATH
7
56
  import platform
8
- if platform.system() == "Linux":
9
- script_path = FZFG_LINUX_PATH
57
+ if platform.system() == "Linux" or platform.system() == "Darwin":
58
+ script = FZFG_LINUX_PATH.read_text(encoding="utf-8")
10
59
  elif platform.system() == "Windows":
11
- script_path = FZFG_WINDOWS_PATH
60
+ script = FZFG_WINDOWS_PATH.read_text(encoding="utf-8")
12
61
  else:
13
62
  raise RuntimeError("Unsupported platform")
63
+ if rga:
64
+ script = script.replace("rg ", "rga ").replace("ripgrep", "ripgrep-all")
14
65
  from machineconfig.utils.code import exit_then_run_shell_script
15
- exit_then_run_shell_script(script=script_path.read_text(encoding="utf-8"), strict=False)
66
+ exit_then_run_shell_script(script=script, strict=False)
16
67
 
17
68
 
18
69
  def main():
19
70
  app = typer.Typer(add_completion=False, no_args_is_help=True)
20
- app.command(name="msearch", help="machineconfig search helper", no_args_is_help=False)(machineconfig_find)
71
+ app.command(name="msearch", help=machineconfig_search.__doc__, short_help="machineconfig search helper", no_args_is_help=False)(machineconfig_search)
21
72
  app()
@@ -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_command.file_wrangler 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,16 +155,60 @@ def run(ctx: typer.Context,
130
155
  print(f"❌ Unsupported platform: {platform.system()}")
131
156
 
132
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
+ ):
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
+
196
+
133
197
  def get_app():
134
198
  layouts_app = typer.Typer(help="Layouts management subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
135
199
  from machineconfig.scripts.python.helpers_sessions.sessions_multiprocess import create_from_function
136
- layouts_app.command("create-from-function", no_args_is_help=True, help="[c] Create a layout from a function")(create_from_function)
137
- layouts_app.command("c", no_args_is_help=True, help="Create a layout from a function", hidden=True)(create_from_function)
138
- layouts_app.command("run", no_args_is_help=True, help="[r] Run the selected layout(s)")(run)
139
- layouts_app.command("r", no_args_is_help=True, help="Run the selected layout(s)", hidden=True)(run)
140
- layouts_app.command("balance-load", no_args_is_help=True, help="[b] Balance the load across sessions")(balance_load)
141
- layouts_app.command("b", no_args_is_help=True, help="Balance the load across sessions", hidden=True)(balance_load)
142
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)
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)
143
212
  return layouts_app
144
213
 
145
214
 
@@ -1,7 +1,6 @@
1
- import subprocess
2
- # from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
1
+
3
2
  import typer
4
- from typing import Annotated
3
+ from typing import Annotated, Optional
5
4
 
6
5
 
7
6
  def strip_ansi_codes(text: str) -> str:
@@ -11,8 +10,14 @@ def strip_ansi_codes(text: str) -> str:
11
10
 
12
11
 
13
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
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
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)
16
21
 
17
22
  if new_session:
18
23
  cmd = """
@@ -26,10 +31,12 @@ def choose_zellij_session(
26
31
  typer.Exit()
27
32
  return
28
33
  cmd = "zellij list-sessions"
34
+ import subprocess
29
35
  sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
30
36
  # filter out empty lines and keep raw lines (they contain creation info)
31
37
  sessions = [s for s in sessions if s.strip()]
32
38
  sessions.sort(key=lambda s: "EXITED" in s)
39
+
33
40
  if "current" in sessions:
34
41
  print("Already in a Zellij session, avoiding nesting and exiting.")
35
42
  raise typer.Exit()
@@ -37,32 +44,33 @@ def choose_zellij_session(
37
44
  print("No Zellij sessions found, creating a new one.")
38
45
  result = """zellij --layout st2"""
39
46
  elif len(sessions) == 1:
40
- session = sessions[0].split(" [Created")[0]
41
- print(f"Only one Zellij session found: {session}, attaching to it.")
42
- result = f"zellij attach {session}"
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}"
43
50
  else:
44
51
  from machineconfig.utils.options import choose_from_options
45
52
  # Artificially inject a "NEW SESSION" option so the user can create one from the list
46
53
  NEW_SESSION_LABEL = "NEW SESSION"
47
54
  options = [NEW_SESSION_LABEL] + sessions
48
- session = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, fzf=True)
49
- # If the user chose the artificial option, start a new session (same as --new-session)
50
- if session == NEW_SESSION_LABEL:
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:
51
57
  cmd = "zellij --layout st2"
52
58
  if kill_all:
53
59
  cmd = f"zellij kill-sessions\n{cmd}"
54
60
  from machineconfig.utils.code import exit_then_run_shell_script
55
61
  exit_then_run_shell_script(cmd, strict=True)
56
62
  raise typer.Exit()
57
- session = session.split(" [Created")[0]
58
- result = f"zellij attach {session}"
63
+ session_name = session_name.split(" [Created")[0]
64
+ result = f"zellij attach {session_name}"
59
65
  from machineconfig.utils.code import exit_then_run_shell_script
60
66
  exit_then_run_shell_script(result, strict=True)
61
67
 
62
68
 
63
69
 
64
70
  def get_session_tabs() -> list[tuple[str, str]]:
71
+ """Get all Zellij session tabs."""
65
72
  cmd = "zellij list-sessions"
73
+ import subprocess
66
74
  sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
67
75
  sessions = [strip_ansi_codes(s) for s in sessions]
68
76
  active_sessions = [s for s in sessions if "EXITED" not in s]
@@ -84,6 +92,7 @@ def get_session_tabs() -> list[tuple[str, str]]:
84
92
 
85
93
 
86
94
  def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
95
+ """Start a Windows Terminal layout by name."""
87
96
  from pathlib import Path
88
97
  layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
89
98
  if not layouts_file.exists():
@@ -108,14 +117,14 @@ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to sta
108
117
 
109
118
  def get_app():
110
119
  app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=False)
111
- app.command(name="attach-to-zellij", no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
112
- app.command(name="z", hidden=True, no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
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)
113
122
 
114
- app.command(name="start-wt", no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
115
- app.command(name="w", hidden=True, no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
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)
116
125
 
117
- app.command(name="get-session-tabs", no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
118
- app.command(name="zt", hidden=True, no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
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)
119
128
  return app
120
129
 
121
130
  def main():
@@ -1,9 +1,10 @@
1
-
2
-
3
- from machineconfig.scripts.python.helpers_devops.cli_utils import download, merge_pdfs, get_machine_specs, init_project, compress_pdf, edit
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
4
  import typer
5
5
  from typing import Annotated
6
6
 
7
+
7
8
  def kill_process(
8
9
  # name: Annotated[Optional[str], typer.Option(..., "--name", "-n", help="Name of the process to kill")],
9
10
  # command: Annotated[str, typer.Option(..., "--command", "-c", help="Match by command line instead of process name")] = "",
@@ -27,24 +28,27 @@ def upgrade_packages():
27
28
 
28
29
  def get_app() -> typer.Typer:
29
30
  app = typer.Typer(help="🛠️ utilities operations", no_args_is_help=True, add_help_option=False, add_completion=False)
30
- app.command(name="kill-process", no_args_is_help=False, help="[k] Choose a process to kill")(kill_process)
31
+ app.command(name="kill-process", no_args_is_help=False, help="⚔️ [k] Choose a process to kill")(kill_process)
31
32
  app.command(name="k", no_args_is_help=False, help="Choose a process to kill", hidden=True)(kill_process)
32
33
 
33
- app.command(name="upgrade-packages", no_args_is_help=False, help="[up] Upgrade project dependencies.")(upgrade_packages)
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)
34
38
  app.command(name="up", no_args_is_help=False, hidden=True)(upgrade_packages)
35
39
 
36
- app.command(name="download", no_args_is_help=True, help="[d] Download a file from a URL and optionally decompress it.")(download)
40
+ app.command(name="download", no_args_is_help=True, help="⬇️ [d] Download a file from a URL and optionally decompress it.")(download)
37
41
  app.command(name="d", no_args_is_help=True, hidden=True)(download)
38
- app.command(name="get-machine-specs", no_args_is_help=False, help="[g] Get machine specifications.")(get_machine_specs)
42
+ app.command(name="get-machine-specs", no_args_is_help=False, help="💻 [g] Get machine specifications.")(get_machine_specs)
39
43
  app.command(name="g", no_args_is_help=False, hidden=True)(get_machine_specs)
40
- 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)
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)
41
45
  app.command(name="i", no_args_is_help=False, hidden=True)(init_project)
42
- app.command(name="edit", no_args_is_help=False, help="[e] Open a file in the default editor.")(edit)
43
- app.command(name="e", no_args_is_help=False, hidden=True)(edit)
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)
44
48
 
45
- app.command(name="pdf-merge", no_args_is_help=True, help="[pm] Merge two PDF files into one.")(merge_pdfs)
49
+ app.command(name="pdf-merge", no_args_is_help=True, help="📄 [pm] Merge two PDF files into one.")(merge_pdfs)
46
50
  app.command(name="pm", no_args_is_help=True, hidden=True)(merge_pdfs)
47
- app.command(name="pdf-compress", no_args_is_help=True, help="[pc] Compress a PDF file.")(compress_pdf)
51
+ app.command(name="pdf-compress", no_args_is_help=True, help="📦 [pc] Compress a PDF file.")(compress_pdf)
48
52
  app.command(name="pc", no_args_is_help=True, hidden=True)(compress_pdf)
49
53
 
50
54
  # app.command(name="copy", no_args_is_help=True, help="[c] Copy files or directories.")(copy)
@@ -52,9 +56,7 @@ def get_app() -> typer.Typer:
52
56
 
53
57
  return app
54
58
 
55
- # def func():
56
- # import pycr
57
59
 
58
60
  def main():
59
61
  app = get_app()
60
- app()
62
+ app()
@@ -34,12 +34,15 @@ function wrap_in_shell_script {
34
34
  try {
35
35
  bat --style=full --theme=OneHalfDark --paging=never "$env:OP_PROGRAM_PATH"
36
36
  } catch {
37
- Write-Host "⚠️ Warning: Failed to display script content with 'bat'. Proceeding to execute the script."
37
+ # Write-Host "⚠️ Warning: Failed to display script content with 'bat'. Proceeding to execute the script."
38
+ Write-Host " "
38
39
  }
39
40
  & $env:OP_PROGRAM_PATH
40
- Write-Host "✅ '$Command' execution completed."
41
+ # Write-Host "✅ '$Command' execution completed."
42
+
41
43
  } else {
42
- Write-Host "✅ '$Command' execution completed."
44
+ # Write-Host "✅ '$Command' execution completed."
45
+ Write-Host " "
43
46
  }
44
47
 
45
48
  # Clean up the temporary environment variable so it doesn't leak to other processes/sessions
@@ -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"
@@ -63,7 +63,7 @@ exclude = ["*.ipynb"]
63
63
  # exclude = ["generated"]
64
64
 
65
65
  docstring-code-format = false
66
- docstring-code-line-length = 150
66
+ docstring-code-line-length = 200
67
67
  # Use `\n` line endings for all files
68
68
  line-ending = "lf"
69
69
  skip-magic-trailing-comma = true
@@ -57,7 +57,7 @@ alias r='wrap_in_shell_script croshell'
57
57
  alias u='wrap_in_shell_script utils'
58
58
  alias t='wrap_in_shell_script terminal'
59
59
  alias ms='wrap_in_shell_script msearch'
60
- alias x='. $CONFIG_ROOT/scripts/linux/wrap_mcfg explore'
60
+ alias x='wrap_in_shell_script explore'
61
61
 
62
62
  # alias gcs='gh copilot suggest -t shell'
63
63
  # alias gcg='gh copilot suggest -t git'
@@ -89,7 +89,34 @@ eval "$(zoxide init bash)"
89
89
  eval "$(starship init bash)"
90
90
  # LEVE THIS IN THE END TO AVOID EXECUTION FAILURE OF THE REST OF THE SCRIPT
91
91
  # from https://github.com/cantino/mcfly
92
- eval "$(mcfly init bash)"
92
+ if command -v mcfly &> /dev/null; then
93
+ eval "$(mcfly init bash)"
94
+ else
95
+ # eval "$(tv init bash)"
96
+ tv_shell_history() {
97
+ _disable_bracketed_paste
98
+ local current_prompt="${READLINE_LINE:0:$READLINE_POINT}"
99
+ local output
100
+ # move to the next line so that the prompt is not overwritten
101
+ printf "\n"
102
+ # Get history using tv with the same arguments as zsh version
103
+ output=$(tv bash-history --input "$current_prompt" --inline)
104
+
105
+ if [[ -n "$output" ]]; then
106
+ # Clear the right side of cursor and set new line
107
+ READLINE_LINE="$output"
108
+ READLINE_POINT=${#READLINE_LINE}
109
+ # Uncomment this to automatically accept the line
110
+ # (i.e. run the command without having to press enter twice)
111
+ # accept-line() { echo; }; accept-line
112
+ fi
113
+ # move the cursor back to the previous line
114
+ printf "\033[A"
115
+ _enable_bracketed_paste
116
+ }
117
+ bind -x '"\C-r": tv_shell_history'
118
+ fi
119
+
93
120
 
94
121
  # Show elapsed runtime
95
122
  # _show_elapsed
@@ -27,7 +27,7 @@
27
27
  # def print_code_interactive(_):
28
28
  # res = get_names()
29
29
  # from machineconfig.utils.utils import choose_from_options
30
- # choice = choose_from_options(multi=False, options=res["<class 'function'>"], msg="Choose a type to inspect", fzf=True)
30
+ # choice = choose_from_options(multi=False, options=res["<class 'function'>"], msg="Choose a type to inspect", tv=True)
31
31
  # obj = eval(choice, globals(), locals()) # type: ignore # pylint: disable=eval-used
32
32
  # from rich.syntax import Syntax
33
33
  # import inspect
@@ -1,3 +1,3 @@
1
+ # machineconfig Nushell configuration loader
1
2
 
2
-
3
- use C:\Users\aalsaf01\.config\machineconfig\settings\shells\nushell\init.nu
3
+ use "~/.config/machineconfig/settings/shells/nushell/init.nu"
@@ -1,13 +1,52 @@
1
+ # machineconfig Nushell environment setup
1
2
 
3
+ def reduce_non_empty [segments: list<string>] -> list<string> {
4
+ segments
5
+ | reduce --fold [] { |segment, acc|
6
+ if (($segment | str length) > 0) {
7
+ $acc | append $segment
8
+ } else {
9
+ $acc
10
+ }
11
+ }
12
+ }
2
13
 
3
- # as per https://github.com/starship/starship?tab=readme-ov-file#step-1-install-starship
4
- mkdir ~/.cache/starship
5
- starship init nu | save -f ~/.cache/starship/init.nu
14
+ let default_root = ($env.HOME | path join ".config" "machineconfig")
15
+ let config_root = (
16
+ $env.CONFIG_ROOT?
17
+ | default $default_root
18
+ | path expand
19
+ )
6
20
 
21
+ load-env { CONFIG_ROOT: $config_root }
7
22
 
23
+ let existing_segments = (
24
+ $env.PATH?
25
+ | default ""
26
+ | split row (char esep)
27
+ | reduce_non_empty
28
+ )
8
29
 
9
- # echo $nu.env-path
10
- # as per https://github.com/ajeetdsouza/zoxide?tab=readme-ov-file#installation
11
- zoxide init nushell | save -f ~/.zoxide.nu
30
+ let desired_paths = [
31
+ ($config_root | path join "scripts")
32
+ ($env.HOME | path join "dotfiles" "scripts" "linux")
33
+ ($env.HOME | path join ".local" "bin")
34
+ ($env.HOME | path join ".cargo" "bin")
35
+ "/usr/games"
36
+ ]
37
+
38
+ let merged_segments = (
39
+ $desired_paths
40
+ | reduce --fold $existing_segments { |entry, acc|
41
+ if (($entry | path exists) and (not ($entry in $acc))) {
42
+ $acc | append $entry
43
+ } else {
44
+ $acc
45
+ }
46
+ }
47
+ )
48
+
49
+ let new_path = ($merged_segments | str join (char esep))
50
+ load-env { PATH: $new_path }
12
51
 
13
52