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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (461) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/run_cluster.py +1 -1
  3. machineconfig/cluster/remote/run_remote.py +1 -1
  4. machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
  5. machineconfig/cluster/sessions_managers/wt_local.py +17 -222
  6. machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
  7. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  8. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  10. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  12. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  13. machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
  14. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  15. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  16. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  17. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  18. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  19. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  20. machineconfig/jobs/installer/installer_data.json +1500 -310
  21. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  22. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  23. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  24. machineconfig/jobs/installer/package_groups.py +62 -91
  25. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  26. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
  27. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  28. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  29. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  31. machineconfig/jobs/installer/python_scripts/hx.py +214 -0
  32. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
  34. machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
  35. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  37. machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
  38. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  39. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  43. machineconfig/logger.py +1 -2
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +79 -21
  46. machineconfig/profile/create_links_export.py +87 -36
  47. machineconfig/profile/create_shell_profile.py +92 -127
  48. machineconfig/profile/mapper_data.toml +45 -0
  49. machineconfig/profile/mapper_dotfiles.toml +249 -0
  50. machineconfig/scripts/__init__.py +0 -4
  51. machineconfig/scripts/linux/wrap_mcfg +46 -0
  52. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  53. machineconfig/scripts/python/agents.py +85 -165
  54. machineconfig/scripts/python/ai/initai.py +4 -2
  55. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  56. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  57. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  58. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  59. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  60. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  61. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  62. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  63. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  64. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  65. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +6 -6
  66. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
  67. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  68. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  69. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  70. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  71. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  72. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  73. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  74. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
  75. machineconfig/scripts/python/cloud.py +58 -11
  76. machineconfig/scripts/python/croshell.py +10 -162
  77. machineconfig/scripts/python/devops.py +73 -36
  78. machineconfig/scripts/python/devops_navigator.py +16 -6
  79. machineconfig/scripts/python/fire_jobs.py +8 -222
  80. machineconfig/scripts/python/ftpx.py +7 -200
  81. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  82. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  83. machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
  84. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  85. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  86. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  87. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  88. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  89. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  90. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  91. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
  92. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
  93. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  94. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  95. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  96. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  97. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  98. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  99. machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
  100. machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
  101. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
  102. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
  103. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
  104. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
  106. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  107. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  108. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
  109. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  110. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  111. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  112. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  113. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  114. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
  115. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  116. machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
  117. machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
  118. machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
  119. machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
  120. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  121. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
  122. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  123. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
  124. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  125. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  126. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  127. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
  128. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
  129. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  130. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  131. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
  132. machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
  133. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  134. machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
  135. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  136. machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  137. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  138. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  139. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  140. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  141. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  142. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  143. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  144. machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
  145. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  146. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  147. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
  148. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
  149. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  150. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  151. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  152. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  153. machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
  154. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  155. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  156. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
  157. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
  158. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
  159. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
  160. machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
  161. machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
  162. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  163. machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
  164. machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
  165. machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
  166. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  167. machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
  168. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  169. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  170. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
  171. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  172. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  173. machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
  174. machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
  175. machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
  176. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  177. machineconfig/scripts/python/mcfg_entry.py +143 -0
  178. machineconfig/scripts/python/msearch.py +26 -0
  179. machineconfig/scripts/python/sessions.py +69 -135
  180. machineconfig/scripts/python/terminal.py +58 -0
  181. machineconfig/scripts/python/utils.py +115 -38
  182. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  183. machineconfig/settings/atuin/config.toml +294 -0
  184. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  185. machineconfig/settings/broot/conf.toml +1 -1
  186. machineconfig/settings/helix/config.toml +16 -0
  187. machineconfig/settings/helix/languages.toml +13 -4
  188. machineconfig/settings/helix/yazi-picker.sh +12 -0
  189. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  190. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  191. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  192. machineconfig/settings/lf/windows/lfrc +14 -16
  193. machineconfig/settings/linters/.ruff.toml +2 -1
  194. machineconfig/settings/marimo/marimo.toml +1 -1
  195. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  196. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  197. machineconfig/settings/shells/bash/init.sh +47 -12
  198. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  199. machineconfig/settings/shells/nushell/config.nu +25 -33
  200. machineconfig/settings/shells/nushell/env.nu +21 -8
  201. machineconfig/settings/shells/nushell/init.nu +138 -0
  202. machineconfig/settings/shells/pwsh/init.ps1 +111 -17
  203. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  204. machineconfig/settings/shells/starship/starship.toml +16 -0
  205. machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
  206. machineconfig/settings/shells/wt/settings.json +27 -18
  207. machineconfig/settings/shells/zsh/init.sh +42 -23
  208. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  209. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  210. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  211. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  212. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  213. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  214. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  215. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  216. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  217. machineconfig/settings/television/cable_unix/env.toml +17 -0
  218. machineconfig/settings/television/cable_unix/files.toml +11 -0
  219. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  220. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  221. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  222. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  223. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  224. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  225. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  226. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  227. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  228. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  229. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  230. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  231. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  232. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  233. machineconfig/settings/television/cable_unix/text.toml +17 -0
  234. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  235. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  236. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  237. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  238. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  239. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  240. machineconfig/settings/television/cable_windows/env.toml +17 -0
  241. machineconfig/settings/television/cable_windows/files.toml +14 -0
  242. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  243. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  244. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  245. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  246. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  247. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  248. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  249. machineconfig/settings/television/cable_windows/text.toml +17 -0
  250. machineconfig/settings/tv/config.toml +234 -0
  251. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  252. machineconfig/settings/wsl/.wslconfig +5 -30
  253. machineconfig/settings/wt/__init__.py +0 -0
  254. machineconfig/settings/yazi/init.lua +61 -0
  255. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  256. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  257. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  258. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  259. machineconfig/settings/yazi/theme.toml +4 -0
  260. machineconfig/settings/yazi/yazi_linux.toml +94 -0
  261. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  262. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  263. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  264. machineconfig/setup_linux/__init__.py +2 -2
  265. machineconfig/setup_linux/apps_desktop.sh +8 -27
  266. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  267. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
  268. machineconfig/setup_mac/__init__.py +1 -4
  269. machineconfig/setup_mac/apps_gui.sh +248 -0
  270. machineconfig/setup_windows/__init__.py +2 -5
  271. machineconfig/setup_windows/uv.ps1 +8 -1
  272. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
  273. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
  274. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  275. machineconfig/type_hinting/sql/__init__.py +1 -0
  276. machineconfig/type_hinting/sql/base.py +216 -0
  277. machineconfig/type_hinting/sql/core_schema.py +64 -0
  278. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  279. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  280. machineconfig/type_hinting/typedict/__init__.py +1 -0
  281. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  282. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  283. machineconfig/type_hinting/typedict/generators.py +231 -0
  284. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  285. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  286. machineconfig/utils/accessories.py +31 -4
  287. machineconfig/utils/code.py +163 -51
  288. machineconfig/utils/files/ascii_art.py +11 -15
  289. machineconfig/utils/files/headers.py +6 -7
  290. machineconfig/utils/files/read.py +8 -1
  291. machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
  292. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  293. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  294. machineconfig/utils/installer_utils/installer_class.py +53 -102
  295. machineconfig/utils/installer_utils/installer_cli.py +161 -0
  296. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  297. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
  298. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
  299. machineconfig/utils/io.py +94 -9
  300. machineconfig/utils/links.py +56 -38
  301. machineconfig/utils/meta.py +38 -21
  302. machineconfig/utils/options.py +81 -23
  303. machineconfig/utils/options_utils/__init__.py +0 -0
  304. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  305. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  306. machineconfig/utils/options_utils/tv_options.py +37 -0
  307. machineconfig/utils/path_extended.py +52 -102
  308. machineconfig/utils/path_helper.py +76 -23
  309. machineconfig/utils/procs.py +1 -1
  310. machineconfig/utils/scheduler.py +26 -53
  311. machineconfig/utils/scheduling.py +0 -2
  312. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  313. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  314. machineconfig/utils/source_of_truth.py +6 -1
  315. machineconfig/utils/ssh.py +216 -419
  316. machineconfig/utils/ssh_utils/abc.py +5 -0
  317. machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
  318. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  319. machineconfig/utils/ssh_utils/utils.py +158 -0
  320. machineconfig/utils/ssh_utils/wsl.py +147 -0
  321. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  322. machineconfig/utils/terminal.py +1 -0
  323. machineconfig/utils/upgrade_packages.py +107 -35
  324. machineconfig/utils/ve.py +12 -4
  325. machineconfig-8.51.dist-info/METADATA +140 -0
  326. machineconfig-8.51.dist-info/RECORD +543 -0
  327. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
  328. machineconfig/jobs/installer/check_installations.py +0 -248
  329. machineconfig/jobs/installer/custom/hx.py +0 -140
  330. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  331. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  332. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  333. machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
  334. machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
  335. machineconfig/profile/backup.toml +0 -49
  336. machineconfig/profile/mapper.toml +0 -256
  337. machineconfig/scripts/linux/fzf2g +0 -21
  338. machineconfig/scripts/linux/fzfag +0 -17
  339. machineconfig/scripts/linux/fzffg +0 -25
  340. machineconfig/scripts/linux/fzfrga +0 -21
  341. machineconfig/scripts/linux/mcfgs +0 -38
  342. machineconfig/scripts/linux/other/share_smb +0 -1
  343. machineconfig/scripts/linux/other/switch_ip +0 -20
  344. machineconfig/scripts/linux/skrg +0 -4
  345. machineconfig/scripts/linux/warp-cli.sh +0 -122
  346. machineconfig/scripts/linux/z_ls +0 -104
  347. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  348. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -120
  349. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
  350. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  351. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
  352. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
  353. machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
  354. machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
  355. machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
  356. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  357. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  358. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  359. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  360. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  361. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  362. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  363. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  364. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  365. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
  366. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  367. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
  368. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  369. machineconfig/scripts/python/mcfg.py +0 -48
  370. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  371. machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
  372. machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
  373. machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
  374. machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
  375. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  376. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  377. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  378. machineconfig/scripts/windows/fzfrga.bat +0 -20
  379. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  380. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  381. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  382. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  383. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  384. machineconfig/settings/yazi/yazi.toml +0 -4
  385. machineconfig/setup_linux/apps.sh +0 -66
  386. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  387. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  388. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  389. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  390. machineconfig/setup_mac/apps.sh +0 -73
  391. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  392. machineconfig/setup_windows/apps.ps1 +0 -62
  393. machineconfig/setup_windows/others/obs.ps1 +0 -4
  394. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  395. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  396. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  397. machineconfig/utils/installer_utils/installer.py +0 -225
  398. machineconfig/utils/tst.py +0 -20
  399. machineconfig-6.82.dist-info/METADATA +0 -82
  400. machineconfig-6.82.dist-info/RECORD +0 -441
  401. machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  402. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  403. machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
  404. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  405. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  406. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  407. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  408. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  409. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  410. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  411. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  412. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  413. machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  414. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  415. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  416. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  417. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  418. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  419. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  420. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  421. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  422. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  423. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  424. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  425. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  426. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  427. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  428. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  429. machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
  430. machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  431. machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
  432. machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
  433. machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  434. machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  435. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
  437. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  438. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  439. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
  440. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  441. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
  442. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  443. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
  444. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  445. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  446. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  447. /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
  448. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
  449. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  450. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
  451. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  452. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  453. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  454. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  455. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
  456. /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
  457. /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
  458. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  459. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  460. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  461. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,6 @@
1
1
 
2
2
 
3
3
  from typing import Optional, Annotated
4
- from pathlib import Path
5
4
  import typer
6
5
 
7
6
 
@@ -10,23 +9,23 @@ def create_from_function(
10
9
  path: Annotated[str, typer.Option(..., "--path", "-p", help="Path to a Python or Shell script file or a directory containing such files")] = ".",
11
10
  function: Annotated[Optional[str], typer.Option(..., "--function", "-f", help="Function to run from the Python file. If not provided, you will be prompted to choose.")] = None,
12
11
  ):
13
- from machineconfig.utils.ve import get_ve_activate_line, get_ve_path_and_ipython_profile
12
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
14
13
  from machineconfig.utils.options import choose_from_options
15
14
  from machineconfig.utils.path_helper import match_file_name, sanitize_path
16
- from machineconfig.utils.path_extended import PathExtended
17
15
  from machineconfig.utils.accessories import get_repo_root
16
+ from pathlib import Path
18
17
 
19
18
  path_obj = sanitize_path(path)
20
19
  if not path_obj.exists():
21
20
  suffixes = {".py"}
22
- choice_file = match_file_name(sub_string=path, search_root=PathExtended.cwd(), suffixes=suffixes)
21
+ choice_file = match_file_name(sub_string=path, search_root=Path.cwd(), suffixes=suffixes)
23
22
  elif path_obj.is_dir():
24
- from machineconfig.scripts.python.helpers_fire.helpers4 import search_for_files_of_interest
23
+ from machineconfig.utils.path_helper import search_for_files_of_interest
25
24
  print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
26
- files = search_for_files_of_interest(path_obj)
25
+ files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
27
26
  print(f"🔍 Got #{len(files)} results.")
28
- choice_file = choose_from_options(multi=False, options=files, fzf=True, msg="Choose one option")
29
- choice_file = PathExtended(choice_file)
27
+ choice_file = choose_from_options(multi=False, options=files, tv=True, msg="Choose one option")
28
+ choice_file = Path(choice_file)
30
29
  else:
31
30
  choice_file = path_obj
32
31
 
@@ -36,14 +35,17 @@ def create_from_function(
36
35
  ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(choice_file)
37
36
  if ipy_profile is None:
38
37
  ipy_profile = "default"
39
- if ve_root_from_file is None:
40
- raise ValueError(f"Could not determine virtual environment for file {choice_file}. Please ensure it is within a recognized project structure.")
41
-
42
- _activate_ve_line = get_ve_activate_line(ve_root=ve_root_from_file)
38
+ # if ve_root_from_file is None:
39
+ # raise ValueError(f"Could not determine virtual environment for file {choice_file}. Please ensure it is within a recognized project structure.")
40
+ # _activate_ve_line = get_ve_activate_line(ve_root=ve_root_from_file)
41
+ if ve_root_from_file is not None:
42
+ start_dir = Path(ve_root_from_file).parent
43
+ else:
44
+ start_dir = Path.cwd()
43
45
 
44
46
  # ========================= choosing function to run
45
47
  if function is None or function.strip() == "":
46
- from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
48
+ from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
47
49
  choice_function, choice_file, _kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict={})
48
50
  else:
49
51
  choice_function = function
@@ -52,7 +54,11 @@ def create_from_function(
52
54
  from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
53
55
  layout: LayoutConfig = {"layoutName": "fireNprocess", "layoutTabs": []}
54
56
  for an_arg in range(num_process):
55
- layout["layoutTabs"].append({"tabName": f"tab{an_arg}", "startDir": str(PathExtended.cwd()), "command": f"uv run -m fire {choice_file} {choice_function} --idx={an_arg} --idx_max={num_process}"})
57
+ layout["layoutTabs"].append({
58
+ "tabName": f"tab{an_arg}",
59
+ "startDir": str(start_dir),
60
+ "command": f"uv run python -m fire {choice_file} {choice_function} --idx={an_arg} --idx_max={num_process}"
61
+ })
56
62
  print(layout)
57
63
  run_zellij_layout(layout_config=layout)
58
64
 
@@ -0,0 +1,96 @@
1
+ import re
2
+ import subprocess
3
+ from pathlib import Path
4
+
5
+
6
+ _ANSI_ESCAPE_RE = re.compile(
7
+ r"(?:\x1B|\u001B|\033)\[[0-?]*[ -/]*[@-~]|\[[0-9;?]+[ -/]*[@-~]|\[m"
8
+ )
9
+
10
+
11
+ def strip_ansi_codes(text: str) -> str:
12
+ return _ANSI_ESCAPE_RE.sub("", text)
13
+
14
+
15
+ def choose_zellij_session(name: str | None, new_session: bool, kill_all: bool) -> tuple[str, str | None]:
16
+ """Choose a Zellij session. Returns tuple of (action, script_to_run) where action is 'run_script', 'exit', or 'error'."""
17
+ if name is not None:
18
+ return ("run_script", f"zellij attach {name}")
19
+ if new_session:
20
+ cmd = "zellij --layout st2"
21
+ if kill_all:
22
+ cmd = f"zellij kill-all-sessions --yes\n{cmd}"
23
+ return ("run_script", cmd)
24
+ cmd = "zellij list-sessions"
25
+ try:
26
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
27
+ except subprocess.CalledProcessError:
28
+ sessions = []
29
+ sessions = [s for s in sessions if s.strip()]
30
+ # print(f"Found Zellij sessions: {sessions}")
31
+ sessions.sort(key=lambda s: "EXITED" in s)
32
+ if "current" in sessions:
33
+ return ("error", "Already in a Zellij session, avoiding nesting and exiting.")
34
+ if len(sessions) == 0:
35
+ return ("run_script", "zellij --layout st2")
36
+ if len(sessions) == 1:
37
+ sn = strip_ansi_codes(sessions[0])
38
+ session_name = sn.split(" [Created")[0]
39
+ return ("run_script", f"zellij attach {session_name}")
40
+ from machineconfig.utils.options import choose_from_options
41
+ NEW_SESSION_LABEL = "NEW SESSION"
42
+ KILL_ALL_AND_NEW_LABEL = "KILL ALL SESSIONS & START NEW"
43
+ options = sessions + [NEW_SESSION_LABEL, KILL_ALL_AND_NEW_LABEL]
44
+ try:
45
+ session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
46
+ except Exception as e:
47
+ return ("error", f"Error choosing Zellij session: {e}")
48
+ if session_name == NEW_SESSION_LABEL:
49
+ cmd = "zellij --layout st2"
50
+ if kill_all:
51
+ cmd = f"zellij kill-all-sessions --yes\n{cmd}"
52
+ return ("run_script", cmd)
53
+ if session_name == KILL_ALL_AND_NEW_LABEL:
54
+ return ("run_script", "zellij kill-all-sessions --yes\nzellij --layout st2")
55
+ session_name_clean = strip_ansi_codes(session_name)
56
+ session_name_clean = session_name_clean.split(" [Created")[0]
57
+ return ("run_script", f"zellij attach {session_name_clean}")
58
+
59
+
60
+ def get_session_tabs() -> list[tuple[str, str]]:
61
+ cmd = "zellij list-sessions"
62
+ try:
63
+ sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
64
+ except subprocess.CalledProcessError:
65
+ sessions = []
66
+ sessions = [strip_ansi_codes(s) for s in sessions]
67
+ active_sessions = [s for s in sessions if "EXITED" not in s]
68
+ result: list[tuple[str, str]] = []
69
+ for session_line in active_sessions:
70
+ session_name = session_line.split(" [Created")[0].strip()
71
+ tab_cmd = f"zellij --session {session_name} action query-tab-names"
72
+ try:
73
+ tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
74
+ for tab in tabs:
75
+ if tab.strip():
76
+ result.append((session_name, tab.strip()))
77
+ except subprocess.CalledProcessError:
78
+ continue
79
+ return result
80
+
81
+
82
+ def start_wt(layout_name: str) -> tuple[str, str | None]:
83
+ """Start a Windows Terminal layout by name. Returns tuple of (status, message) where status is 'success' or 'error'."""
84
+ import json
85
+ from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
86
+ from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
87
+ layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
88
+ if not layouts_file.exists():
89
+ return ("error", f"❌ Layouts file not found: {layouts_file}")
90
+ layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
91
+ chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
92
+ if not chosen_layout:
93
+ available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
94
+ return ("error", f"❌ Layout '{layout_name}' not found in layouts file.\nAvailable layouts: {', '.join(available_layouts)}")
95
+ run_wt_layout(layout_config=chosen_layout)
96
+ return ("success", None)
@@ -0,0 +1,150 @@
1
+
2
+
3
+ from typing import Annotated, Optional
4
+ import typer
5
+ from pathlib import Path
6
+
7
+
8
+ def download(
9
+ url: Annotated[Optional[str], typer.Argument(..., help="The URL to download the file from.")] = None,
10
+ decompress: Annotated[bool, typer.Option(..., "--decompress", "-d", help="Decompress the file if it's an archive.")] = False,
11
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="The output file path.")] = None,
12
+ output_dir: Annotated[Optional[str], typer.Option("--output-dir", help="Directory to place the downloaded file in.")] = None,
13
+ ) -> Optional["Path"]:
14
+ import subprocess
15
+ from urllib.parse import parse_qs, unquote, urlparse
16
+ from requests import Response
17
+ import requests
18
+ from pathlib import Path
19
+ if url is None:
20
+ typer.echo("❌ Error: URL is required.", err=True)
21
+ return None
22
+ if output is not None and output_dir is not None:
23
+ typer.echo("❌ Error: --output and --output-dir cannot be used together.", err=True)
24
+ return None
25
+ typer.echo(f" {url}")
26
+
27
+ def _sanitize_candidate_filename(name: str) -> Optional[str]:
28
+ candidate = Path(name).name.strip()
29
+ if not candidate or candidate in {".", ".."}:
30
+ return None
31
+ return candidate
32
+
33
+ def _filename_from_content_disposition(header_value: Optional[str]) -> Optional[str]:
34
+ if header_value is None:
35
+ return None
36
+ parts = [segment.strip() for segment in header_value.split(";")]
37
+ for part in parts:
38
+ lower = part.lower()
39
+ if lower.startswith("filename*="):
40
+ value = part.split("=", 1)[1]
41
+ value = value.strip().strip('"')
42
+ if "''" in value:
43
+ value = value.split("''", 1)[1]
44
+ decoded = unquote(value)
45
+ sanitized = _sanitize_candidate_filename(decoded)
46
+ if sanitized is not None:
47
+ return sanitized
48
+ if lower.startswith("filename="):
49
+ value = part.split("=", 1)[1].strip().strip('"')
50
+ decoded = unquote(value)
51
+ sanitized = _sanitize_candidate_filename(decoded)
52
+ if sanitized is not None:
53
+ return sanitized
54
+ return None
55
+
56
+ def _filename_from_url(source_url: str) -> Optional[str]:
57
+ parsed = urlparse(source_url)
58
+ url_candidate = _sanitize_candidate_filename(unquote(Path(parsed.path).name))
59
+ if url_candidate is not None:
60
+ return url_candidate
61
+ query_params = parse_qs(parsed.query, keep_blank_values=True)
62
+ for key, values in query_params.items():
63
+ lower_key = key.lower()
64
+ if "name" in lower_key or "file" in lower_key:
65
+ for value in values:
66
+ sanitized = _sanitize_candidate_filename(unquote(value))
67
+ if sanitized is not None:
68
+ return sanitized
69
+ return None
70
+
71
+ def _resolve_download_path(request_url: str, response: Response, requested_output: Optional[str], requested_output_dir: Optional[str]) -> Path:
72
+ if requested_output is not None:
73
+ return Path(requested_output)
74
+ header_candidate = _filename_from_content_disposition(response.headers.get("content-disposition"))
75
+ if header_candidate is None:
76
+ header_candidate = _filename_from_url(response.url)
77
+ if header_candidate is None:
78
+ header_candidate = _filename_from_url(request_url)
79
+ if header_candidate is None:
80
+ header_candidate = "downloaded_file"
81
+ if requested_output_dir is not None:
82
+ return Path(requested_output_dir) / header_candidate
83
+ return Path(header_candidate)
84
+
85
+ try:
86
+ with requests.get(url, allow_redirects=True, stream=True, timeout=60) as response:
87
+ response.raise_for_status()
88
+ download_path = _resolve_download_path(url, response, output, output_dir)
89
+ download_path.parent.mkdir(parents=True, exist_ok=True)
90
+ total_size_header = response.headers.get("content-length", "0")
91
+ try:
92
+ total_size = int(total_size_header)
93
+ except (TypeError, ValueError):
94
+ total_size = 0
95
+ if total_size <= 0:
96
+ with open(download_path, "wb") as file_handle:
97
+ file_handle.write(response.content)
98
+ else:
99
+ downloaded = 0
100
+ chunk_size = 8192 * 40
101
+ with open(download_path, "wb") as file_handle:
102
+ for chunk in response.iter_content(chunk_size=chunk_size):
103
+ if not chunk:
104
+ continue
105
+ file_handle.write(chunk)
106
+ downloaded += len(chunk)
107
+ progress = (downloaded / total_size) * 100
108
+ typer.echo(f"\r⏬ Progress: {progress:.1f}% ({downloaded}/{total_size} bytes)", nl=False)
109
+ typer.echo()
110
+ except requests.exceptions.RequestException as exception:
111
+ typer.echo(f"❌ Download failed: {exception}", err=True)
112
+ return None
113
+ except OSError as exception:
114
+ typer.echo(f"❌ File write error: {exception}", err=True)
115
+ return None
116
+
117
+ typer.echo(f"✅ Downloaded to: {download_path}")
118
+ result_path: Path = download_path
119
+ if decompress:
120
+ typer.echo(f"📦 Decompressing: {download_path}")
121
+ base_name = download_path.name.split(".", maxsplit=1)[0] # ouch decompresses all (e.g. .tar.gz) in one go.
122
+ if base_name in {"", ".", ".."}:
123
+ base_name = "extracted"
124
+ extract_dir = download_path.parent / base_name
125
+ extract_dir.mkdir(parents=True, exist_ok=True)
126
+ try:
127
+ subprocess.run(
128
+ ["ouch", "decompress", str(download_path), "--dir", str(extract_dir)],
129
+ check=True,
130
+ capture_output=True,
131
+ text=True,
132
+ )
133
+ typer.echo(f"✅ Decompressed to: {extract_dir}")
134
+ if download_path.exists():
135
+ download_path.unlink()
136
+ typer.echo(f"🗑️ Removed archive: {download_path}")
137
+ result_path = extract_dir
138
+ except subprocess.CalledProcessError as exception:
139
+ typer.echo(f"❌ Decompression failed: {exception.stderr}", err=True)
140
+ return None
141
+ except FileNotFoundError:
142
+ typer.echo("❌ Error: ouch command not found. Please install ouch.", err=True)
143
+ typer.echo("💡 Install with: cargo install ouch", err=True)
144
+ return None
145
+
146
+ return result_path.resolve()
147
+
148
+
149
+ if __name__ == "__main__":
150
+ pass
@@ -0,0 +1,96 @@
1
+
2
+
3
+ import typer
4
+ from typing import Annotated, Optional
5
+
6
+
7
+ def merge_pdfs(
8
+ pdfs: Annotated[list[str], typer.Argument(..., help="Paths to the PDF files to merge.")],
9
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output merged PDF file path.")] = None,
10
+ compress: Annotated[bool, typer.Option("--compress", "-c", help="Compress the output PDF.")] = False,
11
+ ) -> None:
12
+ def merge_pdfs_internal(pdfs: list[str], output: str | None, compress: bool) -> None:
13
+ from pypdf import PdfReader, PdfWriter
14
+ writer = PdfWriter()
15
+ for pdf_path in pdfs:
16
+ reader = PdfReader(pdf_path)
17
+ for page in reader.pages:
18
+ writer.add_page(page)
19
+ output_path = output if output else "merged.pdf"
20
+ if compress:
21
+ try:
22
+ for p in writer.pages:
23
+ try:
24
+ # PageObject.compress_content_streams exists in pypdf
25
+ p.compress_content_streams()
26
+ except Exception:
27
+ # best-effort: ignore per-page compression failures
28
+ continue
29
+ except Exception:
30
+ pass
31
+ try:
32
+ writer.compress_identical_objects()
33
+ except Exception:
34
+ # non-fatal if this fails
35
+ pass
36
+ writer.write(output_path)
37
+ print(f"✅ Merged PDF saved to: {output_path}")
38
+ from machineconfig.utils.meta import lambda_to_python_script
39
+ code = lambda_to_python_script(lambda : merge_pdfs_internal(pdfs=pdfs, output=output, compress=compress),
40
+ in_global=True, import_module=False)
41
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
42
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pypdf"], uv_project_dir=None)
43
+ run_shell_script(uv_command, display_script=True, clean_env=False)
44
+
45
+
46
+ def compress_pdf(
47
+ pdf_input: Annotated[str, typer.Argument(..., help="Path to the input PDF file to compress.")],
48
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output compressed PDF file path.")] = None,
49
+ quality: Annotated[int, typer.Option("--quality", "-q", help="JPEG quality for image compression (0-100, 0=no change, 100=best).")] = 85,
50
+ image_dpi: Annotated[int, typer.Option("--image-dpi", "-d", help="Target DPI for image resampling. If set, images above this DPI will be downsampled.")] = 0,
51
+ # remove_images: Annotated[bool, typer.Option("--remove-images", "-r", help="Remove all images from the PDF.")] = False,
52
+ compress_streams: Annotated[bool, typer.Option("--compress-streams", "-c", help="Compress uncompressed streams.")] = True,
53
+ use_objstms: Annotated[bool, typer.Option("--object-streams", "-s", help="Use object streams for additional compression.")] = True,
54
+ ) -> None:
55
+ def compress_pdf_internal(pdf_input: str, output: str | None, quality: int, image_dpi: int, compress_streams: bool, use_objstms: bool) -> None:
56
+ import pymupdf
57
+ from pathlib import Path
58
+ output_path = output if output else pdf_input.replace(".pdf", "_compressed.pdf")
59
+ doc = pymupdf.open(pdf_input)
60
+ try:
61
+ # if remove_images:
62
+ # for page in doc:
63
+ # page.remove_images()
64
+ if quality > 0 or image_dpi > 0:
65
+ doc.rewrite_images(
66
+ dpi_threshold=image_dpi if image_dpi > 0 else None,
67
+ dpi_target=max(72, image_dpi - 10) if image_dpi > 72 else 72,
68
+ quality=quality,
69
+ lossy=True,
70
+ lossless=True,
71
+ )
72
+ doc.save(
73
+ output_path,
74
+ deflate=compress_streams,
75
+ garbage=3,
76
+ use_objstms=1 if use_objstms else 0,
77
+ )
78
+ input_size = Path(pdf_input).stat().st_size
79
+ output_size = Path(output_path).stat().st_size
80
+ ratio = (1 - output_size / input_size) * 100
81
+ print(f"✅ Compressed PDF saved to: {output_path}")
82
+ print(f" Original: {input_size / 1024 / 1024:.2f} MB")
83
+ print(f" Compressed: {output_size / 1024 / 1024:.2f} MB")
84
+ print(f" Reduction: {ratio:.1f}%")
85
+ finally:
86
+ doc.close()
87
+ from machineconfig.utils.meta import lambda_to_python_script
88
+ code = lambda_to_python_script(
89
+ lambda: compress_pdf_internal(pdf_input=pdf_input, output=output, quality=quality, image_dpi=image_dpi, compress_streams=compress_streams, use_objstms=use_objstms),
90
+ in_global=True,
91
+ import_module=False,
92
+ )
93
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
94
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pymupdf"], uv_project_dir=None)
95
+ run_shell_script(uv_command, display_script=True, clean_env=False)
96
+
@@ -0,0 +1,210 @@
1
+ import typer
2
+ from typing import Optional, Annotated, Literal, TypedDict, cast
3
+ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION
4
+
5
+
6
+ def tui_env(which: Annotated[Literal["PATH", "p", "ENV", "e"], typer.Argument(help="Which environment variable to display.")] = "ENV") -> None:
7
+ """📚 NAVIGATE PATH variable with TUI"""
8
+ from machineconfig.scripts.python.helpers import helper_env as navigator
9
+ from pathlib import Path
10
+
11
+ match which:
12
+ case "PATH" | "p":
13
+ path = Path(navigator.__file__).resolve().parent.joinpath("path_manager_tui.py")
14
+ case "ENV" | "e":
15
+ path = Path(navigator.__file__).resolve().parent.joinpath("env_manager_tui.py")
16
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
17
+
18
+ uv_with = ["textual"]
19
+ uv_project_dir = None
20
+ if not Path.home().joinpath("code/machineconfig").exists():
21
+ uv_with.append(MACHINECONFIG_VERSION)
22
+ else:
23
+ uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
24
+ run_shell_script(
25
+ get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0],
26
+ display_script=True,
27
+ clean_env=False,
28
+ )
29
+
30
+
31
+ def init_project(
32
+ name: Annotated[Optional[str], typer.Option("--name", "-n", help="Name of the project.")] = None,
33
+ tmp_dir: Annotated[bool, typer.Option("--tmp-dir", "-t", help="Use a temporary directory for the project initialization.")] = False,
34
+ python: Annotated[
35
+ Literal["3.11", "3.12", "3.13", "3.14"], typer.Option("--python", "-p", help="Python sub version for the uv virtual environment.")
36
+ ] = "3.13",
37
+ libraries: Annotated[
38
+ Optional[str], typer.Option("--libraries", "-l", help="Additional packages to include in the uv virtual environment (space separated).")
39
+ ] = None,
40
+ group: Annotated[
41
+ Optional[str], typer.Option("--group", "-g", help="group of packages names (no separation) p:plot, t:types, l:linting, i:interactive, d:data")
42
+ ] = "p,t,l,i,d",
43
+ ) -> None:
44
+ if libraries is not None:
45
+ packages_add_line = f"uv add {libraries}"
46
+ else:
47
+ packages_add_line = ""
48
+ from pathlib import Path
49
+
50
+ if not tmp_dir:
51
+ repo_root = Path.cwd()
52
+ if not (repo_root / "pyproject.toml").exists():
53
+ typer.echo(f"❌ Error: pyproject.toml not found in {repo_root}", err=True)
54
+ raise typer.Exit(code=1)
55
+ starting_code = ""
56
+ agents_line = ""
57
+ else:
58
+ agents_line = """agents make-config"""
59
+ if name is not None:
60
+ from machineconfig.utils.accessories import randstr
61
+
62
+ repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{name}")
63
+ else:
64
+ from machineconfig.utils.accessories import randstr
65
+
66
+ repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{randstr(6)}")
67
+ repo_root.mkdir(parents=True, exist_ok=True)
68
+ print(f"Using temporary directory for project initialization: {repo_root}")
69
+ starting_code = f"""
70
+ cd {repo_root}
71
+ uv init --python {python}
72
+ uv venv
73
+ """
74
+ print(f"Adding group `{group}` with common data science and plotting packages...")
75
+ total_packages: dict[str, list[str]] = {}
76
+ if group is not None:
77
+ packages = group.split(",")
78
+ if "t" in packages or "types" in packages:
79
+ total_packages["types"] = [
80
+ "types-python-dateutil",
81
+ "types-pyyaml",
82
+ "types-requests",
83
+ "types-tqdm",
84
+ "types-mysqlclient",
85
+ "types-paramiko",
86
+ "types-pytz",
87
+ "types-sqlalchemy",
88
+ "types-toml",
89
+ "types-urllib3",
90
+ ]
91
+ if "l" in packages:
92
+ total_packages["linting"] = ["mypy", "pyright", "ruff", "pylint", "pyrefly", "cleanpy", "ipdb", "pudb"]
93
+ if "i" in packages:
94
+ total_packages["interactive"] = ["ipython", "ipykernel", "jupyterlab", "nbformat", "marimo"]
95
+ if "p" in packages:
96
+ total_packages["plot"] = ["python-magic", "matplotlib", "plotly", "kaleido"]
97
+ if "d" in packages:
98
+ total_packages["data"] = ["numpy", "pandas", "polars", "duckdb-engine", "sqlalchemy", "psycopg2-binary", "pyarrow", "tqdm", "openpyxl"]
99
+ from machineconfig.utils.ve import get_ve_activate_line
100
+ groups_packages_lines = "\n".join(
101
+ [f"uv add --group {group_name} {' '.join(packages)}" for group_name, packages in total_packages.items()]
102
+ )
103
+ script = f"""
104
+ {starting_code}
105
+ {packages_add_line}
106
+ {groups_packages_lines}
107
+ {get_ve_activate_line(ve_root=str(repo_root.joinpath(".venv")))}
108
+ {agents_line}
109
+ ls
110
+ """
111
+ from machineconfig.utils.code import exit_then_run_shell_script, run_shell_script
112
+ exit_then_run_shell_script(script)
113
+ _ = exit_then_run_shell_script, run_shell_script
114
+ # run_shell_script(script)
115
+ # if tempdir:
116
+ # from machineconfig.scripts.python.ai.initai import add_ai_configs
117
+ # add_ai_configs(repo_root=repo_root)
118
+
119
+
120
+ def edit_file_with_hx(
121
+ path: Annotated[Optional[str], typer.Argument(..., help="The root directory of the project to edit, or a file path.")] = None,
122
+ ) -> None:
123
+ from pathlib import Path
124
+
125
+ if path is None:
126
+ root_path = Path.cwd()
127
+ print(f"No path provided. Using current working directory: {root_path}")
128
+ else:
129
+ root_path = Path(path).expanduser().resolve()
130
+ print(f"Using provided path: {root_path}")
131
+ from machineconfig.utils.accessories import get_repo_root
132
+
133
+ repo_root = get_repo_root(root_path)
134
+ if repo_root is not None and repo_root.joinpath("pyproject.toml").exists():
135
+ code = f"""
136
+ cd {repo_root}
137
+ uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp # for helix editor.
138
+ source ./.venv/bin/activate
139
+ """
140
+ else:
141
+ code = ""
142
+ if root_path.is_file():
143
+ code += f"hx {root_path}"
144
+ else:
145
+ code += "hx"
146
+ from machineconfig.utils.code import exit_then_run_shell_script
147
+
148
+ exit_then_run_shell_script(code)
149
+
150
+
151
+ class MachineSpecs(TypedDict):
152
+ system: Literal["Windows", "Linux", "Darwin"]
153
+ distro: str
154
+ home_dir: str
155
+ hostname: str
156
+ release: str
157
+ version: str
158
+ machine: str
159
+ processor: str
160
+ python_version: str
161
+ user: str
162
+
163
+
164
+ def get_machine_specs(hardware: Annotated[bool, typer.Option(..., "--hardware", "-h", help="Show compute capability")] = False) -> MachineSpecs:
165
+ """Write print and return the local machine specs."""
166
+ if hardware:
167
+ from machineconfig.scripts.python.helpers.helpers_utils.specs import main
168
+ main()
169
+ import sys
170
+ sys.exit()
171
+
172
+ import platform
173
+ from machineconfig.utils.code import get_uv_command
174
+
175
+ uv_cmd = get_uv_command(platform=platform.system()) # type: ignore
176
+ command = f"""{uv_cmd} run --with distro python -c "import distro; print(distro.name(pretty=True))" """
177
+ import subprocess
178
+ from pathlib import Path
179
+ import socket
180
+ import os
181
+
182
+ distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
183
+ system = platform.system()
184
+ if system not in {"Windows", "Linux", "Darwin"}:
185
+ system = "Linux"
186
+ specs: MachineSpecs = {
187
+ "system": cast(Literal["Windows", "Linux", "Darwin"], system),
188
+ "distro": distro,
189
+ "home_dir": str(Path.home()),
190
+ "hostname": socket.gethostname(),
191
+ "release": platform.release(),
192
+ "version": platform.version(),
193
+ "machine": platform.machine(),
194
+ "processor": platform.processor() or "Unknown",
195
+ "python_version": platform.python_version(),
196
+ "user": os.getenv("USER") or os.getenv("USERNAME") or "Unknown",
197
+ }
198
+ print(specs)
199
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
200
+
201
+ path = CONFIG_ROOT.joinpath("machine_specs.json")
202
+ CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
203
+ import json
204
+
205
+ path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
206
+ return specs
207
+
208
+
209
+ if __name__ == "__main__":
210
+ get_machine_specs()