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

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

Potentially problematic release.


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

Files changed (402) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  5. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  6. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  7. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  8. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  9. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  10. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  12. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  13. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  14. machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
  15. machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
  16. machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
  17. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  18. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
  19. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
  20. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
  21. machineconfig/jobs/installer/check_installations.py +0 -1
  22. machineconfig/jobs/installer/installer_data.json +1408 -201
  23. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  24. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  25. machineconfig/jobs/installer/package_groups.py +63 -92
  26. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  27. machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
  28. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  29. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  31. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  32. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  34. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  35. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  37. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  38. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  39. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  43. machineconfig/logger.py +0 -1
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +2 -1
  46. machineconfig/profile/create_links_export.py +64 -18
  47. machineconfig/profile/create_shell_profile.py +90 -132
  48. machineconfig/profile/mapper.toml +18 -8
  49. machineconfig/scripts/__init__.py +0 -4
  50. machineconfig/scripts/linux/wrap_mcfg +46 -0
  51. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  52. machineconfig/scripts/python/agents.py +82 -60
  53. machineconfig/scripts/python/ai/initai.py +1 -19
  54. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  55. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  56. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  57. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  58. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  59. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  60. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  61. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  62. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  63. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  64. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  65. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  66. machineconfig/scripts/python/cloud.py +14 -9
  67. machineconfig/scripts/python/croshell.py +135 -117
  68. machineconfig/scripts/python/devops.py +48 -25
  69. machineconfig/scripts/python/devops_navigator.py +1 -5
  70. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  71. machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
  72. machineconfig/scripts/python/fire_jobs.py +127 -118
  73. machineconfig/scripts/python/ftpx.py +44 -17
  74. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  75. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  76. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  77. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  78. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  79. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  80. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  81. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  82. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  83. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
  84. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  85. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  86. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  87. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  88. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  89. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  90. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  91. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  92. machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
  93. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
  94. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
  95. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
  96. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
  97. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  98. machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
  99. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  100. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  101. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  102. machineconfig/scripts/python/helpers_devops/cli_nw.py +221 -0
  103. machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
  104. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  105. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  106. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  107. machineconfig/scripts/python/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
  108. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
  109. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
  110. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
  111. machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
  112. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  113. machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
  114. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
  115. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
  116. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  117. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  118. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  119. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  120. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  121. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
  122. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
  123. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
  124. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
  125. machineconfig/scripts/python/helpers_network/address.py +176 -0
  126. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  127. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  128. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  129. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  130. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  131. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  132. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  133. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  134. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  135. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  136. machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
  137. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
  138. machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
  139. machineconfig/scripts/python/helpers_repos/grource.py +2 -2
  140. machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
  141. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  142. machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  143. machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
  144. machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
  145. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  146. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  147. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  148. machineconfig/scripts/python/interactive.py +26 -35
  149. machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
  150. machineconfig/scripts/python/msearch.py +72 -0
  151. machineconfig/scripts/python/sessions.py +101 -38
  152. machineconfig/scripts/python/terminal.py +136 -0
  153. machineconfig/scripts/python/utils.py +62 -0
  154. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  155. machineconfig/settings/broot/conf.toml +1 -1
  156. machineconfig/settings/helix/config.toml +16 -0
  157. machineconfig/settings/helix/languages.toml +13 -4
  158. machineconfig/settings/helix/yazi-picker.sh +12 -0
  159. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  160. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  161. machineconfig/settings/lf/linux/lfrc +10 -11
  162. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  163. machineconfig/settings/lf/windows/lfrc +15 -17
  164. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  165. machineconfig/settings/linters/.ruff.toml +1 -1
  166. machineconfig/settings/marimo/marimo.toml +80 -0
  167. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  168. machineconfig/settings/shells/bash/init.sh +57 -10
  169. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  170. machineconfig/settings/shells/nushell/config.nu +2 -35
  171. machineconfig/settings/shells/nushell/env.nu +45 -6
  172. machineconfig/settings/shells/nushell/init.nu +314 -0
  173. machineconfig/settings/shells/pwsh/init.ps1 +59 -23
  174. machineconfig/settings/shells/starship/starship.toml +16 -0
  175. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  176. machineconfig/settings/shells/wt/settings.json +32 -17
  177. machineconfig/settings/shells/zsh/init.sh +89 -0
  178. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  179. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  180. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  181. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  182. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  183. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  184. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  185. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  186. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  187. machineconfig/settings/television/cable_unix/env.toml +17 -0
  188. machineconfig/settings/television/cable_unix/files.toml +11 -0
  189. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  190. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  191. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  192. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  193. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  194. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  195. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  196. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  197. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  198. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  199. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  200. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  201. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  202. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  203. machineconfig/settings/television/cable_unix/text.toml +17 -0
  204. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  205. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  206. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  207. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  208. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  209. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  210. machineconfig/settings/television/cable_windows/env.toml +17 -0
  211. machineconfig/settings/television/cable_windows/files.toml +14 -0
  212. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  213. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  214. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  215. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  216. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  217. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  218. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  219. machineconfig/settings/television/cable_windows/text.toml +17 -0
  220. machineconfig/settings/yazi/init.lua +61 -0
  221. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  222. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  223. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  224. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  225. machineconfig/settings/yazi/theme.toml +4 -0
  226. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  227. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  228. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  229. machineconfig/setup_linux/__init__.py +2 -2
  230. machineconfig/setup_linux/apps_desktop.sh +8 -27
  231. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
  232. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  233. machineconfig/setup_mac/__init__.py +16 -0
  234. machineconfig/setup_mac/apps_gui.sh +248 -0
  235. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  236. machineconfig/setup_mac/uv.sh +36 -0
  237. machineconfig/setup_windows/__init__.py +3 -5
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  239. machineconfig/setup_windows/uv.ps1 +8 -1
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -10
  241. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  242. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  243. machineconfig/utils/accessories.py +7 -5
  244. machineconfig/utils/code.py +143 -167
  245. machineconfig/utils/files/art/fat_croco.txt +10 -0
  246. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  247. machineconfig/utils/files/art/happy_croco.txt +22 -0
  248. machineconfig/utils/files/art/water_croco.txt +11 -0
  249. machineconfig/utils/files/ascii_art.py +1 -1
  250. machineconfig/utils/files/headers.py +6 -11
  251. machineconfig/utils/files/read.py +3 -9
  252. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  253. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  254. machineconfig/utils/installer_utils/installer_class.py +44 -101
  255. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  256. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  257. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +39 -87
  258. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
  259. machineconfig/utils/io.py +77 -4
  260. machineconfig/utils/links.py +56 -38
  261. machineconfig/utils/meta.py +235 -145
  262. machineconfig/utils/options.py +46 -18
  263. machineconfig/utils/options_tv.py +119 -0
  264. machineconfig/utils/path_extended.py +46 -97
  265. machineconfig/utils/path_helper.py +76 -23
  266. machineconfig/utils/procs.py +10 -23
  267. machineconfig/utils/scheduler.py +84 -115
  268. machineconfig/utils/scheduling.py +0 -3
  269. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  271. machineconfig/utils/ssh.py +214 -476
  272. machineconfig/utils/ssh_utils/abc.py +5 -0
  273. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  274. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  275. machineconfig/utils/ssh_utils/utils.py +142 -0
  276. machineconfig/utils/ssh_utils/wsl.py +210 -0
  277. machineconfig/utils/terminal.py +3 -113
  278. machineconfig/utils/upgrade_packages.py +114 -28
  279. machineconfig/utils/ve.py +12 -4
  280. machineconfig-8.12.dist-info/METADATA +132 -0
  281. machineconfig-8.12.dist-info/RECORD +504 -0
  282. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
  283. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  284. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  285. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  286. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  287. machineconfig/jobs/python/vscode/api.py +0 -57
  288. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -12
  289. machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
  290. machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
  291. machineconfig/scripts/linux/fzf2g +0 -21
  292. machineconfig/scripts/linux/fzfag +0 -17
  293. machineconfig/scripts/linux/fzffg +0 -25
  294. machineconfig/scripts/linux/fzfrga +0 -21
  295. machineconfig/scripts/linux/other/share_smb +0 -1
  296. machineconfig/scripts/linux/other/switch_ip +0 -20
  297. machineconfig/scripts/linux/skrg +0 -4
  298. machineconfig/scripts/linux/warp-cli.sh +0 -122
  299. machineconfig/scripts/linux/z_ls +0 -104
  300. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  301. machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
  302. machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
  303. machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
  304. machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
  305. machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
  306. machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
  307. machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
  308. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  309. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  310. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  311. machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
  312. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  313. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  314. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  315. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  316. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  317. machineconfig/scripts/python/repos_helpers/action.py +0 -378
  318. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
  319. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  320. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  321. machineconfig/scripts/windows/fzfrga.bat +0 -20
  322. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  323. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  324. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  325. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  326. machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  327. machineconfig/settings/yazi/keymap.toml +0 -0
  328. machineconfig/settings/yazi/yazi.toml +0 -4
  329. machineconfig/setup_linux/apps.sh +0 -66
  330. machineconfig/setup_linux/nix/cli_installation.sh +0 -137
  331. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  332. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  333. machineconfig/setup_windows/apps.ps1 +0 -62
  334. machineconfig/setup_windows/others/obs.ps1 +0 -4
  335. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  336. machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  337. machineconfig/utils/installer_utils/installer.py +0 -225
  338. machineconfig-6.23.dist-info/METADATA +0 -84
  339. machineconfig-6.23.dist-info/RECORD +0 -428
  340. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  341. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
  342. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
  343. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
  344. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  345. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
  346. machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  347. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  348. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  349. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  350. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  351. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  352. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  353. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  354. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  355. machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
  356. machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
  357. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
  358. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  359. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  360. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  361. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  362. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  363. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  364. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  365. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  366. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  367. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  368. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  369. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  370. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  371. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  372. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  373. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  374. machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
  375. machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  376. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  377. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  378. machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  379. machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
  380. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
  381. /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
  382. /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
  383. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
  384. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
  385. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
  386. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
  387. /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
  388. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
  389. /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  390. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  391. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  392. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
  393. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
  394. /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
  395. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  396. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  397. /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
  398. /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
  399. /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
  400. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  401. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
  402. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,210 @@
1
+ import os
2
+ import platform
3
+ import stat
4
+ import shutil
5
+ import subprocess
6
+ from pathlib import Path, PureWindowsPath
7
+
8
+
9
+ def _ensure_relative_path(requested: Path | str) -> Path:
10
+ path = Path(requested)
11
+ if path.is_absolute():
12
+ raise ValueError("paths must be relative to the home directory")
13
+ if any(part == ".." for part in path.parts):
14
+ raise ValueError("paths must stay within the home directory")
15
+ return path
16
+
17
+
18
+ def _remove_path(path: Path) -> None:
19
+ if path.is_symlink() or path.is_file():
20
+ path.unlink()
21
+ return
22
+ shutil.rmtree(path)
23
+
24
+
25
+ def _ensure_wsl_environment() -> None:
26
+ if os.environ.get("WSL_DISTRO_NAME"):
27
+ return
28
+ if "microsoft" in platform.release().lower():
29
+ return
30
+ raise RuntimeError("copy_when_inside_wsl must run inside WSL")
31
+
32
+
33
+ def _ensure_windows_environment() -> None:
34
+ if os.name != "nt":
35
+ raise RuntimeError("copy_when_inside_windows must run inside Windows")
36
+ if os.environ.get("WSL_DISTRO_NAME"):
37
+ raise RuntimeError("copy_when_inside_windows must run inside Windows")
38
+
39
+
40
+ def _infer_windows_home_from_permissions() -> Path:
41
+ base_dir = Path("/mnt/c/Users")
42
+ try:
43
+ entries = list(base_dir.iterdir())
44
+ except FileNotFoundError as exc:
45
+ raise RuntimeError("unable to find /mnt/c/Users") from exc
46
+ candidates: list[Path] = []
47
+ for entry in entries:
48
+ if not entry.is_dir():
49
+ continue
50
+ if entry.name.lower() == "public" or entry.name.lower() == "all users":
51
+ continue
52
+ try:
53
+ mode = stat.S_IMODE(entry.stat().st_mode)
54
+ except OSError:
55
+ continue
56
+ if mode == 0o777:
57
+ candidates.append(entry)
58
+ if len(candidates) != 1:
59
+ options = ", ".join(sorted(candidate.name for candidate in candidates)) or "none"
60
+ raise RuntimeError(f"unable to infer Windows home directory (candidates: {options})")
61
+ return candidates[0]
62
+
63
+
64
+ def _resolve_windows_home_from_wsl() -> Path:
65
+ user_profile = os.environ.get("USERPROFILE")
66
+ if user_profile:
67
+ windows_path = PureWindowsPath(user_profile)
68
+ drive = windows_path.drive
69
+ if drive:
70
+ drive_letter = drive.rstrip(":").lower()
71
+ tail = Path(*windows_path.parts[1:])
72
+ candidate = Path("/mnt") / drive_letter / tail
73
+ if candidate.exists():
74
+ return candidate
75
+ return _infer_windows_home_from_permissions()
76
+
77
+
78
+ def _decode_wsl_output(raw_bytes: bytes) -> str:
79
+ try:
80
+ return raw_bytes.decode("utf-16-le")
81
+ except UnicodeDecodeError:
82
+ return raw_bytes.decode()
83
+
84
+
85
+ def _get_single_wsl_distribution() -> str:
86
+ process = subprocess.run(["wsl.exe", "-l"], capture_output=True, text=False, check=True)
87
+ stdout = _decode_wsl_output(process.stdout).replace("\ufeff", "")
88
+ distributions: list[str] = []
89
+ for raw_line in stdout.splitlines():
90
+ line = raw_line.strip()
91
+ if not line or line.lower().startswith("windows subsystem for linux"):
92
+ continue
93
+ normalized = line.lstrip("* ").replace("(Default)", "").strip()
94
+ if normalized:
95
+ distributions.append(normalized)
96
+ if len(distributions) != 1:
97
+ raise RuntimeError("unable to pick a single WSL distribution")
98
+ return distributions[0]
99
+
100
+
101
+ def _resolve_wsl_home_on_windows() -> Path:
102
+ distribution = _get_single_wsl_distribution()
103
+ home_root = Path(rf"\\wsl$\{distribution}\home")
104
+ try:
105
+ entries = list(home_root.iterdir())
106
+ except FileNotFoundError as exc:
107
+ raise RuntimeError(f"unable to locate WSL home directories for {distribution}") from exc
108
+ except OSError as exc:
109
+ raise RuntimeError(f"unable to inspect WSL home directories for {distribution}") from exc
110
+ user_dirs = [entry for entry in entries if entry.is_dir()]
111
+ if len(user_dirs) != 1:
112
+ options = ", ".join(sorted(entry.name for entry in user_dirs)) or "none"
113
+ raise RuntimeError(f"unable to infer WSL user directory (candidates: {options})")
114
+ return user_dirs[0]
115
+
116
+
117
+ def _quote_for_powershell(path: Path) -> str:
118
+ return "'" + str(path).replace("'", "''") + "'"
119
+
120
+
121
+ def _run_windows_copy_command(source_path: Path, target_path: Path) -> None:
122
+ source_is_dir = source_path.is_dir()
123
+ parent_literal = _quote_for_powershell(target_path.parent)
124
+ source_literal = _quote_for_powershell(source_path)
125
+ target_literal = _quote_for_powershell(target_path)
126
+ script = (
127
+ "$ErrorActionPreference = 'Stop'; "
128
+ f"New-Item -ItemType Directory -Path {parent_literal} -Force | Out-Null; "
129
+ f"Copy-Item -LiteralPath {source_literal} -Destination {target_literal}"
130
+ f"{' -Recurse' if source_is_dir else ''} -Force"
131
+ )
132
+ print(f"Copying {source_path} to {target_path}")
133
+ subprocess.run(
134
+ ["powershell.exe", "-NoLogo", "-NoProfile", "-Command", script],
135
+ check=True,
136
+ )
137
+
138
+
139
+ def _ensure_symlink(link_path: Path, target_path: Path) -> None:
140
+ if not target_path.exists():
141
+ raise FileNotFoundError(target_path)
142
+ if link_path.is_symlink():
143
+ existing_target = Path(os.path.realpath(link_path))
144
+ desired_target = Path(os.path.realpath(target_path))
145
+ if os.path.normcase(str(existing_target)) == os.path.normcase(str(desired_target)):
146
+ return
147
+ link_path.unlink()
148
+ elif link_path.exists():
149
+ raise FileExistsError(link_path)
150
+ link_path.symlink_to(target_path, target_is_directory=True)
151
+
152
+
153
+ def copy_when_inside_wsl(source: Path | str, target: Path | str, overwrite: bool) -> None:
154
+ _ensure_wsl_environment()
155
+ source_relative = _ensure_relative_path(source)
156
+ target_relative = _ensure_relative_path(target)
157
+ source_path = Path.home() / source_relative
158
+ target_path = _resolve_windows_home_from_wsl() / target_relative
159
+ if not source_path.exists():
160
+ raise FileNotFoundError(source_path)
161
+ if target_path.exists():
162
+ if not overwrite:
163
+ raise FileExistsError(target_path)
164
+ _remove_path(target_path)
165
+ target_path.parent.mkdir(parents=True, exist_ok=True)
166
+ if source_path.is_dir():
167
+ shutil.copytree(source_path, target_path, dirs_exist_ok=False)
168
+ return
169
+ print(f"Copying {source_path} to {target_path}")
170
+ shutil.copy2(source_path, target_path)
171
+
172
+
173
+ def copy_when_inside_windows(source: Path | str, target: Path | str, overwrite: bool) -> None:
174
+ _ensure_windows_environment()
175
+ source_relative = _ensure_relative_path(source)
176
+ target_relative = _ensure_relative_path(target)
177
+ source_path = Path.home() / source_relative
178
+ target_path = _resolve_wsl_home_on_windows() / target_relative
179
+ if not source_path.exists():
180
+ raise FileNotFoundError(source_path)
181
+ if target_path.exists():
182
+ if not overwrite:
183
+ raise FileExistsError(target_path)
184
+ _remove_path(target_path)
185
+ _run_windows_copy_command(source_path, target_path)
186
+
187
+
188
+ def link_wsl_and_windows() -> None:
189
+ system = platform.system()
190
+ if system == "Darwin":
191
+ raise RuntimeError("link_wsl_and_windows is not designed for macOS")
192
+ try:
193
+ _ensure_wsl_environment()
194
+ except RuntimeError:
195
+ try:
196
+ _ensure_windows_environment()
197
+ except RuntimeError as exc:
198
+ raise RuntimeError("link_wsl_and_windows must run inside Windows or WSL") from exc
199
+ target_path = _resolve_wsl_home_on_windows()
200
+ link_path = Path.home() / "wsl"
201
+ _ensure_symlink(link_path, target_path)
202
+ return
203
+ target_path = _resolve_windows_home_from_wsl()
204
+ link_path = Path.home() / "win"
205
+ _ensure_symlink(link_path, target_path)
206
+
207
+
208
+ if __name__ == "__main__":
209
+ copy_when_inside_wsl(Path("projects/source.txt"), Path("windows_projects/source.txt"), True)
210
+ copy_when_inside_windows(Path("documents/example.txt"), Path("linux_documents/example.txt"), True)
@@ -4,6 +4,7 @@ from typing import Any, BinaryIO, Optional, Union
4
4
  from typing import Literal, TypeAlias
5
5
  from dataclasses import dataclass
6
6
 
7
+
7
8
  SHELLS: TypeAlias = Literal["default", "cmd", "powershell", "pwsh", "bash"] # pwsh.exe is PowerShell (community) and powershell.exe is Windows Powershell (msft)
8
9
  CONSOLE: TypeAlias = Literal["wt", "cmd"]
9
10
  MACHINE: TypeAlias = Literal["Windows", "Linux", "Darwin"]
@@ -35,7 +36,8 @@ class Response:
35
36
  def __call__(self, *args: Any, **kwargs: Any) -> Optional[str]:
36
37
  _ = args, kwargs
37
38
  return self.op.rstrip() if type(self.op) is str else None
38
-
39
+ def __repr__(self) -> str:
40
+ return f"Response({self.input=}, {self.output=}, {self.desc=}, {self.op=}, {self.ip=}, {self.err=}, {self.returncode=})"
39
41
  @property
40
42
  def op(self) -> str:
41
43
  return self.output.stdout
@@ -97,115 +99,3 @@ class Response:
97
99
  txt = tmp1 + Text(str(self.input), style="white") + tmp2 + Text("\n".join(list_str), style="white")
98
100
  con.print(Panel(txt, title=f"🖥️ {self.desc}", subtitle=f"📋 {desc}", width=150, style="bold cyan on black"))
99
101
  return self
100
-
101
-
102
- '''
103
- class Terminal:
104
- def __init__(self, stdout: Optional[int] = subprocess.PIPE, stderr: Optional[int] = subprocess.PIPE, stdin: Optional[int] = subprocess.PIPE, elevated: bool = False):
105
- self.machine: str = platform.system()
106
- self.elevated: bool = elevated
107
- self.stdout = stdout
108
- self.stderr = stderr
109
- self.stdin = stdin
110
-
111
- # def set_std_system(self): self.stdout = sys.stdout; self.stderr = sys.stderr; self.stdin = sys.stdin
112
- # def set_std_pipe(self):
113
- # self.stdout = subprocess.PIPE
114
- # self.stderr = subprocess.PIPE
115
- # self.stdin = subprocess.PIPE
116
-
117
- # def set_std_null(self):
118
- # self.stdout, self.stderr, self.stdin = subprocess.DEVNULL, subprocess.DEVNULL, subprocess.DEVNULL # Equivalent to `echo 'foo' &> /dev/null`
119
-
120
- def run(self, *cmds: str, shell: Optional[SHELLS] = "default", check: bool = False, ip: Optional[str] = None) -> Response: # Runs SYSTEM commands like subprocess.run
121
- """Blocking operation. Thus, if you start a shell via this method, it will run in the main and won't stop until you exit manually IF stdin is set to sys.stdin, otherwise it will run and close quickly. Other combinations of stdin, stdout can lead to funny behaviour like no output but accept input or opposite.
122
- * This method is short for: res = subprocess.run("powershell command", capture_output=True, shell=True, text=True) and unlike os.system(cmd), subprocess.run(cmd) gives much more control over the output and input.
123
- * `shell=True` loads up the profile of the shell called so more specific commands can be run. Importantly, on Windows, the `start` command becomes availalbe and new windows can be launched.
124
- * `capture_output` prevents the stdout to redirect to the stdout of the script automatically, instead it will be stored in the Response object returned. # `capture_output=True` same as `stdout=subprocess.PIPE, stderr=subprocess.PIPE`"""
125
- my_list = list(
126
- cmds
127
- ) # `subprocess.Popen` (process open) is the most general command. Used here to create asynchronous job. `subprocess.run` is a thin wrapper around Popen that makes it wait until it finishes the task. `suprocess.call` is an archaic command for pre-Python-3.5.
128
- if self.machine == "Windows" and shell in {"powershell", "pwsh"}:
129
- my_list = [shell, "-Command"] + my_list # alternatively, one can run "cmd"
130
- if self.elevated is False or self.is_user_admin():
131
- resp: subprocess.CompletedProcess[str] = subprocess.run(my_list, stderr=self.stderr, stdin=self.stdin, stdout=self.stdout, text=True, shell=True, check=check, input=ip)
132
- else:
133
- resp = __import__("ctypes").windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1)
134
- return Response.from_completed_process(resp)
135
- @staticmethod
136
- def is_user_admin() -> bool: # adopted from: https://stackoverflow.com/questions/19672352/how-to-run-script-with-elevated-privilege-on-windows"""
137
- if os.name == "nt":
138
- try:
139
- return __import__("ctypes").windll.shell32.IsUserAnAdmin()
140
- except Exception:
141
- import traceback
142
-
143
- traceback.print_exc()
144
- print("Admin check failed, assuming not an admin.")
145
- return False
146
- else:
147
- return os.getuid() == 0 # Check for root on Posix
148
- '''
149
-
150
- # def run_shell_script(self, script: str, shell: SHELLS = "default", verbose: bool = False):
151
- # if self.machine == "Linux":
152
- # script = "#!/bin/bash" + "\n" + script # `source` is only available in bash.
153
- # script_file = PathExtended.tmpfile(name="tmp_shell_script", suffix=".ps1" if self.machine == "Windows" else ".sh", folder="tmp_scripts")
154
- # script_file.write_text(script, newline={"Windows": None, "Linux": "\n"}[self.machine])
155
- # if shell == "default":
156
- # if self.machine == "Windows":
157
- # start_cmd = "powershell" # default shell on Windows is cmd which is not very useful. (./source is not available)
158
- # full_command: Union[list[str], str] = [start_cmd, str(script_file)] # shell=True will cause this to be a string anyway (with space separation)
159
- # else:
160
- # start_cmd = "bash"
161
- # full_command = f"{start_cmd} {script_file}" # full_command = [start_cmd, str(script_file)]
162
- # else:
163
- # full_command = f"{shell} {script_file}" # full_command = [shell, str(tmp_file)]
164
- # if verbose:
165
- # desc = "Script to be executed:"
166
- # if platform.system() == "Windows":
167
- # lexer = "powershell"
168
- # elif platform.system() == "Linux":
169
- # lexer = "sh"
170
- # elif platform.system() == "Darwin":
171
- # lexer = "sh" # macOS uses similar shell to Linux
172
- # else:
173
- # raise NotImplementedError(f"Platform {platform.system()} not supported.")
174
- # from rich.console import Console
175
- # from rich.panel import Panel
176
- # from rich.syntax import Syntax
177
- # import rich.progress as pb
178
-
179
- # console = Console()
180
- # console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 {desc}"), style="bold red")
181
- # with pb.Progress(transient=True) as progress:
182
- # _task = progress.add_task(f"Running Script @ {script_file}", total=None)
183
- # resp = subprocess.run(full_command, stderr=self.stderr, stdin=self.stdin, stdout=self.stdout, text=True, shell=True, check=False)
184
- # else:
185
- # resp = subprocess.run(full_command, stderr=self.stderr, stdin=self.stdin, stdout=self.stdout, text=True, shell=True, check=False)
186
- # return Response.from_completed_process(resp)
187
-
188
- # def run_py(self, script: str, wdir: OPLike = None, interactive: bool = True, ipython: bool = True, shell: Optional[str] = None, terminal: str = "", new_window: bool = True, header: bool = True): # async run, since sync run is meaningless.
189
- # script = (Terminal.get_header(wdir=wdir, toolbox=True) if header else "") + script + ("\nDisplayData.set_pandas_auto_width()\n" if terminal in {"wt", "powershell", "pwsh"} else "")
190
- # py_script = PathExtended.tmpfile(name="tmp_python_script", suffix=".py", folder="tmp_scripts/terminal")
191
- # py_script.write_text(f"""print(r'''{script}''')""" + "\n" + script)
192
- # print(f"""🚀 [ASYNC PYTHON SCRIPT] Script URI:
193
- # {py_script.absolute().as_uri()}""")
194
- # print("Script to be executed asyncronously: ", py_script.absolute().as_uri())
195
- # shell_script = f"""
196
- # {f"cd {wdir}" if wdir is not None else ""}
197
- # {"ipython" if ipython else "python"} {"-i" if interactive else ""} {py_script}
198
- # """
199
- # shell_path = PathExtended.tmpfile(name="tmp_shell_script", suffix=".sh" if self.machine == "Linux" else ".ps1", folder="tmp_scripts/shell")
200
- # shell_path.write_text(shell_script)
201
- # if shell is None and self.machine == "Windows":
202
- # shell = "pwsh"
203
- # window = "start" if new_window and self.machine == "Windows" else ""
204
- # os.system(f"{window} {terminal} {shell} {shell_script}")
205
-
206
- # @staticmethod
207
- # def run_as_admin(file: PLike, params: Any, wait: bool = False):
208
- # proce_info = install_n_import(library="win32com", package="pywin32", fromlist=["shell.shell.ShellExecuteEx"]).shell.shell.ShellExecuteEx(lpVerb='runas', lpFile=file, lpParameters=params)
209
- # # TODO update PATH for this to take effect immediately.
210
- # if wait: time.sleep(1)
211
- # return proce_info
@@ -1,5 +1,15 @@
1
+
1
2
  """
3
+
2
4
  Generate uv add commands from pyproject.toml dependency groups.
5
+
6
+ #!/bin/bash
7
+ # rm ./pyproject.toml
8
+ rm ./uv.lock
9
+ rm -rfd .venv
10
+ uv venv --python 3.13
11
+ uv init
12
+
3
13
  """
4
14
 
5
15
  from pathlib import Path
@@ -15,44 +25,48 @@ def generate_uv_add_commands(pyproject_path: Path, output_path: Path) -> None:
15
25
  pyproject_path: Path to the pyproject.toml file
16
26
  output_path: Path where to write the uv add commands
17
27
  """
18
- # Read pyproject.toml
19
28
  with open(pyproject_path, "rb") as f:
20
29
  pyproject_data: dict[str, Any] = tomllib.load(f)
21
30
 
22
31
  commands: list[str] = []
23
32
 
24
- # Handle main dependencies (no group)
25
33
  if "project" in pyproject_data and "dependencies" in pyproject_data["project"]:
26
- main_deps = pyproject_data["project"]["dependencies"]
34
+ main_deps: list[str] = pyproject_data["project"]["dependencies"]
27
35
  if main_deps:
28
- # Extract package names without version constraints
29
- package_names = [extract_package_name(dep) for dep in main_deps]
30
- commands.append(f"uv add {' '.join(package_names)}")
36
+ package_names: list[str] = [extract_package_name(dep) for dep in main_deps]
37
+ commands.append(f"uv add --no-cache {' '.join(package_names)}")
31
38
 
32
- # Handle optional dependencies as groups
33
39
  if "project" in pyproject_data and "optional-dependencies" in pyproject_data["project"]:
34
- optional_deps = pyproject_data["project"]["optional-dependencies"]
40
+ optional_deps: dict[str, list[str]] = pyproject_data["project"]["optional-dependencies"]
35
41
  for group_name, deps in optional_deps.items():
36
42
  if deps:
37
43
  package_names = [extract_package_name(dep) for dep in deps]
38
- commands.append(f"uv add {' '.join(package_names)} --group {group_name}")
44
+ commands.append(f"uv add --no-cache --group {group_name} {' '.join(package_names)}")
39
45
 
40
- # Handle dependency-groups (like dev)
41
46
  if "dependency-groups" in pyproject_data:
42
- dep_groups = pyproject_data["dependency-groups"]
47
+ dep_groups: dict[str, list[str]] = pyproject_data["dependency-groups"]
43
48
  for group_name, deps in dep_groups.items():
44
49
  if deps:
45
50
  package_names = [extract_package_name(dep) for dep in deps]
46
51
  if group_name == "dev":
47
- commands.append(f"uv add {' '.join(package_names)} --dev")
52
+ commands.append(f"uv add --no-cache --dev {' '.join(package_names)}")
48
53
  else:
49
- commands.append(f"uv add {' '.join(package_names)} --group {group_name}")
50
-
51
- # Write commands to output file
52
- with open(output_path, "w") as f:
53
- for command in commands:
54
- f.write(command + "\n")
55
-
54
+ commands.append(f"uv add --no-cache --group {group_name} {' '.join(package_names)}")
55
+
56
+ # with open(output_path, "w") as f:
57
+ # f.write("#!/bin/bash\n")
58
+ # f.write("set -e\n\n")
59
+ # f.write("uv cache clean --force\n\n")
60
+ # for command in commands:
61
+ # f.write(command + "\n")
62
+ script = f"""
63
+ #!/bin/bash
64
+ set -e
65
+ uv cache clean --force
66
+ rm -rfd .venv
67
+ {"".join(f"{command}\n" for command in commands)}
68
+ """
69
+ output_path.write_text(script.strip() + "\n", encoding="utf-8")
56
70
  print(f"Generated {len(commands)} uv add commands in {output_path}")
57
71
 
58
72
 
@@ -79,13 +93,85 @@ def extract_package_name(dependency_spec: str) -> str:
79
93
  return dependency_spec.strip()
80
94
 
81
95
 
96
+ def upgrade_machine_config_version() -> None:
97
+ """
98
+ Upgrade machineconfig version in pyproject.toml and all source files.
99
+
100
+ Reads current version from pyproject.toml, bumps it by 0.01, and replaces
101
+ all occurrences of machineconfig>={old_version} and machineconfig[group]>={old_version}
102
+ with the new version in Python (.py), shell (.sh), and PowerShell (.ps1) files.
103
+ """
104
+ current_dir: Path = Path.cwd()
105
+ pyproject_file: Path = current_dir / "pyproject.toml"
106
+
107
+ # Read current version from pyproject.toml
108
+ with open(pyproject_file, "rb") as f:
109
+ pyproject_data: dict[str, Any] = tomllib.load(f)
110
+
111
+ current_version_str: str = pyproject_data["project"]["version"]
112
+ version_parts: list[str] = current_version_str.split(".")
113
+ major: int = int(version_parts[0])
114
+ minor: int = int(version_parts[1])
115
+
116
+ # Bump minor version by 1, preserving zero-padding
117
+ new_minor: int = minor + 1
118
+ # Preserve the same number of digits as the original minor version
119
+ minor_width: int = len(version_parts[1])
120
+ new_version: str = f"{major}.{new_minor:0{minor_width}d}"
121
+
122
+ # Collect all optional dependency groups
123
+ optional_groups: set[str] = set()
124
+ if "project" in pyproject_data and "optional-dependencies" in pyproject_data["project"]:
125
+ optional_groups.update(pyproject_data["project"]["optional-dependencies"].keys())
126
+ if "dependency-groups" in pyproject_data:
127
+ optional_groups.update(pyproject_data["dependency-groups"].keys())
128
+
129
+ print(f"Upgrading from {current_version_str} to {new_version}")
130
+ print(f"Found optional groups: {', '.join(sorted(optional_groups))}")
131
+
132
+ # Update pyproject.toml
133
+ content: str = pyproject_file.read_text(encoding="utf-8")
134
+ updated_content: str = content.replace(f'version = "{current_version_str}"', f'version = "{new_version}"')
135
+ pyproject_file.write_text(updated_content, encoding="utf-8")
136
+ print(f"Updated pyproject.toml: {current_version_str} -> {new_version}")
137
+
138
+ # Find all Python files and replace version constraints
139
+ py_files: list[Path] = list(current_dir.glob("**/*.py")) + list(current_dir.glob("**/*.sh")) + list(current_dir.glob("**/*.ps1"))
140
+
141
+ # Also include Dockerfile files
142
+ dockerfile_files: list[Path] = [f for f in current_dir.glob("**/Dockerfile*") if f.is_file()]
143
+ py_files.extend(dockerfile_files)
144
+
145
+ files_updated: int = 0
146
+ for file_path in py_files:
147
+ try:
148
+ file_content: str = file_path.read_text(encoding="utf-8")
149
+ updated_file_content: str = file_content
150
+
151
+ # Replace base constraint (without group)
152
+ old_constraint: str = f"machineconfig>={current_version_str}"
153
+ new_constraint: str = f"machineconfig>={new_version}"
154
+ if old_constraint in updated_file_content:
155
+ updated_file_content = updated_file_content.replace(old_constraint, new_constraint)
156
+
157
+ # Replace constraints with optional groups
158
+ for group in optional_groups:
159
+ old_group_constraint: str = f"machineconfig[{group}]>={current_version_str}"
160
+ new_group_constraint: str = f"machineconfig[{group}]>={new_version}"
161
+ if old_group_constraint in updated_file_content:
162
+ updated_file_content = updated_file_content.replace(old_group_constraint, new_group_constraint)
163
+
164
+ if updated_file_content != file_content:
165
+ file_path.write_text(updated_file_content, encoding="utf-8")
166
+ files_updated += 1
167
+ print(f"Updated {file_path.relative_to(current_dir)}")
168
+ except (UnicodeDecodeError, PermissionError):
169
+ # Skip files that can't be read as text
170
+ pass
171
+ print(f"Updated {files_updated} files with version constraint")
172
+ from machineconfig.utils.code import exit_then_run_shell_script
173
+ exit_then_run_shell_script(f"cd {current_dir}; uv sync")
174
+
175
+
82
176
  if __name__ == "__main__":
83
- # Example usage
84
- current_dir = Path.cwd()
85
- pyproject_file = current_dir / "pyproject.toml"
86
- output_file = current_dir / "uv_add_commands.txt"
87
-
88
- if pyproject_file.exists():
89
- generate_uv_add_commands(pyproject_file, output_file)
90
- else:
91
- print(f"pyproject.toml not found at {pyproject_file}")
177
+ upgrade_machine_config_version()
machineconfig/utils/ve.py CHANGED
@@ -1,18 +1,20 @@
1
- from machineconfig.utils.io import read_ini
2
- import platform
1
+
3
2
  from typing import Optional
4
- from pathlib import Path
5
3
 
6
4
 
7
- def get_ve_path_and_ipython_profile(init_path: Path) -> tuple[Optional[str], Optional[str]]:
5
+ def get_ve_path_and_ipython_profile(init_path: "Path") -> tuple[Optional[str], Optional[str]]:
8
6
  """Works with .ve.ini .venv and .ve_path"""
9
7
  ve_path: Optional[str] = None
10
8
  ipy_profile: Optional[str] = None
11
9
  tmp = init_path
10
+
11
+ from machineconfig.utils.io import read_ini
12
+
12
13
  for _ in init_path.parents:
13
14
  if tmp.joinpath(".ve.ini").exists():
14
15
  ini = read_ini(tmp.joinpath(".ve.ini"))
15
16
  if ve_path is None:
17
+
16
18
  try:
17
19
  ve_path = ini["specs"]["ve_path"]
18
20
  except KeyError:
@@ -39,6 +41,8 @@ def get_ve_path_and_ipython_profile(init_path: Path) -> tuple[Optional[str], Opt
39
41
 
40
42
 
41
43
  def get_ve_activate_line(ve_root: str):
44
+ import platform
45
+ from pathlib import Path
42
46
  if platform.system() == "Windows":
43
47
  q = Path(ve_root).expanduser().relative_to(Path.home()).as_posix()
44
48
  activate_ve_line = f". $HOME/{q}/Scripts/activate.ps1"
@@ -47,3 +51,7 @@ def get_ve_activate_line(ve_root: str):
47
51
  else:
48
52
  raise NotImplementedError(f"Platform {platform.system()} not supported.")
49
53
  return activate_ve_line
54
+
55
+
56
+ if __name__ == "__main__":
57
+ from pathlib import Path