machineconfig 7.98__py3-none-any.whl → 8.61__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 (353) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +28 -43
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  26. machineconfig/logger.py +1 -1
  27. machineconfig/profile/create_helper.py +21 -10
  28. machineconfig/profile/create_links.py +77 -20
  29. machineconfig/profile/create_links_export.py +63 -58
  30. machineconfig/profile/create_shell_profile.py +14 -0
  31. machineconfig/profile/mapper_data.toml +45 -0
  32. machineconfig/profile/mapper_dotfiles.toml +249 -0
  33. machineconfig/scripts/python/agents.py +76 -171
  34. machineconfig/scripts/python/ai/initai.py +3 -1
  35. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  36. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  37. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  38. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  39. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  40. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  42. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  44. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  46. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  47. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  48. machineconfig/scripts/python/cloud.py +58 -11
  49. machineconfig/scripts/python/croshell.py +4 -155
  50. machineconfig/scripts/python/devops.py +57 -38
  51. machineconfig/scripts/python/devops_navigator.py +17 -3
  52. machineconfig/scripts/python/fire_jobs.py +10 -193
  53. machineconfig/scripts/python/ftpx.py +5 -224
  54. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  55. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  56. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  57. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  58. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  59. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  62. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  64. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  65. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  70. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  71. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  72. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  75. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +229 -0
  76. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  77. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  78. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  79. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  80. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +130 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
  85. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  86. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  89. machineconfig/scripts/python/helpers/helpers_devops/cli_share_temp.py +69 -0
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
  98. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
  99. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
  100. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
  101. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
  102. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
  103. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  104. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  105. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  106. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  107. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  108. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  109. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  110. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  111. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  112. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  113. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  114. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  115. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +2 -7
  116. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  117. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  118. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  119. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  120. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  121. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  122. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  123. machineconfig/scripts/python/helpers/helpers_network/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  125. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  126. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  127. machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
  128. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
  129. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
  130. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
  131. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
  132. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
  133. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
  134. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
  135. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -0
  136. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  137. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  138. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +120 -37
  139. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  140. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  141. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  142. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  143. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  144. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  145. machineconfig/scripts/python/helpers/helpers_sessions/attach_impl.py +87 -0
  146. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
  147. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  148. machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
  149. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  150. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  151. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  152. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  153. machineconfig/scripts/python/mcfg_entry.py +126 -48
  154. machineconfig/scripts/python/msearch.py +16 -61
  155. machineconfig/scripts/python/sessions.py +137 -191
  156. machineconfig/scripts/python/utils.py +104 -24
  157. machineconfig/settings/atuin/config.toml +294 -0
  158. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  159. machineconfig/settings/linters/.ruff.toml +2 -1
  160. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  161. machineconfig/settings/shells/bash/init.sh +6 -10
  162. machineconfig/settings/shells/nushell/config.nu +23 -1
  163. machineconfig/settings/shells/nushell/env.nu +22 -48
  164. machineconfig/settings/shells/nushell/init.nu +64 -240
  165. machineconfig/settings/shells/pwsh/init.ps1 +71 -5
  166. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  167. machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
  168. machineconfig/settings/shells/wt/settings.json +31 -37
  169. machineconfig/settings/shells/zsh/init.sh +25 -5
  170. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  171. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  172. machineconfig/settings/tv/config.toml +234 -0
  173. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  174. machineconfig/settings/wsl/.wslconfig +5 -30
  175. machineconfig/settings/wt/__init__.py +0 -0
  176. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  177. machineconfig/settings/zellij/__init__.py +0 -0
  178. machineconfig/settings/zellij/config.kdl +0 -295
  179. machineconfig/settings/zellij/layouts/__init__.py +0 -0
  180. machineconfig/settings/zellij/layouts/st.kdl +39 -9
  181. machineconfig/settings/zellij/layouts/st2.kdl +6 -2
  182. machineconfig/setup_linux/__init__.py +0 -1
  183. machineconfig/setup_linux/apps_desktop.sh +8 -27
  184. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  185. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  186. machineconfig/setup_mac/__init__.py +0 -2
  187. machineconfig/setup_windows/__init__.py +2 -5
  188. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  189. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  190. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  191. machineconfig/type_hinting/sql/__init__.py +1 -0
  192. machineconfig/type_hinting/sql/base.py +216 -0
  193. machineconfig/type_hinting/sql/core_schema.py +64 -0
  194. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  195. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  196. machineconfig/type_hinting/typedict/__init__.py +1 -0
  197. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  198. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  199. machineconfig/type_hinting/typedict/generators.py +231 -0
  200. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  201. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  202. machineconfig/utils/accessories.py +24 -0
  203. machineconfig/utils/code.py +78 -33
  204. machineconfig/utils/files/ascii_art.py +10 -14
  205. machineconfig/utils/files/headers.py +3 -5
  206. machineconfig/utils/files/read.py +8 -1
  207. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  208. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  209. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  210. machineconfig/utils/installer_utils/installer_class.py +12 -4
  211. machineconfig/utils/installer_utils/installer_cli.py +7 -17
  212. machineconfig/utils/installer_utils/installer_helper.py +52 -36
  213. machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
  214. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  215. machineconfig/utils/io.py +25 -8
  216. machineconfig/utils/meta.py +6 -4
  217. machineconfig/utils/options.py +49 -19
  218. machineconfig/utils/options_utils/__init__.py +0 -0
  219. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  220. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  221. machineconfig/utils/options_utils/tv_options.py +37 -0
  222. machineconfig/utils/path_extended.py +8 -7
  223. machineconfig/utils/procs.py +35 -27
  224. machineconfig/utils/scheduler.py +8 -2
  225. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  226. machineconfig/utils/schemas/layouts/layout_types.py +10 -0
  227. machineconfig/utils/source_of_truth.py +7 -1
  228. machineconfig/utils/ssh.py +73 -23
  229. machineconfig/utils/ssh_utils/abc.py +1 -1
  230. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  231. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  232. machineconfig/utils/ssh_utils/utils.py +23 -7
  233. machineconfig/utils/ssh_utils/wsl.py +107 -170
  234. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  235. machineconfig/utils/upgrade_packages.py +4 -8
  236. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/METADATA +30 -23
  237. machineconfig-8.61.dist-info/RECORD +539 -0
  238. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
  239. machineconfig/jobs/installer/check_installations.py +0 -248
  240. machineconfig/profile/backup.toml +0 -49
  241. machineconfig/profile/mapper.toml +0 -263
  242. machineconfig/scripts/linux/other/share_cloud.sh +0 -64
  243. machineconfig/scripts/linux/other/share_nfs +0 -49
  244. machineconfig/scripts/linux/other/start_docker +0 -23
  245. machineconfig/scripts/linux/other/switch_ip +0 -20
  246. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  247. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  248. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  249. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  250. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  251. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -214
  252. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  253. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  254. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  255. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  256. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  257. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  258. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  259. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  260. machineconfig/scripts/python/helpers_network/mount_drive +0 -128
  261. machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
  262. machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
  263. machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
  264. machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
  265. machineconfig/scripts/python/helpers_network/mount_smb +0 -3
  266. machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
  267. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  268. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  269. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  270. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  271. machineconfig/scripts/python/terminal.py +0 -133
  272. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
  273. machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
  274. machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
  275. machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
  276. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  277. machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
  278. machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
  279. machineconfig/settings/zellij/config.orig.kdl +0 -295
  280. machineconfig/setup_linux/others/android.sh +0 -2
  281. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  282. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  283. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  284. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  285. machineconfig/setup_windows/others/docker.ps1 +0 -7
  286. machineconfig/setup_windows/others/obs.ps1 +0 -4
  287. machineconfig/setup_windows/others/power_options.ps1 +0 -7
  288. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  289. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  290. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  291. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  292. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  293. machineconfig/utils/options_tv.py +0 -119
  294. machineconfig/utils/tst.py +0 -20
  295. machineconfig-7.98.dist-info/RECORD +0 -504
  296. /machineconfig/{jobs/installer/custom_dev → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
  297. /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
  298. /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → jobs/installer/python_scripts}/__init__.py +0 -0
  299. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  300. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  301. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  302. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  303. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  304. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  305. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  306. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  307. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  308. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  309. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  310. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  311. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  312. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  313. /machineconfig/scripts/python/{helpers_cloud → graph}/__init__.py +0 -0
  314. /machineconfig/scripts/python/{helpers_croshell → helpers}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  316. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  317. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents}/__init__.py +0 -0
  318. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  319. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  320. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  321. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  322. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  323. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  324. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  325. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  326. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  327. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  328. /machineconfig/scripts/python/{helpers_network → helpers/helpers_croshell}/__init__.py +0 -0
  329. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  330. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  331. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  332. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  333. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops}/__init__.py +0 -0
  334. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
  335. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_devops/themes/__init__.py} +0 -0
  336. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  337. /machineconfig/scripts/python/{helpers_fire_command/f.py → helpers/helpers_fire_command/__init__.py} +0 -0
  338. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  339. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  340. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  341. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  342. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  343. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  344. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  345. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  346. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  347. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  348. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  349. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  350. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  351. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  352. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
  353. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,17 @@
1
+ from dataclasses import dataclass
2
+
3
+
4
+ @dataclass(frozen=True)
5
+ class DeviceEntry:
6
+ platform_name: str
7
+ key: str
8
+ device_path: str
9
+ device_type: str | None
10
+ label: str | None
11
+ mount_point: str | None
12
+ fs_type: str | None
13
+ size: str | None
14
+ extra: str | None
15
+ disk_number: int | None
16
+ partition_number: int | None
17
+ drive_letter: str | None
@@ -0,0 +1,17 @@
1
+ import platform
2
+
3
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
4
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.linux import list_linux_devices
5
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.macos import list_macos_devices
6
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.windows import list_windows_devices
7
+
8
+
9
+ def list_devices() -> list[DeviceEntry]:
10
+ platform_name = platform.system()
11
+ if platform_name == "Linux":
12
+ return list_linux_devices()
13
+ if platform_name == "Darwin":
14
+ return list_macos_devices()
15
+ if platform_name == "Windows":
16
+ return list_windows_devices()
17
+ return []
@@ -0,0 +1,103 @@
1
+ import json
2
+ import os
3
+ from pathlib import Path
4
+
5
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_command, run_command_sudo
6
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
7
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.selection import pick_device
8
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str
9
+
10
+
11
+ def _flatten_lsblk_devices(devices: list[dict[str, object]]) -> list[dict[str, object]]:
12
+ result: list[dict[str, object]] = []
13
+ stack = list(devices)
14
+ while stack:
15
+ item = stack.pop(0)
16
+ result.append(item)
17
+ children = item.get("children")
18
+ if isinstance(children, list):
19
+ for child in children:
20
+ if isinstance(child, dict):
21
+ stack.append(child)
22
+ return result
23
+
24
+
25
+ def list_linux_devices() -> list[DeviceEntry]:
26
+ result = run_command(["lsblk", "-J", "-o", "NAME,SIZE,TYPE,FSTYPE,LABEL,MOUNTPOINT,UUID,MODEL"])
27
+ text = ensure_ok(result, "lsblk")
28
+ data = json.loads(text)
29
+ raw_devices = data.get("blockdevices")
30
+ entries: list[DeviceEntry] = []
31
+ if isinstance(raw_devices, list):
32
+ for item in _flatten_lsblk_devices(raw_devices):
33
+ name_value = item.get("name")
34
+ if not isinstance(name_value, str):
35
+ continue
36
+ device_type = item.get("type")
37
+ if not isinstance(device_type, str):
38
+ continue
39
+ if device_type not in {"disk", "part"}:
40
+ continue
41
+ device_path = f"/dev/{name_value}"
42
+ label = as_str(item.get("label"))
43
+ mount_point = as_str(item.get("mountpoint"))
44
+ fs_type = as_str(item.get("fstype"))
45
+ size = as_str(item.get("size"))
46
+ model = as_str(item.get("model"))
47
+ entries.append(
48
+ DeviceEntry(
49
+ platform_name="Linux",
50
+ key=name_value,
51
+ device_path=device_path,
52
+ device_type=device_type,
53
+ label=label,
54
+ mount_point=mount_point,
55
+ fs_type=fs_type,
56
+ size=size,
57
+ extra=model,
58
+ disk_number=None,
59
+ partition_number=None,
60
+ drive_letter=None,
61
+ )
62
+ )
63
+ return entries
64
+
65
+
66
+ def mount_linux(entry: DeviceEntry, mount_point: str) -> None:
67
+ mount_path = Path(mount_point)
68
+ try:
69
+ mount_path.mkdir(parents=True, exist_ok=True)
70
+ except PermissionError:
71
+ mkdir_result = run_command_sudo(["mkdir", "-p", str(mount_path)])
72
+ ensure_ok(mkdir_result, "mkdir")
73
+ if os.geteuid() == 0:
74
+ result = run_command(["mount", entry.device_path, str(mount_path)])
75
+ else:
76
+ result = run_command_sudo(["mount", entry.device_path, str(mount_path)])
77
+ ensure_ok(result, "mount")
78
+
79
+
80
+ def _is_partition_of_disk(partition: DeviceEntry, disk: DeviceEntry) -> bool:
81
+ if partition.device_type != "part" or disk.device_type != "disk":
82
+ return False
83
+ if partition.key == disk.key:
84
+ return False
85
+ if not partition.key.startswith(disk.key):
86
+ return False
87
+ return True
88
+
89
+
90
+ def select_linux_partition(entries: list[DeviceEntry], entry: DeviceEntry) -> DeviceEntry:
91
+ if entry.device_type != "disk":
92
+ return entry
93
+ candidates = [device for device in entries if _is_partition_of_disk(device, entry)]
94
+ with_fs = [device for device in candidates if device.fs_type is not None and device.fs_type != ""]
95
+ if len(with_fs) == 1:
96
+ return with_fs[0]
97
+ if len(with_fs) > 1:
98
+ return pick_device(with_fs, header="Select partition to mount")
99
+ if len(candidates) == 1:
100
+ return candidates[0]
101
+ if len(candidates) > 1:
102
+ return pick_device(candidates, header="Select partition to mount")
103
+ raise RuntimeError("No mountable partitions found for selected disk")
@@ -0,0 +1,100 @@
1
+ import plistlib
2
+ from pathlib import Path
3
+
4
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_command
5
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
6
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str, format_size_bytes
7
+
8
+
9
+ def _diskutil_info(identifier: str) -> dict[str, object]:
10
+ result = run_command(["diskutil", "info", "-plist", identifier])
11
+ text = ensure_ok(result, "diskutil info")
12
+ return plistlib.loads(text.encode("utf-8"))
13
+
14
+
15
+ def list_macos_devices() -> list[DeviceEntry]:
16
+ result = run_command(["diskutil", "list", "-plist"])
17
+ text = ensure_ok(result, "diskutil list")
18
+ data = plistlib.loads(text.encode("utf-8"))
19
+ entries: list[DeviceEntry] = []
20
+ all_disks = data.get("AllDisksAndPartitions")
21
+ if isinstance(all_disks, list):
22
+ for disk in all_disks:
23
+ if not isinstance(disk, dict):
24
+ continue
25
+ partitions = disk.get("Partitions")
26
+ if isinstance(partitions, list) and partitions:
27
+ for partition in partitions:
28
+ if not isinstance(partition, dict):
29
+ continue
30
+ identifier = partition.get("DeviceIdentifier")
31
+ if not isinstance(identifier, str):
32
+ continue
33
+ info = _diskutil_info(identifier)
34
+ mount_point = as_str(info.get("MountPoint"))
35
+ label = as_str(info.get("VolumeName"))
36
+ fs_type = as_str(info.get("FilesystemType"))
37
+ if fs_type is None:
38
+ fs_type = as_str(info.get("FileSystemType"))
39
+ size_value = info.get("TotalSize")
40
+ size = format_size_bytes(size_value) if isinstance(size_value, int) else None
41
+ media_name = as_str(info.get("MediaName"))
42
+ device_path = f"/dev/{identifier}"
43
+ entries.append(
44
+ DeviceEntry(
45
+ platform_name="Darwin",
46
+ key=identifier,
47
+ device_path=device_path,
48
+ device_type="part",
49
+ label=label,
50
+ mount_point=mount_point,
51
+ fs_type=fs_type,
52
+ size=size,
53
+ extra=media_name,
54
+ disk_number=None,
55
+ partition_number=None,
56
+ drive_letter=None,
57
+ )
58
+ )
59
+ else:
60
+ identifier = disk.get("DeviceIdentifier")
61
+ if not isinstance(identifier, str):
62
+ continue
63
+ info = _diskutil_info(identifier)
64
+ mount_point = as_str(info.get("MountPoint"))
65
+ label = as_str(info.get("VolumeName"))
66
+ fs_type = as_str(info.get("FilesystemType"))
67
+ if fs_type is None:
68
+ fs_type = as_str(info.get("FileSystemType"))
69
+ size_value = info.get("TotalSize")
70
+ size = format_size_bytes(size_value) if isinstance(size_value, int) else None
71
+ media_name = as_str(info.get("MediaName"))
72
+ device_path = f"/dev/{identifier}"
73
+ entries.append(
74
+ DeviceEntry(
75
+ platform_name="Darwin",
76
+ key=identifier,
77
+ device_path=device_path,
78
+ device_type="disk",
79
+ label=label,
80
+ mount_point=mount_point,
81
+ fs_type=fs_type,
82
+ size=size,
83
+ extra=media_name,
84
+ disk_number=None,
85
+ partition_number=None,
86
+ drive_letter=None,
87
+ )
88
+ )
89
+ return entries
90
+
91
+
92
+ def mount_macos(entry: DeviceEntry, mount_point: str) -> None:
93
+ if mount_point == "-":
94
+ result = run_command(["diskutil", "mount", entry.key])
95
+ ensure_ok(result, "diskutil mount")
96
+ return
97
+ mount_path = Path(mount_point)
98
+ mount_path.mkdir(parents=True, exist_ok=True)
99
+ result = run_command(["diskutil", "mount", "-mountPoint", str(mount_path), entry.key])
100
+ ensure_ok(result, "diskutil mount")
@@ -0,0 +1,47 @@
1
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
2
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import format_device
3
+
4
+
5
+ def pick_device(entries: list[DeviceEntry], header: str) -> DeviceEntry:
6
+ from machineconfig.utils.options import choose_from_options
7
+
8
+ options: list[str] = []
9
+ map_option: dict[str, DeviceEntry] = {}
10
+ for idx, entry in enumerate(entries):
11
+ option = f"{idx:02d} {format_device(entry)}"
12
+ options.append(option)
13
+ map_option[option] = entry
14
+ choice = choose_from_options(options=options, msg="Select a device", multi=False, header=header, tv=True)
15
+ selected = map_option.get(choice)
16
+ if selected is None:
17
+ raise RuntimeError("Selection not found")
18
+ return selected
19
+
20
+
21
+ def resolve_device(entries: list[DeviceEntry], query: str) -> DeviceEntry:
22
+ query_value = query.strip()
23
+ if query_value in {"?", ""}:
24
+ return pick_device(entries, header="Available devices")
25
+ exact_matches = [
26
+ entry
27
+ for entry in entries
28
+ if entry.device_path.lower() == query_value.lower()
29
+ or entry.key.lower() == query_value.lower()
30
+ or (entry.label is not None and entry.label.lower() == query_value.lower())
31
+ ]
32
+ if len(exact_matches) == 1:
33
+ return exact_matches[0]
34
+ if len(exact_matches) > 1:
35
+ return pick_device(exact_matches, header="Multiple matches")
36
+ partial_matches = [
37
+ entry
38
+ for entry in entries
39
+ if query_value.lower() in entry.device_path.lower()
40
+ or query_value.lower() in entry.key.lower()
41
+ or (entry.label is not None and query_value.lower() in entry.label.lower())
42
+ ]
43
+ if len(partial_matches) == 1:
44
+ return partial_matches[0]
45
+ if len(partial_matches) > 1:
46
+ return pick_device(partial_matches, header="Multiple matches")
47
+ return pick_device(entries, header="Available devices")
@@ -0,0 +1,28 @@
1
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
2
+
3
+
4
+ def as_str(value: object) -> str | None:
5
+ if isinstance(value, str) and value != "":
6
+ return value
7
+ return None
8
+
9
+
10
+ def format_size_bytes(size_bytes: int) -> str:
11
+ units = ["B", "KB", "MB", "GB", "TB", "PB"]
12
+ value = float(size_bytes)
13
+ unit_index = 0
14
+ while value >= 1024 and unit_index < len(units) - 1:
15
+ value = value / 1024
16
+ unit_index += 1
17
+ if unit_index == 0:
18
+ return f"{int(value)} {units[unit_index]}"
19
+ return f"{value:.1f} {units[unit_index]}"
20
+
21
+
22
+ def format_device(entry: DeviceEntry) -> str:
23
+ label = entry.label if entry.label is not None and entry.label != "" else "-"
24
+ fs_type = entry.fs_type if entry.fs_type is not None and entry.fs_type != "" else "-"
25
+ size = entry.size if entry.size is not None and entry.size != "" else "-"
26
+ mount_point = entry.mount_point if entry.mount_point is not None and entry.mount_point != "" else "-"
27
+ extra = entry.extra if entry.extra is not None and entry.extra != "" else "-"
28
+ return f"{entry.key} | {entry.device_path} | {fs_type} | {size} | {mount_point} | {label} | {extra}"
@@ -0,0 +1,91 @@
1
+ import json
2
+ import re
3
+
4
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.commands import ensure_ok, run_powershell
5
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.device_entry import DeviceEntry
6
+ from machineconfig.scripts.python.helpers.helpers_devops.mount_helpers.utils import as_str, format_size_bytes
7
+
8
+
9
+ def _normalize_ps_json(raw_text: str) -> list[dict[str, object]]:
10
+ if raw_text.strip() == "":
11
+ return []
12
+ data = json.loads(raw_text)
13
+ if isinstance(data, list):
14
+ return [x for x in data if isinstance(x, dict)]
15
+ if isinstance(data, dict):
16
+ return [data]
17
+ return []
18
+
19
+
20
+ def list_windows_devices() -> list[DeviceEntry]:
21
+ partitions_result = run_powershell(
22
+ "Get-Partition | Select-Object DiskNumber,PartitionNumber,DriveLetter,Size,Type,Guid | ConvertTo-Json"
23
+ )
24
+ volumes_result = run_powershell(
25
+ "Get-Volume | Select-Object DriveLetter,FileSystemLabel,FileSystem,Size,SizeRemaining,DriveType,Path | ConvertTo-Json"
26
+ )
27
+ partitions_text = ensure_ok(partitions_result, "Get-Partition")
28
+ volumes_text = ensure_ok(volumes_result, "Get-Volume")
29
+ partitions = _normalize_ps_json(partitions_text)
30
+ volumes = _normalize_ps_json(volumes_text)
31
+ volume_map: dict[str, dict[str, object]] = {}
32
+ for volume in volumes:
33
+ drive_letter = as_str(volume.get("DriveLetter"))
34
+ if isinstance(drive_letter, str):
35
+ volume_map[drive_letter.upper()] = volume
36
+ entries: list[DeviceEntry] = []
37
+ for partition in partitions:
38
+ disk_number = partition.get("DiskNumber")
39
+ partition_number = partition.get("PartitionNumber")
40
+ drive_letter = as_str(partition.get("DriveLetter"))
41
+ volume = volume_map.get(drive_letter.upper()) if isinstance(drive_letter, str) else None
42
+ label = None
43
+ fs_type = None
44
+ mount_point = None
45
+ extra = as_str(partition.get("Type"))
46
+ if isinstance(volume, dict):
47
+ label = as_str(volume.get("FileSystemLabel"))
48
+ fs_type = as_str(volume.get("FileSystem"))
49
+ mount_point = as_str(volume.get("Path"))
50
+ if mount_point is None and isinstance(drive_letter, str) and drive_letter != "":
51
+ mount_point = f"{drive_letter}:\\"
52
+ size_value = partition.get("Size")
53
+ size = format_size_bytes(size_value) if isinstance(size_value, int) else None
54
+ key = f"Disk {disk_number} Part {partition_number}"
55
+ device_path = as_str(partition.get("Guid")) or key
56
+ entries.append(
57
+ DeviceEntry(
58
+ platform_name="Windows",
59
+ key=key,
60
+ device_path=device_path,
61
+ device_type="part",
62
+ label=label,
63
+ mount_point=mount_point,
64
+ fs_type=fs_type,
65
+ size=size,
66
+ extra=extra,
67
+ disk_number=disk_number if isinstance(disk_number, int) else None,
68
+ partition_number=partition_number if isinstance(partition_number, int) else None,
69
+ drive_letter=drive_letter.upper() if isinstance(drive_letter, str) and drive_letter != "" else None,
70
+ )
71
+ )
72
+ return entries
73
+
74
+
75
+ def _normalize_drive_letter(value: str) -> str:
76
+ match = re.search(r"([A-Za-z])", value)
77
+ if match is None:
78
+ raise RuntimeError("Invalid drive letter")
79
+ return match.group(1).upper()
80
+
81
+
82
+ def mount_windows(entry: DeviceEntry, mount_point: str) -> None:
83
+ if entry.disk_number is None or entry.partition_number is None:
84
+ raise RuntimeError("Partition details not available")
85
+ letter = _normalize_drive_letter(mount_point)
86
+ command = (
87
+ f"Get-Partition -DiskNumber {entry.disk_number} -PartitionNumber {entry.partition_number} | "
88
+ f"Set-Partition -NewDriveLetter {letter}"
89
+ )
90
+ result = run_powershell(command)
91
+ ensure_ok(result, "Set-Partition")
@@ -0,0 +1,197 @@
1
+
2
+
3
+ """run python/shell scripts from pre-defined directorys, or, run command/file in the machineconfig environment
4
+
5
+ Recursively Searched Predefined Directories:
6
+
7
+
8
+ * 'private' : $HOME/dotfiles/scripts
9
+
10
+ * 'public' : $HOME/.config/machineconfig/scripts
11
+
12
+ * 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
13
+
14
+ * 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
15
+
16
+ * 'custom' : custom directories from comma separated entry 'scripts' under 'general' section @ ~/dotfiles/machineconfig/defaults.ini
17
+
18
+ """
19
+
20
+
21
+ import typer
22
+ from typing import Annotated, Optional, Literal
23
+
24
+
25
+ def run_py_script(ctx: typer.Context,
26
+ name: Annotated[str, typer.Argument(help="Name of script to run, e.g., 'a' for a.py, or command to execute")] = "",
27
+ where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d", "custom", "c"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
28
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of scripts to run")] = False,
29
+ command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False,
30
+ list_scripts: Annotated[bool, typer.Option(..., "--list", "-l", help="List available scripts in all locations")] = False,
31
+ ) -> None:
32
+ if command:
33
+ exec(name)
34
+ return
35
+
36
+ from pathlib import Path
37
+ if list_scripts:
38
+ from machineconfig.scripts.python.helpers.helpers_search.script_help import list_available_scripts
39
+ list_available_scripts(where=where)
40
+ return
41
+
42
+ if not interactive and not name:
43
+ typer.echo("❌ ERROR: You must provide a script name or use --interactive option to select a script.")
44
+ raise typer.Exit(code=1)
45
+ target_file: Optional[Path] = None
46
+
47
+ if where in ["dynamic", "d"]:
48
+ # src/machineconfig/jobs/scripts/python_scripts/a.py
49
+ if "." in name: resolved_names: list[str] = [name]
50
+ else: resolved_names = [f"{name}{a_suffix}" for a_suffix in [".py", ".sh", "", ".ps1", ".bat", ".cmd"]]
51
+ urls = [f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/jobs/scripts_dynamic/{a_resolved_name}""" for a_resolved_name in resolved_names]
52
+ for a_url in urls:
53
+ try:
54
+ print(f"Fetching temporary script from {a_url} ...")
55
+ import requests
56
+ response = requests.get(a_url)
57
+ if response.status_code != 200:
58
+ print(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}")
59
+ raise RuntimeError(f"Could not fetch script '{name}.py' from repository.")
60
+ script_content = response.text
61
+ target_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", f"{name}.py")
62
+ target_file.parent.mkdir(parents=True, exist_ok=True)
63
+ target_file.write_text(script_content, encoding="utf-8")
64
+ except Exception as _e:
65
+ pass
66
+
67
+
68
+ if target_file is None and Path(name).is_file():
69
+ if name.endswith(".py"):
70
+ import machineconfig
71
+ import subprocess
72
+ import sys
73
+ subprocess.run([sys.executable, name], cwd=machineconfig.__path__[0])
74
+ return
75
+ else:
76
+ if Path(name).suffix in [".sh", ".ps1", ".bat", ".cmd", ""]:
77
+ target_file = Path(name)
78
+ else:
79
+ print(f"❌ Error: File '{name}' is not a recognized script type. Supported types are {'.py', '.sh', '.ps1', '.bat', '.cmd', ''}.")
80
+ raise typer.Exit(code=1)
81
+
82
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT, DEFAULTS_PATH
83
+ private_root = Path.home().joinpath("dotfiles/scripts") # local directory
84
+ public_root = CONFIG_ROOT.joinpath("scripts") # local machineconfig directory
85
+ library_root = LIBRARY_ROOT.joinpath("jobs", "scripts")
86
+
87
+ def get_custom_roots() -> list[Path]:
88
+ custom_roots: list[Path] = []
89
+ if DEFAULTS_PATH.is_file():
90
+ from configparser import ConfigParser
91
+ config = ConfigParser()
92
+ config.read(DEFAULTS_PATH)
93
+ if config.has_section("general") and config.has_option("general", "scripts"):
94
+ custom_dirs = config.get("general", "scripts").split(",")
95
+ for custom_dir in custom_dirs:
96
+ custom_path = Path(custom_dir.strip()).expanduser().resolve()
97
+ if custom_path.is_dir():
98
+ custom_roots.append(custom_path)
99
+ return custom_roots
100
+
101
+ roots: list[Path] = []
102
+ match where:
103
+ case "all" | "a":
104
+ roots = [private_root, public_root, library_root] + get_custom_roots()
105
+ case "private" | "p":
106
+ roots = [private_root]
107
+ case "public" | "b":
108
+ roots = [public_root]
109
+ case "library" | "l":
110
+ roots = [library_root]
111
+ case "dynamic" | "d":
112
+ roots = []
113
+ case "custom" | "c":
114
+ roots = get_custom_roots()
115
+
116
+ suffixes: list[str]
117
+ if "." in name:
118
+ suffixes = [""]
119
+ else:
120
+ import platform
121
+ if platform.system() == "Windows":
122
+ suffixes = [".py", ".bat", ".cmd", ".ps1"]
123
+ elif platform.system() == "Darwin" or platform.system() == "Linux":
124
+ suffixes = [""] # files without suffix could be shell scripts, and that already cover files with .sh suffix without duplications
125
+ else:
126
+ suffixes = [".py"]
127
+
128
+ # Finding target file
129
+ potential_matches: list[Path] = []
130
+ if target_file is None:
131
+ for a_root in roots:
132
+ for a_suffix in suffixes:
133
+ if a_root.joinpath(f"{name}{a_suffix}").is_file():
134
+ target_file = a_root.joinpath(f"{name}{a_suffix}")
135
+ break # perfect match
136
+ potential_matches += [a_file for a_file in a_root.rglob(f"*{name}*{a_suffix}") if a_file.is_file()]
137
+
138
+ if target_file is None:
139
+ if len(potential_matches) == 1:
140
+ target_file = potential_matches[0]
141
+ elif len(potential_matches) == 0:
142
+ typer.echo(ctx.get_help())
143
+ typer.echo()
144
+ typer.echo(typer.style(f"❌ ERROR: Could not find script '{name}'.", fg=typer.colors.RED, bold=True))
145
+ typer.echo("Searched in:")
146
+ for r in roots:
147
+ typer.echo(f" - {r}")
148
+ raise typer.Exit(code=1)
149
+ else:
150
+ typer.echo(typer.style(f"Warning: Could not find script '{name}'. Checked {len(potential_matches)} candidate files, trying interactively:", fg=typer.colors.YELLOW))
151
+ from machineconfig.utils.options import choose_from_options
152
+ options = [str(p) for p in potential_matches]
153
+ chosen_file_part = choose_from_options(options, multi=False, msg="Select the script to run:", tv=True, preview="bat")
154
+ target_file = Path(chosen_file_part)
155
+
156
+ typer.echo(typer.style(f"✅ Found script at: {target_file}", fg=typer.colors.GREEN))
157
+ if target_file.suffix == ".py":
158
+ from machineconfig.utils.code import get_uv_command_executing_python_file, exit_then_run_shell_script
159
+ shell_script = get_uv_command_executing_python_file(python_file=str(target_file), uv_project_dir=None, uv_with=None, prepend_print=False)
160
+ exit_then_run_shell_script(script=shell_script)
161
+ else:
162
+ from machineconfig.utils.code import exit_then_run_shell_file
163
+ exit_then_run_shell_file(script_path=str(target_file), strict=True)
164
+
165
+
166
+ def copy_script_to_local(ctx: typer.Context,
167
+ name: Annotated[str, typer.Argument(help="Name of the temporary python script to copy, e.g., 'a' for a.py")],
168
+ alias: Annotated[Optional[str], typer.Option("--alias", "-a", help="Whether to create call it a different name locally")] = None
169
+ ) -> None:
170
+ """
171
+ Copy a temporary python script stored in machineconfig/scripts/python/helpers/tmp_py_scripts to the local machine.
172
+ """
173
+ url = f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/scripts/python/helpers/tmp_py_scripts/{name}.py"""
174
+ import requests
175
+ response = requests.get(url)
176
+ if response.status_code != 200:
177
+ typer.echo(ctx.get_help())
178
+ typer.echo()
179
+ typer.echo(typer.style(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}", fg=typer.colors.RED, bold=True))
180
+ raise typer.Exit(code=1)
181
+ script_content = response.text
182
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
183
+ local_path = CONFIG_ROOT.joinpath(f"scripts_python/{alias or name}.py")
184
+ with open(local_path, "w") as f:
185
+ f.write(script_content)
186
+ typer.echo(typer.style(f"✅ Script '{name}.py' has been copied to '{local_path}'.", fg=typer.colors.GREEN))
187
+
188
+
189
+ def get_app():
190
+ app = typer.Typer(
191
+ name="run-tmp-script",
192
+ help="Helper to run temporary python scripts stored in machineconfig/scripts/python/helpers/tmp_py_scripts",
193
+ no_args_is_help=True,
194
+ )
195
+ from machineconfig.jobs.scripts_dynamic import a
196
+ app.command()(a.main)
197
+ return app
@@ -0,0 +1,41 @@
1
+ $presets = @{
2
+ "nerd-font-symbols" = "Changes the symbols for each module to use Nerd Font symbols."
3
+ "no-nerd-font" = "Changes the symbols so that no Nerd Font symbols are used."
4
+ "bracketed-segments" = "Changes the format to show segments in brackets."
5
+ "plain-text-symbols" = "Changes the symbols for each module into plain text."
6
+ "no-runtime-versions" = "Hides the version of language runtimes."
7
+ "no-empty-icons" = "Does not show icons if the toolset is not found."
8
+ "pure-preset" = "Emulates the look and behavior of Pure."
9
+ "pastel-powerline" = "Inspired by M365Princess."
10
+ "tokyo-night" = "Inspired by tokyo-night-vscode-theme."
11
+ "gruvbox-rainbow" = "Inspired by Pastel Powerline and Tokyo Night."
12
+ "jetpack" = "Pseudo minimalist preset inspired by geometry and spaceship."
13
+ }
14
+
15
+ $input_list = $presets.Keys | ForEach-Object { "$_`t$($presets[$_])" }
16
+
17
+ $preview_config = "$env:TEMP/starship_preview.toml"
18
+
19
+ # Preview command for PowerShell
20
+ # We need to split the line and get the first part.
21
+ # tv replaces {} with the line.
22
+ # We use powershell -c for the preview command to be safe and consistent.
23
+
24
+ $preview_cmd = "powershell -c `"`$preset = '{}'.Split('`t')[0]; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`""
25
+
26
+ if (Get-Command "tv" -ErrorAction SilentlyContinue) {
27
+ $selected_line = $input_list | tv --preview-command $preview_cmd --preview-size 50
28
+ } elseif (Get-Command "fzf" -ErrorAction SilentlyContinue) {
29
+ # fzf fallback
30
+ $selected_line = $input_list | fzf --ansi --delimiter "`t" --with-nth 1,2 --preview "powershell -c `"`$preset = {1}; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`"" --preview-window bottom:50%
31
+ } else {
32
+ Write-Host "Error: 'tv' or 'fzf' not found."
33
+ exit 1
34
+ }
35
+
36
+ if ($selected_line) {
37
+ $selected_preset = $selected_line.Split("`t")[0]
38
+ Write-Host "Applying $selected_preset..."
39
+ starship preset $selected_preset -o "$HOME/.config/starship.toml"
40
+ Write-Host "Done!"
41
+ }