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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/sessions_managers/utils/maker.py +25 -13
  3. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  4. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  5. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  6. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  7. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  8. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  10. machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
  11. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  12. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  13. machineconfig/jobs/installer/custom/boxes.py +2 -2
  14. machineconfig/jobs/installer/custom/hx.py +75 -18
  15. machineconfig/jobs/installer/custom/yazi.py +119 -0
  16. machineconfig/jobs/installer/custom_dev/brave.py +5 -3
  17. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  18. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  19. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +1 -1
  20. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  21. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +27 -22
  22. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  23. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  24. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  25. machineconfig/jobs/installer/installer_data.json +1287 -216
  26. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  27. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  28. machineconfig/jobs/installer/package_groups.py +58 -89
  29. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  30. machineconfig/logger.py +0 -1
  31. machineconfig/profile/create_helper.py +43 -16
  32. machineconfig/profile/create_links.py +2 -1
  33. machineconfig/profile/create_links_export.py +64 -18
  34. machineconfig/profile/create_shell_profile.py +78 -127
  35. machineconfig/profile/mapper.toml +15 -8
  36. machineconfig/scripts/__init__.py +0 -4
  37. machineconfig/scripts/linux/wrap_mcfg +46 -0
  38. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  39. machineconfig/scripts/python/agents.py +52 -37
  40. machineconfig/scripts/python/ai/initai.py +1 -1
  41. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  42. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  43. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  44. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  45. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  46. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  47. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  48. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  49. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  50. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  51. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  52. machineconfig/scripts/python/croshell.py +77 -78
  53. machineconfig/scripts/python/devops.py +39 -21
  54. machineconfig/scripts/python/devops_navigator.py +0 -4
  55. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  56. machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
  57. machineconfig/scripts/python/fire_jobs.py +84 -115
  58. machineconfig/scripts/python/ftpx.py +42 -16
  59. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  60. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  61. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  62. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  63. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  64. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  65. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  66. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  67. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  68. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  69. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  70. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +32 -13
  71. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_helper_types.py +11 -14
  72. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  73. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  74. machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
  75. machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
  76. machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
  77. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
  78. machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
  79. machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
  80. machineconfig/scripts/python/helpers_devops/cli_config.py +46 -61
  81. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +67 -55
  82. machineconfig/scripts/python/helpers_devops/cli_nw.py +157 -16
  83. machineconfig/scripts/python/helpers_devops/cli_repos.py +55 -21
  84. machineconfig/scripts/python/helpers_devops/cli_self.py +98 -48
  85. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  86. machineconfig/scripts/python/helpers_devops/cli_share_server.py +80 -42
  87. machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
  88. machineconfig/scripts/python/helpers_devops/cli_utils.py +3 -128
  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/themes/choose_wezterm_theme.py +1 -1
  92. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  93. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  94. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  95. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  96. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  97. machineconfig/scripts/python/helpers_navigator/command_tree.py +50 -18
  98. machineconfig/scripts/python/helpers_network/address.py +132 -0
  99. machineconfig/scripts/python/{nw → helpers_network}/devops_add_ssh_key.py +24 -5
  100. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs +0 -1
  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 → helpers_network}/ssh_debug_linux.py +7 -7
  104. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  105. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  106. machineconfig/scripts/python/{nw → helpers_network}/wsl_windows_transfer.py +3 -2
  107. machineconfig/scripts/python/helpers_repos/clone.py +0 -1
  108. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +46 -19
  109. machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
  110. machineconfig/scripts/python/helpers_repos/grource.py +1 -1
  111. machineconfig/scripts/python/helpers_repos/record.py +2 -1
  112. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  113. machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
  114. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +20 -13
  115. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  116. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  117. machineconfig/scripts/python/interactive.py +19 -26
  118. machineconfig/scripts/python/{mcfg.py → mcfg_entry.py} +10 -0
  119. machineconfig/scripts/python/msearch.py +71 -0
  120. machineconfig/scripts/python/sessions.py +94 -25
  121. machineconfig/scripts/python/terminal.py +133 -0
  122. machineconfig/scripts/python/utils.py +28 -30
  123. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
  124. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  125. machineconfig/settings/broot/conf.toml +1 -1
  126. machineconfig/settings/helix/config.toml +16 -0
  127. machineconfig/settings/helix/languages.toml +13 -4
  128. machineconfig/settings/helix/yazi-picker.sh +12 -0
  129. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  130. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  131. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  132. machineconfig/settings/lf/windows/lfrc +14 -16
  133. machineconfig/settings/marimo/marimo.toml +1 -1
  134. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  135. machineconfig/settings/shells/bash/init.sh +43 -11
  136. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  137. machineconfig/settings/shells/nushell/config.nu +2 -32
  138. machineconfig/settings/shells/nushell/env.nu +45 -6
  139. machineconfig/settings/shells/nushell/init.nu +314 -0
  140. machineconfig/settings/shells/pwsh/init.ps1 +40 -14
  141. machineconfig/settings/shells/starship/starship.toml +16 -0
  142. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  143. machineconfig/settings/shells/wt/settings.json +14 -5
  144. machineconfig/settings/shells/zsh/init.sh +17 -19
  145. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  146. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  147. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  148. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  149. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  150. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  151. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  152. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  153. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  154. machineconfig/settings/television/cable_unix/env.toml +17 -0
  155. machineconfig/settings/television/cable_unix/files.toml +11 -0
  156. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  157. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  158. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  159. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  160. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  161. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  162. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  163. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  164. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  165. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  166. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  167. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  168. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  169. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  170. machineconfig/settings/television/cable_unix/text.toml +17 -0
  171. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  172. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  173. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  174. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  175. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  176. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  177. machineconfig/settings/television/cable_windows/env.toml +17 -0
  178. machineconfig/settings/television/cable_windows/files.toml +14 -0
  179. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  180. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  181. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  182. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  183. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  184. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  185. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  186. machineconfig/settings/television/cable_windows/text.toml +17 -0
  187. machineconfig/settings/yazi/init.lua +61 -0
  188. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  189. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  190. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  191. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  192. machineconfig/settings/yazi/theme.toml +4 -0
  193. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  194. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  195. machineconfig/setup_linux/__init__.py +2 -1
  196. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  197. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  198. machineconfig/setup_mac/__init__.py +2 -3
  199. machineconfig/setup_mac/apps_gui.sh +248 -0
  200. machineconfig/setup_windows/__init__.py +3 -3
  201. machineconfig/setup_windows/uv.ps1 +8 -1
  202. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -11
  203. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  204. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  205. machineconfig/utils/accessories.py +7 -4
  206. machineconfig/utils/code.py +99 -32
  207. machineconfig/utils/files/ascii_art.py +1 -1
  208. machineconfig/utils/files/headers.py +3 -2
  209. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  210. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  211. machineconfig/utils/installer_utils/installer_class.py +42 -99
  212. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  213. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  214. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +36 -85
  215. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -61
  216. machineconfig/utils/io.py +69 -1
  217. machineconfig/utils/links.py +56 -38
  218. machineconfig/utils/meta.py +33 -18
  219. machineconfig/utils/options.py +46 -18
  220. machineconfig/utils/options_tv.py +119 -0
  221. machineconfig/utils/path_extended.py +44 -95
  222. machineconfig/utils/path_helper.py +76 -23
  223. machineconfig/utils/procs.py +1 -1
  224. machineconfig/utils/scheduler.py +20 -53
  225. machineconfig/utils/scheduling.py +0 -2
  226. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  227. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  228. machineconfig/utils/ssh.py +159 -412
  229. machineconfig/utils/ssh_utils/abc.py +5 -0
  230. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  231. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  232. machineconfig/utils/ssh_utils/utils.py +142 -0
  233. machineconfig/utils/ssh_utils/wsl.py +210 -0
  234. machineconfig/utils/terminal.py +1 -0
  235. machineconfig/utils/upgrade_packages.py +104 -28
  236. machineconfig/utils/ve.py +12 -4
  237. machineconfig-7.98.dist-info/METADATA +132 -0
  238. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/RECORD +259 -196
  239. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/entry_points.txt +4 -1
  240. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  241. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  242. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  243. machineconfig/scripts/linux/fzf2g +0 -21
  244. machineconfig/scripts/linux/fzfag +0 -17
  245. machineconfig/scripts/linux/fzffg +0 -25
  246. machineconfig/scripts/linux/fzfrga +0 -21
  247. machineconfig/scripts/linux/mcfgs +0 -38
  248. machineconfig/scripts/linux/other/share_smb +0 -1
  249. machineconfig/scripts/linux/skrg +0 -4
  250. machineconfig/scripts/linux/warp-cli.sh +0 -122
  251. machineconfig/scripts/linux/z_ls +0 -104
  252. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  253. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  254. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  255. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  256. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  257. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  258. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  259. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  260. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  261. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  262. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  263. machineconfig/scripts/windows/fzfrga.bat +0 -20
  264. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  265. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  266. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  267. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  268. machineconfig/settings/yazi/yazi.toml +0 -4
  269. machineconfig/setup_linux/apps.sh +0 -66
  270. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  271. machineconfig/setup_mac/apps.sh +0 -73
  272. machineconfig/setup_windows/apps.ps1 +0 -62
  273. machineconfig/utils/installer_utils/installer.py +0 -225
  274. machineconfig-6.82.dist-info/METADATA +0 -82
  275. /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  276. /machineconfig/scripts/python/{helpers_fire → ai/utils}/__init__.py +0 -0
  277. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_agents}/__init__.py +0 -0
  278. /machineconfig/scripts/python/{nw → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  279. /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  280. /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  281. /machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  282. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  283. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_network/__init__.py} +0 -0
  284. /machineconfig/scripts/python/{nw → helpers_network}/devops_add_identity.py +0 -0
  285. /machineconfig/scripts/python/{nw → helpers_network}/mount_drive +0 -0
  286. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive +0 -0
  287. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  288. /machineconfig/scripts/python/{nw → helpers_network}/mount_smb +0 -0
  289. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  290. /machineconfig/scripts/{Restore-ThunderbirdProfile.ps1 → windows/mounts/Restore-ThunderbirdProfile.ps1} +0 -0
  291. /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  292. /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  293. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  294. {machineconfig-6.82.dist-info → machineconfig-7.98.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,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
200
+
136
201
  layouts_app.command("create-from-function", no_args_is_help=True, help="[c] Create a layout from a function")(create_from_function)
137
202
  layouts_app.command("c", no_args_is_help=True, help="Create a layout from a function", hidden=True)(create_from_function)
203
+
138
204
  layouts_app.command("run", no_args_is_help=True, help="[r] Run the selected layout(s)")(run)
139
205
  layouts_app.command("r", no_args_is_help=True, help="Run the selected layout(s)", hidden=True)(run)
206
+
140
207
  layouts_app.command("balance-load", no_args_is_help=True, help="[b] Balance the load across sessions")(balance_load)
141
208
  layouts_app.command("b", no_args_is_help=True, help="Balance the load across sessions", hidden=True)(balance_load)
142
209
 
210
+ layouts_app.command("create-template", no_args_is_help=False, help="[t] Create a layout template file")(create_template)
211
+ layouts_app.command("t", no_args_is_help=False, help="Create a layout template file", hidden=True)(create_template)
143
212
  return layouts_app
144
213
 
145
214
 
@@ -0,0 +1,133 @@
1
+
2
+ import typer
3
+ from typing import Annotated, Optional
4
+
5
+
6
+ def strip_ansi_codes(text: str) -> str:
7
+ """Remove ANSI color codes from text."""
8
+ import re
9
+ return re.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', text)
10
+
11
+
12
+ def choose_zellij_session(
13
+ name: Annotated[Optional[str], typer.Argument(help="Name of the Zellij session to attach to. If not provided, a list will be shown to choose from.")] = None,
14
+ new_session: Annotated[bool, typer.Option("--new-session", "-n", help="Create a new Zellij session instead of attaching to an existing one.", show_default=True)] = False,
15
+ kill_all: Annotated[bool, typer.Option("--kill-all", "-k", help="Kill all existing Zellij sessions before creating a new one.", show_default=True)] = False):
16
+ if name is not None:
17
+ result = f"zellij attach {name}"
18
+ from machineconfig.utils.code import exit_then_run_shell_script
19
+ exit_then_run_shell_script(result, strict=True)
20
+
21
+ if new_session:
22
+ cmd = """
23
+ zellij --layout st2
24
+ """
25
+ if kill_all:
26
+ cmd = f"""zellij kill-sessions
27
+ {cmd}"""
28
+ from machineconfig.utils.code import exit_then_run_shell_script
29
+ exit_then_run_shell_script(script=cmd, strict=True)
30
+ typer.Exit()
31
+ return
32
+ cmd = "zellij list-sessions"
33
+ import subprocess
34
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
35
+ # filter out empty lines and keep raw lines (they contain creation info)
36
+ sessions = [s for s in sessions if s.strip()]
37
+ sessions.sort(key=lambda s: "EXITED" in s)
38
+
39
+ if "current" in sessions:
40
+ print("Already in a Zellij session, avoiding nesting and exiting.")
41
+ raise typer.Exit()
42
+ if len(sessions) == 0:
43
+ print("No Zellij sessions found, creating a new one.")
44
+ result = """zellij --layout st2"""
45
+ elif len(sessions) == 1:
46
+ session_name = sessions[0].split(" [Created")[0]
47
+ print(f"Only one Zellij session found: {session_name}, attaching to it.")
48
+ result = f"zellij attach {session_name}"
49
+ else:
50
+ from machineconfig.utils.options import choose_from_options
51
+ # Artificially inject a "NEW SESSION" option so the user can create one from the list
52
+ NEW_SESSION_LABEL = "NEW SESSION"
53
+ options = [NEW_SESSION_LABEL] + sessions
54
+ session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
55
+ if session_name == NEW_SESSION_LABEL:
56
+ cmd = "zellij --layout st2"
57
+ if kill_all:
58
+ cmd = f"zellij kill-sessions\n{cmd}"
59
+ from machineconfig.utils.code import exit_then_run_shell_script
60
+ exit_then_run_shell_script(cmd, strict=True)
61
+ raise typer.Exit()
62
+ session_name = session_name.split(" [Created")[0]
63
+ result = f"zellij attach {session_name}"
64
+ from machineconfig.utils.code import exit_then_run_shell_script
65
+ exit_then_run_shell_script(result, strict=True)
66
+
67
+
68
+
69
+ def get_session_tabs() -> list[tuple[str, str]]:
70
+ cmd = "zellij list-sessions"
71
+ import subprocess
72
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
73
+ sessions = [strip_ansi_codes(s) for s in sessions]
74
+ active_sessions = [s for s in sessions if "EXITED" not in s]
75
+ result: list[tuple[str, str]] = []
76
+ for session_line in active_sessions:
77
+ session_name = session_line.split(" [Created")[0].strip()
78
+ # Query tab names for the session
79
+ tab_cmd = f"zellij --session {session_name} action query-tab-names"
80
+ try:
81
+ tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
82
+ for tab in tabs:
83
+ if tab.strip():
84
+ result.append((session_name, tab.strip()))
85
+ except subprocess.CalledProcessError:
86
+ # Skip if query fails
87
+ continue
88
+ print(result)
89
+ return result
90
+
91
+
92
+ def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
93
+ from pathlib import Path
94
+ layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
95
+ if not layouts_file.exists():
96
+ typer.echo(f"❌ Layouts file not found: {layouts_file}")
97
+ # available
98
+ raise typer.Exit(code=1)
99
+ import json
100
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
101
+ layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
102
+ chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
103
+ if not chosen_layout:
104
+ typer.echo(f"❌ Layout '{layout_name}' not found in layouts file.")
105
+ available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
106
+ typer.echo(f"Available layouts: {', '.join(available_layouts)}")
107
+ raise typer.Exit(code=1)
108
+ from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
109
+ run_wt_layout(layout_config=chosen_layout)
110
+ # cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
111
+ # from machineconfig.utils.code import exit_then_run_shell_script
112
+ # exit_then_run_shell_script(cmd, strict=True)
113
+
114
+
115
+ def get_app():
116
+ app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=False)
117
+ app.command(name="attach-to-zellij", no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
118
+ app.command(name="z", hidden=True, no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
119
+
120
+ app.command(name="start-wt", no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
121
+ app.command(name="w", hidden=True, no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
122
+
123
+ app.command(name="get-session-tabs", no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
124
+ app.command(name="zt", hidden=True, no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
125
+ return app
126
+
127
+ def main():
128
+ app = get_app()
129
+ app()
130
+
131
+
132
+ if __name__ == "__main__":
133
+ main()
@@ -1,9 +1,8 @@
1
-
2
-
3
- from machineconfig.scripts.python.helpers_devops.cli_utils import download, merge_pdfs, get_machine_specs, init_project, compress_pdf
1
+ from machineconfig.scripts.python.helpers_devops.cli_utils import merge_pdfs, compress_pdf
2
+ from machineconfig.scripts.python.helpers_utils.path import edit_file_with_hx, get_machine_specs, init_project, tui_env
3
+ from machineconfig.scripts.python.helpers_utils.download import download
4
4
  import typer
5
- from typing import Annotated, Optional
6
- from pathlib import Path
5
+ from typing import Annotated
7
6
 
8
7
 
9
8
  def kill_process(
@@ -21,41 +20,40 @@ def kill_process(
21
20
  # )
22
21
 
23
22
 
24
- def add_dev_packages(repo_dir: Annotated[Optional[str], typer.Option(..., "--repo-dir", "-r", help="Path to the repository root directory")] = None):
25
- if repo_dir is None:
26
- r_dir = Path.cwd()
27
- else:
28
- r_dir = Path(repo_dir).resolve()
29
- if not r_dir.exists() or not r_dir.is_dir() or not (r_dir / "pyproject.toml").exists():
30
- typer.echo(f"❌ The provided repo directory `{r_dir}` is not valid or does not contain a `pyproject.toml` file.")
31
- raise typer.Exit(code=1)
32
- command = f"""
33
- cd "{r_dir}" || exit 1
34
- uv add nbformat ipdb ipykernel ipython pylint pyright mypy pyrefly ty pytest
35
- """
36
- from machineconfig.utils.code import run_shell_script
37
- typer.echo(f"➡️ Installing dev packages in repo at `{r_dir}`...")
38
- run_shell_script(command)
39
- typer.echo(f"✅ Dev packages installed successfully in repo at `{r_dir}`.")
40
- # TODO: see upgrade packages.
41
-
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")
42
27
 
43
28
 
44
29
  def get_app() -> typer.Typer:
45
30
  app = typer.Typer(help="🛠️ utilities operations", no_args_is_help=True, add_help_option=False, add_completion=False)
46
- 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)
47
32
  app.command(name="k", no_args_is_help=False, help="Choose a process to kill", hidden=True)(kill_process)
48
- app.command(name="download", no_args_is_help=True, help="[d] Download a file from a URL and optionally decompress it.")(download)
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)
49
41
  app.command(name="d", no_args_is_help=True, hidden=True)(download)
50
- 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)
51
43
  app.command(name="g", no_args_is_help=False, hidden=True)(get_machine_specs)
52
- 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)
53
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)
54
48
 
55
- 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)
56
50
  app.command(name="pm", no_args_is_help=True, hidden=True)(merge_pdfs)
57
- 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)
58
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
+
59
57
  return app
60
58
 
61
59
  # def func():
@@ -63,4 +61,4 @@ def get_app() -> typer.Typer:
63
61
 
64
62
  def main():
65
63
  app = get_app()
66
- app()
64
+ app()
@@ -7,7 +7,7 @@ $user = ''
7
7
  $sharePath = ''
8
8
  $driveLetter = ''
9
9
 
10
- uv run --python 3.14 --with "machineconfig>=6.81" python -m machineconfig.scripts.python.mount_ssh
10
+ uv run --python 3.14 --with "machineconfig>=7.98" python -m machineconfig.scripts.python.mount_ssh
11
11
 
12
12
  net use T: \\sshfs.kr\$user@$host.local
13
13
  # this worked: net use T: \\sshfs\alex@alex-p51s-5.local
@@ -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"
@@ -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"
@@ -51,19 +51,19 @@ map x
51
51
  map c
52
52
  map v
53
53
  map r
54
- map D $diskonaut $env:f
55
- map K $kondo $env:f
54
+ map D $diskonaut $f
55
+ map K $kondo $f
56
56
  map r reload
57
57
 
58
58
 
59
59
  # e edit
60
60
  map e # edit modal key.
61
- map en $nano $env:f
62
- map el $pwsh -File $env:USERPROFILE/.local/bin/lvim.ps1 -- $env:f
63
- map ev $nvim $env:f
64
- map ec $code $env:f
61
+ map en $nano $f
62
+ map el $pwsh -File $env:USERPROFILE/.local/bin/lvim.ps1 -- $f
63
+ map ev $nvim $f
64
+ map ec $code $f
65
65
  map ep $& 'C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2022.2\bin\pycharm.exe' $f
66
- map o $start $env:f
66
+ map o $start $f
67
67
  map <enter> open
68
68
 
69
69
 
@@ -73,27 +73,25 @@ map ww $powershell
73
73
  map wp $pwsh
74
74
  map wc $croshell.ps1
75
75
  map wm $cmd
76
- map i $~/.config/machineconfig/settings/lf/windows/previewer.ps1 $env:f
77
- map R $powershell $env:USERPROFILE/scripts/croshell.ps1 -r $env:f
76
+ map i $~/.config/machineconfig/settings/lf/windows/previewer.ps1 $f
77
+ map R $powershell $env:USERPROFILE/scripts/croshell.ps1 -r $f
78
78
 
79
79
  # o file/folder Operations
80
80
  map o
81
81
  map od cut
82
82
  map op paste
83
83
  map oy copy
84
- map oc $Set-Clipboard -Value $env:f
84
+ map oc $Set-Clipboard -Value $f
85
85
  map c clear
86
86
  map or rename
87
- map <delete> :{{
88
- delete
89
- echo 'FINISHED DELETEING'
90
- }}
87
+ map <delete> delete
88
+ map <del> delete
91
89
  map of reload
92
90
  map os mark-save
93
91
  map ol mark-load
94
92
  map oR mark-remove
95
- map oD !ouch d $env:f
96
- map oC !ouch c $env:f '$env:f'.zip
93
+ map oD !ouch d $f
94
+ map oC !ouch c $f '$f'.zip
97
95
 
98
96
  # j jump
99
97
  map j