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,245 @@
1
+
2
+
3
+ from platform import system
4
+ from pathlib import Path
5
+ from rich.console import Console
6
+ from rich.panel import Panel
7
+ from rich.table import Table
8
+ from rich import box
9
+ import subprocess
10
+ import os
11
+
12
+ from machineconfig.scripts.python.helpers.helpers_network.ssh.ssh_debug_windows_utils import check_sshd_binary_exists, detect_openssh, run_powershell
13
+
14
+
15
+ console = Console()
16
+
17
+
18
+ def ssh_debug_windows() -> dict[str, dict[str, str | bool]]:
19
+ if system() != "Windows":
20
+ raise NotImplementedError("ssh_debug_windows is only supported on Windows")
21
+
22
+ results: dict[str, dict[str, str | bool]] = {}
23
+ issues: list[tuple[str, str, str]] = []
24
+ current_user = os.environ.get("USERNAME", "unknown")
25
+ ssh_port = "22"
26
+ ip_addresses: list[str] = []
27
+
28
+ sshd_exists, sshd_path = check_sshd_binary_exists()
29
+ install_type, _sshd_exe, config_dir = detect_openssh()
30
+ ok, hostname = run_powershell("hostname")
31
+ hostname = hostname if ok else "unknown"
32
+
33
+ install_info: list[str] = []
34
+ if not sshd_exists:
35
+ results["installation"] = {"status": "error", "message": "sshd.exe not found on system"}
36
+ issues.append(("sshd.exe not found", "OpenSSH Server binary missing entirely", "Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0"))
37
+ install_info.append("❌ sshd.exe: [red]NOT FOUND[/red]")
38
+ install_info.append(" [dim]OpenSSH Server is not installed on this system[/dim]")
39
+ elif install_type == "not_found":
40
+ results["installation"] = {"status": "warning", "message": f"sshd found at {sshd_path} but not in standard location"}
41
+ install_info.append(f"⚠️ sshd.exe: found at [yellow]{sshd_path}[/yellow]")
42
+ install_info.append(" [dim]Non-standard location - may need manual configuration[/dim]")
43
+ else:
44
+ results["installation"] = {"status": "ok", "message": f"OpenSSH installed ({install_type})"}
45
+ install_info.append(f"✅ OpenSSH Server: installed via {'Windows Capability' if install_type == 'capability' else 'winget'}")
46
+ install_info.append(f" Binary: {sshd_path}")
47
+ install_info.append(f" Config: {config_dir}")
48
+
49
+ ok, status = run_powershell("Get-Service -Name sshd -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Status")
50
+ if not ok or not status:
51
+ results["ssh_service"] = {"status": "error", "message": "sshd service not found"}
52
+ issues.append(("sshd service missing", "SSH daemon not installed", "Install OpenSSH Server first"))
53
+ install_info.append("❌ sshd service: [red]NOT FOUND[/red]")
54
+ elif status != "Running":
55
+ results["ssh_service"] = {"status": "error", "message": f"sshd is {status}"}
56
+ issues.append((f"sshd is {status}", "SSH connections will be refused", "Start-Service sshd ; Set-Service sshd -StartupType Automatic"))
57
+ install_info.append(f"❌ sshd service: [yellow]{status}[/yellow]")
58
+ else:
59
+ results["ssh_service"] = {"status": "ok", "message": "sshd running"}
60
+ ok, startup = run_powershell("Get-Service -Name sshd | Select-Object -ExpandProperty StartType")
61
+ startup_note = f" (startup: {startup})" if ok else ""
62
+ install_info.append(f"✅ sshd service: [green]Running[/green]{startup_note}")
63
+
64
+ console.print(Panel("\n".join(install_info), title="[bold]Installation & Service[/bold]", border_style="blue"))
65
+
66
+ ssh_dir = Path.home().joinpath(".ssh")
67
+ authorized_keys = ssh_dir.joinpath("authorized_keys")
68
+ admin_auth_keys = Path("C:/ProgramData/ssh/administrators_authorized_keys")
69
+ perm_info: list[str] = []
70
+
71
+ ok, is_admin_str = run_powershell("([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)")
72
+ is_admin = "True" in is_admin_str
73
+
74
+ if is_admin:
75
+ perm_info.append(f"👤 User [cyan]{current_user}[/cyan] is an [yellow]Administrator[/yellow]")
76
+ perm_info.append(" ➜ Keys must be in: [cyan]C:\\ProgramData\\ssh\\administrators_authorized_keys[/cyan]")
77
+ target_auth_keys = admin_auth_keys
78
+ else:
79
+ perm_info.append(f"👤 User [cyan]{current_user}[/cyan] is a standard user")
80
+ perm_info.append(f" ➜ Keys should be in: [cyan]{authorized_keys}[/cyan]")
81
+ target_auth_keys = authorized_keys
82
+
83
+ if not target_auth_keys.exists():
84
+ results["authorized_keys"] = {"status": "error", "message": f"{target_auth_keys.name} missing"}
85
+ issues.append((f"{target_auth_keys.name} missing", "No public keys authorized - SSH login will fail", f"Create file and add your public key to {target_auth_keys}"))
86
+ perm_info.append(f"\n❌ [red]{target_auth_keys.name} does not exist[/red]")
87
+ perm_info.append(" [dim]No keys = no login. Add your public key to this file.[/dim]")
88
+ else:
89
+ try:
90
+ keys = [line for line in target_auth_keys.read_text(encoding="utf-8").split("\n") if line.strip()]
91
+ results["authorized_keys"] = {"status": "ok", "message": f"{len(keys)} key(s)"}
92
+ perm_info.append(f"\n✅ {target_auth_keys.name}: [green]{len(keys)} key(s)[/green]")
93
+ except Exception as e:
94
+ perm_info.append(f"\n⚠️ Could not read {target_auth_keys.name}: {e}")
95
+
96
+ if is_admin and admin_auth_keys.exists():
97
+ ok, icacls_out = run_powershell(f'icacls "{admin_auth_keys}"')
98
+ if ok:
99
+ needs_fix = "BUILTIN\\Users" in icacls_out or "Everyone" in icacls_out
100
+ if needs_fix:
101
+ results["admin_keys_perms"] = {"status": "error", "message": "Permissions too open"}
102
+ issues.append(("administrators_authorized_keys permissions wrong", "sshd ignores file if permissions allow other users", f'icacls "{admin_auth_keys}" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"'))
103
+ perm_info.append("❌ [red]Permissions too open[/red] - sshd will ignore this file!")
104
+ else:
105
+ perm_info.append("✅ Permissions: restricted to Administrators/SYSTEM")
106
+
107
+ console.print(Panel("\n".join(perm_info), title="[bold]Keys & Permissions[/bold]", border_style="blue"))
108
+
109
+ net_info: list[str] = []
110
+ ok, ip_out = run_powershell("Get-NetIPAddress -AddressFamily IPv4 -PrefixOrigin Dhcp,Manual | Where-Object {$_.IPAddress -notlike '127.*' -and $_.IPAddress -notlike '169.254.*'} | Select-Object -ExpandProperty IPAddress")
111
+ if ok and ip_out:
112
+ ip_addresses = [ip.strip() for ip in ip_out.split("\n") if ip.strip()]
113
+ net_info.append(f"🌐 IP addresses: [cyan]{', '.join(ip_addresses)}[/cyan]")
114
+
115
+ sshd_config: Path | None = config_dir.joinpath("sshd_config") if config_dir else None
116
+ config_text: str | None = None
117
+ if sshd_config and sshd_config.exists():
118
+ try:
119
+ config_text = sshd_config.read_text(encoding="utf-8")
120
+ except PermissionError:
121
+ ok, config_text_ps = run_powershell(f'Get-Content "{sshd_config}" -Raw')
122
+ config_text = config_text_ps if ok and config_text_ps else None
123
+ except Exception:
124
+ config_text = None
125
+ if config_text:
126
+ port_lines = [line for line in config_text.split("\n") if line.strip().startswith("Port") and not line.strip().startswith("#")]
127
+ if port_lines:
128
+ ssh_port = port_lines[0].split()[1]
129
+
130
+ auth_info: list[str] = []
131
+ auth_info.append(f"📄 Config file: [cyan]{sshd_config}[/cyan]" if sshd_config else "📄 Config file: [red]not found[/red]")
132
+ if config_text:
133
+ pubkey_lines = [line for line in config_text.split("\n") if "PubkeyAuthentication" in line and not line.strip().startswith("#")]
134
+ if pubkey_lines and "no" in pubkey_lines[-1].lower():
135
+ results["pubkey_auth"] = {"status": "error", "message": "PubkeyAuthentication disabled"}
136
+ issues.append(("PubkeyAuthentication disabled", "Key-based login won't work", f'Edit {sshd_config} and set PubkeyAuthentication yes, then Restart-Service sshd'))
137
+ auth_info.append("❌ PubkeyAuthentication: [red]disabled[/red]")
138
+ else:
139
+ results["pubkey_auth"] = {"status": "ok", "message": "PubkeyAuthentication enabled (default)"}
140
+ auth_info.append("✅ PubkeyAuthentication: [green]enabled[/green] (default: yes)")
141
+
142
+ password_lines = [line for line in config_text.split("\n") if "PasswordAuthentication" in line and not line.strip().startswith("#")]
143
+ if password_lines:
144
+ password_enabled = "yes" in password_lines[-1].lower()
145
+ if password_enabled:
146
+ results["password_auth"] = {"status": "ok", "message": "PasswordAuthentication enabled"}
147
+ auth_info.append("✅ PasswordAuthentication: [green]enabled[/green]")
148
+ else:
149
+ results["password_auth"] = {"status": "info", "message": "PasswordAuthentication disabled"}
150
+ auth_info.append("🔐 PasswordAuthentication: [yellow]disabled[/yellow] (key-only)")
151
+ else:
152
+ results["password_auth"] = {"status": "ok", "message": "PasswordAuthentication enabled (default)"}
153
+ auth_info.append("✅ PasswordAuthentication: [green]enabled[/green] (default: yes)")
154
+ else:
155
+ auth_info.append("⚠️ Could not read sshd_config - auth settings unknown")
156
+ results["pubkey_auth"] = {"status": "unknown", "message": "Could not read config"}
157
+ results["password_auth"] = {"status": "unknown", "message": "Could not read config"}
158
+
159
+ console.print(Panel("\n".join(auth_info), title="[bold]Authentication Settings[/bold]", border_style="blue"))
160
+
161
+ net_info.append(f"🔌 SSH port: [cyan]{ssh_port}[/cyan]")
162
+ netstat = subprocess.run(["netstat", "-an"], capture_output=True, text=True, check=False)
163
+ if netstat.returncode == 0:
164
+ listening_lines = [line for line in netstat.stdout.split("\n") if f":{ssh_port}" in line and "LISTENING" in line]
165
+ if not listening_lines:
166
+ results["ssh_listening"] = {"status": "error", "message": f"Not listening on port {ssh_port}"}
167
+ issues.append((f"SSH not listening on port {ssh_port}", "No connections possible", "Restart-Service sshd"))
168
+ net_info.append(f"❌ Listening: [red]NOT listening on port {ssh_port}[/red]")
169
+ elif all("127.0.0.1" in line or "[::1]" in line for line in listening_lines):
170
+ results["ssh_listening"] = {"status": "error", "message": "Listening on localhost only"}
171
+ issues.append(("SSH bound to localhost only", "Only local connections work", f"Check ListenAddress in {sshd_config}"))
172
+ net_info.append("❌ Listening: [red]localhost only[/red] (remote connections blocked)")
173
+ else:
174
+ results["ssh_listening"] = {"status": "ok", "message": f"Listening on port {ssh_port}"}
175
+ net_info.append(f"✅ Listening: 0.0.0.0:{ssh_port}")
176
+
177
+ fw_cmd = f"""
178
+ $rules = Get-NetFirewallRule -ErrorAction SilentlyContinue | Where-Object {{
179
+ ($_.DisplayName -like '*SSH*' -or $_.DisplayName -like '*OpenSSH*' -or $_.Name -like '*SSH*' -or $_.Name -like '*sshd*') -and
180
+ $_.Direction -eq 'Inbound'
181
+ }}
182
+ if (-not $rules) {{
183
+ $portFilter = Get-NetFirewallPortFilter -ErrorAction SilentlyContinue | Where-Object {{ $_.LocalPort -eq '{ssh_port}' -and $_.Protocol -eq 'TCP' }}
184
+ if ($portFilter) {{
185
+ $rules = $portFilter | ForEach-Object {{ Get-NetFirewallRule -AssociatedNetFirewallPortFilter $_ -ErrorAction SilentlyContinue }} | Where-Object {{ $_.Direction -eq 'Inbound' }}
186
+ }}
187
+ }}
188
+ if ($rules) {{
189
+ $rules | Select-Object Name, DisplayName, Enabled, Action | Format-List
190
+ }}
191
+ """
192
+ ok, fw_out = run_powershell(fw_cmd)
193
+ if ok and fw_out.strip():
194
+ has_allow = "Enabled : True" in fw_out and "Action : Allow" in fw_out
195
+ if has_allow:
196
+ results["firewall"] = {"status": "ok", "message": "Firewall allows SSH"}
197
+ net_info.append("✅ Firewall: SSH rule exists and enabled")
198
+ else:
199
+ results["firewall"] = {"status": "warning", "message": "Firewall rule exists but may not be active"}
200
+ issues.append(("Firewall rule not active", "Incoming SSH may be blocked", f'New-NetFirewallRule -Name "SSH" -DisplayName "SSH" -Protocol TCP -LocalPort {ssh_port} -Action Allow -Enabled True'))
201
+ net_info.append("⚠️ Firewall: SSH rule exists but [yellow]not enabled[/yellow]")
202
+ else:
203
+ if not is_admin:
204
+ results["firewall"] = {"status": "warning", "message": "Cannot verify firewall (run as Admin)"}
205
+ net_info.append("⚠️ Firewall: [yellow]Cannot verify - run script as Administrator[/yellow]")
206
+ net_info.append(" [dim]Firewall rules may exist but require elevation to query.[/dim]")
207
+ else:
208
+ results["firewall"] = {"status": "error", "message": "No SSH firewall rule"}
209
+ issues.append(("No SSH firewall rule", "Windows Firewall blocks incoming SSH by default", f'New-NetFirewallRule -Name "SSH" -DisplayName "SSH" -Protocol TCP -LocalPort {ssh_port} -Action Allow -Enabled True'))
210
+ net_info.append("❌ Firewall: [red]No SSH rule found[/red]")
211
+ net_info.append(" [dim]Windows blocks all incoming by default. Must create allow rule.[/dim]")
212
+
213
+ console.print(Panel("\n".join(net_info), title="[bold]Network & Firewall[/bold]", border_style="blue"))
214
+
215
+ if issues:
216
+ fix_table = Table(title="Issues & Fixes", box=box.ROUNDED, show_lines=True, title_style="bold red")
217
+ fix_table.add_column("Issue", style="yellow", width=30)
218
+ fix_table.add_column("Impact", style="white", width=35)
219
+ fix_table.add_column("Fix Command", style="green", width=60)
220
+ for issue, impact, fix in issues:
221
+ fix_table.add_row(issue, impact, fix)
222
+ console.print(fix_table)
223
+
224
+ fix_script_path = Path(os.environ.get("TEMP", "C:/Temp")).joinpath("ssh_fix.ps1")
225
+ script_lines = ["# SSH Fix Script - Generated by ssh_debug_windows", f"# {len(issues)} issue(s) to fix", "# Run this script as Administrator", "", "$ErrorActionPreference = 'Stop'", ""]
226
+ for issue, _impact, fix in issues:
227
+ script_lines.append(f"# Fix: {issue}")
228
+ script_lines.append(f"Write-Host 'Fixing: {issue}' -ForegroundColor Yellow")
229
+ script_lines.append(fix)
230
+ script_lines.append("")
231
+ script_lines.append("Write-Host 'All fixes applied. Re-run ssh_debug_windows to verify.' -ForegroundColor Green")
232
+ fix_script_path.write_text("\n".join(script_lines), encoding="utf-8")
233
+
234
+ console.print(Panel(f"[bold yellow]⚠️ {len(issues)} issue(s) found[/bold yellow]\n\nFix script generated: [cyan]{fix_script_path}[/cyan]\nRun as Administrator: [green]powershell -ExecutionPolicy Bypass -File \"{fix_script_path}\"[/green]", title="[bold]Summary[/bold]", border_style="yellow"))
235
+ else:
236
+ conn_info = f"👤 {current_user} 🖥️ {hostname} 🔌 :{ssh_port}"
237
+ if ip_addresses:
238
+ conn_info += f"\n\n[bold]Connect:[/bold] ssh {current_user}@{ip_addresses[0]}"
239
+ console.print(Panel(f"[bold green]✅ All checks passed[/bold green]\n\n{conn_info}", title="[bold]Ready[/bold]", border_style="green"))
240
+
241
+ return results
242
+
243
+
244
+ if __name__ == "__main__":
245
+ ssh_debug_windows()
@@ -0,0 +1,34 @@
1
+ from pathlib import Path
2
+ import subprocess
3
+
4
+
5
+ def run_powershell(cmd: str) -> tuple[bool, str]:
6
+ result = subprocess.run(["powershell", "-Command", cmd], capture_output=True, text=True, check=False)
7
+ return result.returncode == 0, result.stdout.strip()
8
+
9
+
10
+ def check_sshd_binary_exists() -> tuple[bool, str]:
11
+ sshd_locations = [
12
+ Path("C:/Windows/System32/OpenSSH/sshd.exe"),
13
+ Path("C:/Program Files/OpenSSH/sshd.exe"),
14
+ Path("C:/Program Files (x86)/OpenSSH/sshd.exe"),
15
+ ]
16
+ for loc in sshd_locations:
17
+ if loc.exists():
18
+ return True, str(loc)
19
+ ok, which_out = run_powershell("Get-Command sshd -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Source")
20
+ if ok and which_out:
21
+ return True, which_out
22
+ return False, ""
23
+
24
+
25
+ def detect_openssh() -> tuple[str, Path | None, Path | None]:
26
+ capability_sshd = Path("C:/Windows/System32/OpenSSH/sshd.exe")
27
+ winget_sshd = Path("C:/Program Files/OpenSSH/sshd.exe")
28
+ programdata_config = Path("C:/ProgramData/ssh")
29
+ capability_config = Path("C:/ProgramData/ssh")
30
+ if capability_sshd.exists():
31
+ return ("capability", capability_sshd, capability_config)
32
+ if winget_sshd.exists():
33
+ return ("winget", winget_sshd, programdata_config)
34
+ return ("not_found", None, None)
@@ -1,7 +1,7 @@
1
- from machineconfig.scripts.python.helpers_repos.action_helper import GitAction, GitOperationResult, GitOperationSummary, print_git_operations_summary
1
+ from machineconfig.scripts.python.helpers.helpers_repos.action_helper import GitAction, GitOperationResult, GitOperationSummary, print_git_operations_summary
2
2
  from machineconfig.utils.path_extended import PathExtended
3
3
  from machineconfig.utils.accessories import randstr
4
- from machineconfig.scripts.python.helpers_repos.update import update_repository
4
+ from machineconfig.scripts.python.helpers.helpers_repos.update import update_repository
5
5
 
6
6
  from typing import Optional, Dict, Any, List, cast
7
7
  import concurrent.futures
@@ -117,7 +117,7 @@ def perform_git_operations(repos_root: PathExtended, pull: bool, commit: bool, p
117
117
  operations_performed.append("push")
118
118
 
119
119
  # Collect all candidate paths first
120
- paths = list(repos_root.search("*"))
120
+ paths = list(repos_root.glob("*"))
121
121
 
122
122
  def _process_path(a_path: PathExtended) -> Dict[str, Any]:
123
123
  """Worker that processes a single path and returns metadata and results."""
@@ -1,5 +1,5 @@
1
1
  from enum import Enum
2
- from machineconfig.utils.path_extended import PathExtended
2
+ from pathlib import Path
3
3
 
4
4
 
5
5
  from dataclasses import dataclass
@@ -12,7 +12,7 @@ from rich.table import Table
12
12
  @dataclass
13
13
  class GitOperationResult:
14
14
  """Result of a git operation on a single repository."""
15
- repo_path: PathExtended
15
+ repo_path: Path
16
16
  action: str
17
17
  success: bool
18
18
  message: str
@@ -52,7 +52,7 @@ class GitOperationSummary:
52
52
 
53
53
  def __post_init__(self):
54
54
  self.failed_operations: list[GitOperationResult] = []
55
- self.repos_without_remotes: list[PathExtended] = []
55
+ self.repos_without_remotes: list[Path] = []
56
56
 
57
57
 
58
58
  def print_git_operations_summary(summary: GitOperationSummary, operations_performed: list[str]) -> None:
@@ -1,12 +1,27 @@
1
1
 
2
- from typing import Optional, Literal, Annotated
3
2
 
3
+ from typing import Optional, Literal, Annotated
4
4
  import typer
5
+ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION
6
+
7
+
8
+ def get_tmp_file():
9
+ from pathlib import Path
10
+ import platform
11
+ from machineconfig.utils.accessories import randstr
12
+ name = randstr(8)
13
+ if platform.system() == "Windows":
14
+ suffix = "ps1"
15
+ else:
16
+ suffix = "sh"
17
+ tmp_file = Path.home().joinpath(f"tmp_results/tmp_files/{name}.{suffix}")
18
+ tmp_file.parent.mkdir(parents=True, exist_ok=True)
19
+ return tmp_file
5
20
 
6
21
 
7
22
  def main(
23
+ repo: Annotated[str, typer.Argument(..., help="Path to the local repository. Defaults to current working directory.")],
8
24
  cloud: Annotated[Optional[str], typer.Option(..., "--cloud", "-c", help="Cloud storage profile name. If not provided, uses default from config.")] = None,
9
- repo: Annotated[Optional[str], typer.Option(..., "--repo", "-r", help="Path to the local repository. Defaults to current working directory.")] = None,
10
25
  message: Annotated[Optional[str], typer.Option(..., "--message", "-m", help="Commit message for local changes.")] = None,
11
26
  on_conflict: Annotated[Literal["ask", "a",
12
27
  "push-local-merge", "p",
@@ -29,6 +44,7 @@ def main(
29
44
  "remove-rclone-conflict": "remove-rclone-conflict",
30
45
  }
31
46
  on_conflict = on_conflict_mapper[on_conflict]
47
+ import platform
32
48
  import git
33
49
  from rich.console import Console
34
50
  from rich.panel import Panel
@@ -38,14 +54,18 @@ def main(
38
54
  from machineconfig.utils.source_of_truth import CONFIG_ROOT, DEFAULTS_PATH
39
55
  from machineconfig.utils.code import get_uv_command_executing_python_script
40
56
  from pathlib import Path
41
- import platform
42
57
  import subprocess
43
58
  console = Console()
44
59
 
60
+ def _bash_single_quote(val: str) -> str:
61
+ return "'" + val.replace("'", "'\"'\"'") + "'"
62
+
63
+ def _ps_single_quote(val: str) -> str:
64
+ return "'" + val.replace("'", "''") + "'"
65
+
45
66
  if cloud is None:
46
67
  try:
47
68
  from machineconfig.utils.io import read_ini
48
-
49
69
  cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
50
70
  console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", title="Default Cloud", border_style="yellow"))
51
71
  except FileNotFoundError:
@@ -53,11 +73,12 @@ def main(
53
73
  return ""
54
74
  else:
55
75
  cloud_resolved = cloud
56
- repo_local_root = PathExtended.cwd() if repo is None else PathExtended(repo).expanduser().absolute()
76
+ repo_local_root = PathExtended.cwd() if repo == "." else PathExtended(repo).expanduser().absolute()
57
77
  try:
58
78
  repo_local_obj = git.Repo(repo_local_root, search_parent_directories=True)
59
79
  except git.InvalidGitRepositoryError:
60
- typer.echo(f"[red]Error:[/] The specified path '{repo_local_root}' is not a valid git repository.")
80
+ msg = typer.style("Error: ", fg=typer.colors.RED) + f"The specified path '{repo_local_root}' is not a valid git repository."
81
+ typer.echo(msg)
61
82
  typer.Exit(code=1)
62
83
  return ""
63
84
  repo_local_root = PathExtended(repo_local_obj.working_dir) # cwd might have been in a sub directory of repo_root, so its better to redefine it.
@@ -80,43 +101,89 @@ def main(
80
101
  if repo_remote_obj.is_dirty():
81
102
  console.print(Panel(f"⚠️ WARNING: REMOTE REPOSITORY IS DIRTY\nLocation: {repo_remote_root}\nPlease commit or stash changes before proceeding.", title="Warning", border_style="yellow"))
82
103
 
83
- script = f"""
104
+ message_resolved = "sync" if message is None or message.strip() == "" else message
105
+
106
+ repo_local_root_str = str(repo_local_root)
107
+ repo_remote_root_str = str(repo_remote_root)
108
+
109
+ script_bash = f"""
84
110
  echo ""
85
- echo 'echo -e "\\033[1;34m═════ COMMITTING LOCAL CHANGES ═════\\033[0m"'
86
- cd {repo_local_root}
111
+ echo -e "\\033[1;34m═════ COMMITTING LOCAL CHANGES ═════\\033[0m"
112
+ cd {_bash_single_quote(repo_local_root_str)}
87
113
  git status
88
- git add .
89
- git commit -am "{message}"
114
+ git add -A
115
+ if git diff --cached --quiet; then
116
+ echo "-> No staged changes to commit."
117
+ else
118
+ git commit -m {_bash_single_quote(message_resolved)} || true
119
+ fi
90
120
  echo ""
91
121
  echo ""
92
- echo 'echo -e "\\033[1;34m═════ PULLING LATEST FROM REMOTE ═════\\033[0m"'
93
- cd {repo_local_root}
94
- echo '-> Trying to removing originEnc remote from local repo if it exists.'
95
- # git remote remove originEnc
122
+ echo -e "\\033[1;34m═════ PULLING LATEST FROM REMOTE ═════\\033[0m"
123
+ cd {_bash_single_quote(repo_local_root_str)}
124
+ echo "-> Trying to removing originEnc remote from local repo if it exists."
96
125
  git remote remove originEnc 2>/dev/null || true
97
- echo '-> Adding originEnc remote to local repo'
98
- git remote add originEnc {repo_remote_root}
99
- echo '-> Fetching originEnc remote.'
126
+ echo "-> Adding originEnc remote to local repo"
127
+ git remote add originEnc {_bash_single_quote(repo_remote_root_str)}
128
+ echo "-> Fetching originEnc remote."
100
129
  git pull originEnc master
101
130
 
102
131
  """
103
132
 
133
+ script_powershell = f"""
134
+ Write-Host ""
135
+ Write-Host "═════ COMMITTING LOCAL CHANGES ═════" -ForegroundColor Blue
136
+ Set-Location -LiteralPath {_ps_single_quote(repo_local_root_str)}
137
+ git status
138
+ git add -A
139
+ git diff --cached --quiet
140
+ if ($LASTEXITCODE -eq 0) {{
141
+ Write-Host "-> No staged changes to commit."
142
+ }} else {{
143
+ git commit -m {_ps_single_quote(message_resolved)}
144
+ if ($LASTEXITCODE -ne 0) {{
145
+ Write-Host "-> Commit skipped/failed (continuing)."
146
+ }}
147
+ }}
148
+
149
+ Write-Host ""
150
+ Write-Host ""
151
+ Write-Host "═════ PULLING LATEST FROM REMOTE ═════" -ForegroundColor Blue
152
+ Set-Location -LiteralPath {_ps_single_quote(repo_local_root_str)}
153
+ Write-Host "-> Trying to remove originEnc remote from local repo if it exists."
154
+ git remote remove originEnc 2>$null
155
+ Write-Host "-> Adding originEnc remote to local repo"
156
+ git remote add originEnc {_ps_single_quote(repo_remote_root_str)}
157
+ Write-Host "-> Fetching originEnc remote."
158
+ git pull originEnc master
159
+ exit $LASTEXITCODE
160
+ """
161
+
162
+ script = script_powershell if platform.system() == "Windows" else script_bash
163
+
104
164
  if Path.home().joinpath("code/machineconfig").exists():
105
165
  uv_project_dir = f"""{str(Path.home().joinpath("code/machineconfig"))}"""
106
166
  uv_with = None
107
167
  else:
108
- uv_with = ["machineconfig>=7.98"]
168
+ uv_with = [MACHINECONFIG_VERSION]
109
169
  uv_project_dir = None
110
170
 
111
- import tempfile
112
- shell_path = Path(tempfile.mkstemp(suffix=".ps1" if platform.system() == "Windows" else ".sh")[1])
171
+ shell_path = get_tmp_file()
113
172
  shell_path.write_text(script, encoding="utf-8")
114
-
115
- command = f". {shell_path}"
116
173
  if platform.system() == "Windows":
117
- completed = subprocess.run(["powershell", "-Command", command], capture_output=True, check=False, text=True)
174
+ completed = subprocess.run(
175
+ ["powershell", "-ExecutionPolicy", "Bypass", "-File", str(shell_path)],
176
+ capture_output=True,
177
+ check=False,
178
+ text=True,
179
+ )
118
180
  else:
119
- completed = subprocess.run(command, shell=True, capture_output=True, check=False, text=True)
181
+ completed = subprocess.run(
182
+ ["bash", str(shell_path)],
183
+ capture_output=True,
184
+ check=False,
185
+ text=True,
186
+ )
120
187
  res = Response.from_completed_process(completed).capture().print()
121
188
 
122
189
  if res.is_successful(strict_err=True, strict_returcode=True):
@@ -134,31 +201,37 @@ git pull originEnc master
134
201
  option1 = "Delete remote copy and push local:"
135
202
  from machineconfig.utils.meta import lambda_to_python_script
136
203
  def func2(remote_repo: str, local_repo: str, cloud: str):
137
- from machineconfig.scripts.python.helpers_repos.sync import delete_remote_repo_copy_and_push_local
204
+ from machineconfig.scripts.python.helpers.helpers_repos.sync import delete_remote_repo_copy_and_push_local
138
205
  delete_remote_repo_copy_and_push_local(remote_repo=remote_repo, local_repo=local_repo, cloud=cloud)
139
206
  program_1_py = lambda_to_python_script(lambda: func2(remote_repo=str(repo_remote_root), local_repo=str(repo_local_root), cloud=str(cloud_resolved)),
140
207
  in_global=True, import_module=False)
141
208
  program1, _pyfile1 = get_uv_command_executing_python_script(python_script=program_1_py, uv_with=uv_with, uv_project_dir=uv_project_dir)
142
209
  # ================================================================================
210
+
143
211
  option2 = "Delete local repo and replace it with remote copy:"
144
- program_2 = f"""
145
- rm -rfd {repo_local_root}
146
- mv {repo_remote_root} {repo_local_root}
147
- """
212
+ if platform.system() == "Windows":
213
+ program_2 = f"""
214
+ Remove-Item -LiteralPath {_ps_single_quote(repo_local_root_str)} -Recurse -Force -ErrorAction SilentlyContinue
215
+ Move-Item -LiteralPath {_ps_single_quote(repo_remote_root_str)} -Destination {_ps_single_quote(repo_local_root_str)} -Force
216
+ """
217
+ else:
218
+ program_2 = f"""
219
+ rm -rfd {_bash_single_quote(repo_local_root_str)}
220
+ mv {_bash_single_quote(repo_remote_root_str)} {_bash_single_quote(repo_local_root_str)}
221
+ """
148
222
  if platform.system() in ["Linux", "Darwin"]:
149
223
  program_2 += """
150
224
  sudo chmod 600 $HOME/.ssh/*
151
225
  sudo chmod 700 $HOME/.ssh
152
226
  sudo chmod +x $HOME/dotfiles/scripts/linux -R
153
227
  """
154
- import tempfile
155
- shell_file_2 = Path(tempfile.mkstemp(suffix=".ps1" if platform.system() == "Windows" else ".sh")[1])
228
+ shell_file_2 = get_tmp_file()
156
229
  shell_file_2.write_text(program_2, encoding="utf-8")
157
230
 
158
231
  # ================================================================================
159
232
  option3 = "Inspect repos:"
160
233
  def func(repo_local_root: str, repo_remote_root: str):
161
- from machineconfig.scripts.python.helpers_repos.sync import inspect_repos
234
+ from machineconfig.scripts.python.helpers.helpers_repos.sync import inspect_repos
162
235
  inspect_repos(repo_local_root=repo_local_root, repo_remote_root=repo_remote_root)
163
236
  # program_3_py = function_to_script(func=func, call_with_kwargs={"repo_local_root": str(repo_local_root), "repo_remote_root": str(repo_remote_root)})
164
237
  # shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=None, executable=executable)
@@ -168,14 +241,24 @@ sudo chmod +x $HOME/dotfiles/scripts/linux -R
168
241
  # ================================================================================
169
242
 
170
243
  option4 = "Remove problematic rclone file from repo and replace with remote:"
171
- program_4 = f"""
244
+ if platform.system() == "Windows":
245
+ program_4 = f"""
246
+ Remove-Item -LiteralPath "$HOME/dotfiles/creds/rclone/rclone.conf" -Force -ErrorAction SilentlyContinue
247
+ New-Item -ItemType Directory -Path "$HOME/dotfiles/creds/rclone" -Force | Out-Null
248
+ Copy-Item -LiteralPath "$HOME/.config/machineconfig/remote/dotfiles/creds/rclone/rclone.conf" -Destination "$HOME/dotfiles/creds/rclone/rclone.conf" -Force
249
+ Set-Location -LiteralPath "$HOME/dotfiles"
250
+ git commit -am "finished merging"
251
+ {program1}
252
+ """
253
+ else:
254
+ program_4 = f"""
172
255
  rm $HOME/dotfiles/creds/rclone/rclone.conf
173
256
  cp $HOME/.config/machineconfig/remote/dotfiles/creds/rclone/rclone.conf $HOME/dotfiles/creds/rclone
174
257
  cd $HOME/dotfiles
175
258
  git commit -am "finished merging"
176
259
  {program1}
177
- """
178
- shell_file_4 = Path(tempfile.mkstemp(suffix=".ps1" if platform.system() == "Windows" else ".sh")[1])
260
+ """
261
+ shell_file_4 = get_tmp_file()
179
262
  shell_file_4.write_text(program_4, encoding="utf-8")
180
263
  # ================================================================================
181
264
 
@@ -213,6 +296,6 @@ git commit -am "finished merging"
213
296
  case _:
214
297
  raise ValueError(f"Unknown action: {on_conflict}")
215
298
  from machineconfig.utils.code import run_shell_script
216
- run_shell_script(script=program_content)
299
+ run_shell_script(script=program_content, display_script=True, clean_env=False)
217
300
  return program_content
218
301
 
@@ -169,7 +169,7 @@ def visualize(
169
169
  if platform.system() == "Windows":
170
170
  print(f"⚠️ Portable gource not found at {gource_exe}, installing...")
171
171
  install_gource_windows()
172
- # Check again after installation
172
+ gource_exe = get_gource_executable() # Re-fetch path after installation
173
173
  if gource_exe.exists():
174
174
  print(f"✅ Gource installed successfully at: {gource_exe}")
175
175
  gource_cmd: str = str(gource_exe)
@@ -177,7 +177,8 @@ def visualize(
177
177
  print("❌ Installation failed, falling back to system gource")
178
178
  raise typer.Exit(1)
179
179
  else:
180
- raise FileNotFoundError(f"Gource executable not found at {gource_exe}. Please install gource using your package manager.")
180
+ print(f"❌ Error: Gource executable not found at {gource_exe}. Please install gource using your package manager.")
181
+ raise typer.Exit(1)
181
182
  else:
182
183
  gource_cmd = str(gource_exe)
183
184