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

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

Potentially problematic release.


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

Files changed (402) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  5. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  6. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  7. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  8. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  9. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  10. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  12. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  13. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  14. machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
  15. machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
  16. machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
  17. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  18. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
  19. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
  20. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
  21. machineconfig/jobs/installer/check_installations.py +0 -1
  22. machineconfig/jobs/installer/installer_data.json +1408 -201
  23. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  24. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  25. machineconfig/jobs/installer/package_groups.py +63 -92
  26. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  27. machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
  28. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  29. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  31. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  32. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  34. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  35. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  37. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  38. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  39. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  43. machineconfig/logger.py +0 -1
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +2 -1
  46. machineconfig/profile/create_links_export.py +64 -18
  47. machineconfig/profile/create_shell_profile.py +90 -132
  48. machineconfig/profile/mapper.toml +18 -8
  49. machineconfig/scripts/__init__.py +0 -4
  50. machineconfig/scripts/linux/wrap_mcfg +46 -0
  51. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  52. machineconfig/scripts/python/agents.py +82 -60
  53. machineconfig/scripts/python/ai/initai.py +1 -19
  54. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  55. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  56. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  57. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  58. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  59. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  60. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  61. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  62. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  63. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  64. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  65. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  66. machineconfig/scripts/python/cloud.py +14 -9
  67. machineconfig/scripts/python/croshell.py +135 -117
  68. machineconfig/scripts/python/devops.py +48 -25
  69. machineconfig/scripts/python/devops_navigator.py +1 -5
  70. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  71. machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
  72. machineconfig/scripts/python/fire_jobs.py +127 -118
  73. machineconfig/scripts/python/ftpx.py +44 -17
  74. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  75. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  76. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  77. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  78. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  79. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  80. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  81. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  82. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  83. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
  84. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  85. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  86. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  87. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  88. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  89. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  90. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  91. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  92. machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
  93. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
  94. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
  95. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
  96. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
  97. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  98. machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
  99. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  100. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  101. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  102. machineconfig/scripts/python/helpers_devops/cli_nw.py +221 -0
  103. machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
  104. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  105. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  106. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  107. machineconfig/scripts/python/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
  108. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
  109. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
  110. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
  111. machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
  112. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  113. machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
  114. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
  115. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
  116. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  117. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  118. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  119. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  120. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  121. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
  122. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
  123. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
  124. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
  125. machineconfig/scripts/python/helpers_network/address.py +176 -0
  126. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  127. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  128. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  129. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  130. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  131. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  132. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  133. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  134. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  135. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  136. machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
  137. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
  138. machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
  139. machineconfig/scripts/python/helpers_repos/grource.py +2 -2
  140. machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
  141. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  142. machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  143. machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
  144. machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
  145. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  146. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  147. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  148. machineconfig/scripts/python/interactive.py +26 -35
  149. machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
  150. machineconfig/scripts/python/msearch.py +72 -0
  151. machineconfig/scripts/python/sessions.py +101 -38
  152. machineconfig/scripts/python/terminal.py +136 -0
  153. machineconfig/scripts/python/utils.py +62 -0
  154. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  155. machineconfig/settings/broot/conf.toml +1 -1
  156. machineconfig/settings/helix/config.toml +16 -0
  157. machineconfig/settings/helix/languages.toml +13 -4
  158. machineconfig/settings/helix/yazi-picker.sh +12 -0
  159. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  160. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  161. machineconfig/settings/lf/linux/lfrc +10 -11
  162. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  163. machineconfig/settings/lf/windows/lfrc +15 -17
  164. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  165. machineconfig/settings/linters/.ruff.toml +1 -1
  166. machineconfig/settings/marimo/marimo.toml +80 -0
  167. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  168. machineconfig/settings/shells/bash/init.sh +57 -10
  169. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  170. machineconfig/settings/shells/nushell/config.nu +2 -35
  171. machineconfig/settings/shells/nushell/env.nu +45 -6
  172. machineconfig/settings/shells/nushell/init.nu +314 -0
  173. machineconfig/settings/shells/pwsh/init.ps1 +59 -23
  174. machineconfig/settings/shells/starship/starship.toml +16 -0
  175. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  176. machineconfig/settings/shells/wt/settings.json +32 -17
  177. machineconfig/settings/shells/zsh/init.sh +89 -0
  178. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  179. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  180. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  181. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  182. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  183. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  184. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  185. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  186. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  187. machineconfig/settings/television/cable_unix/env.toml +17 -0
  188. machineconfig/settings/television/cable_unix/files.toml +11 -0
  189. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  190. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  191. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  192. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  193. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  194. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  195. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  196. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  197. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  198. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  199. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  200. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  201. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  202. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  203. machineconfig/settings/television/cable_unix/text.toml +17 -0
  204. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  205. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  206. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  207. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  208. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  209. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  210. machineconfig/settings/television/cable_windows/env.toml +17 -0
  211. machineconfig/settings/television/cable_windows/files.toml +14 -0
  212. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  213. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  214. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  215. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  216. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  217. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  218. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  219. machineconfig/settings/television/cable_windows/text.toml +17 -0
  220. machineconfig/settings/yazi/init.lua +61 -0
  221. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  222. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  223. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  224. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  225. machineconfig/settings/yazi/theme.toml +4 -0
  226. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  227. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  228. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  229. machineconfig/setup_linux/__init__.py +2 -2
  230. machineconfig/setup_linux/apps_desktop.sh +8 -27
  231. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
  232. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  233. machineconfig/setup_mac/__init__.py +16 -0
  234. machineconfig/setup_mac/apps_gui.sh +248 -0
  235. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  236. machineconfig/setup_mac/uv.sh +36 -0
  237. machineconfig/setup_windows/__init__.py +3 -5
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  239. machineconfig/setup_windows/uv.ps1 +8 -1
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -10
  241. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  242. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  243. machineconfig/utils/accessories.py +7 -5
  244. machineconfig/utils/code.py +143 -167
  245. machineconfig/utils/files/art/fat_croco.txt +10 -0
  246. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  247. machineconfig/utils/files/art/happy_croco.txt +22 -0
  248. machineconfig/utils/files/art/water_croco.txt +11 -0
  249. machineconfig/utils/files/ascii_art.py +1 -1
  250. machineconfig/utils/files/headers.py +6 -11
  251. machineconfig/utils/files/read.py +3 -9
  252. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  253. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  254. machineconfig/utils/installer_utils/installer_class.py +44 -101
  255. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  256. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  257. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +39 -87
  258. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
  259. machineconfig/utils/io.py +77 -4
  260. machineconfig/utils/links.py +56 -38
  261. machineconfig/utils/meta.py +235 -145
  262. machineconfig/utils/options.py +46 -18
  263. machineconfig/utils/options_tv.py +119 -0
  264. machineconfig/utils/path_extended.py +46 -97
  265. machineconfig/utils/path_helper.py +76 -23
  266. machineconfig/utils/procs.py +10 -23
  267. machineconfig/utils/scheduler.py +84 -115
  268. machineconfig/utils/scheduling.py +0 -3
  269. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  271. machineconfig/utils/ssh.py +214 -476
  272. machineconfig/utils/ssh_utils/abc.py +5 -0
  273. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  274. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  275. machineconfig/utils/ssh_utils/utils.py +142 -0
  276. machineconfig/utils/ssh_utils/wsl.py +210 -0
  277. machineconfig/utils/terminal.py +3 -113
  278. machineconfig/utils/upgrade_packages.py +114 -28
  279. machineconfig/utils/ve.py +12 -4
  280. machineconfig-8.12.dist-info/METADATA +132 -0
  281. machineconfig-8.12.dist-info/RECORD +504 -0
  282. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
  283. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  284. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  285. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  286. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  287. machineconfig/jobs/python/vscode/api.py +0 -57
  288. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -12
  289. machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
  290. machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
  291. machineconfig/scripts/linux/fzf2g +0 -21
  292. machineconfig/scripts/linux/fzfag +0 -17
  293. machineconfig/scripts/linux/fzffg +0 -25
  294. machineconfig/scripts/linux/fzfrga +0 -21
  295. machineconfig/scripts/linux/other/share_smb +0 -1
  296. machineconfig/scripts/linux/other/switch_ip +0 -20
  297. machineconfig/scripts/linux/skrg +0 -4
  298. machineconfig/scripts/linux/warp-cli.sh +0 -122
  299. machineconfig/scripts/linux/z_ls +0 -104
  300. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  301. machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
  302. machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
  303. machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
  304. machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
  305. machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
  306. machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
  307. machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
  308. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  309. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  310. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  311. machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
  312. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  313. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  314. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  315. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  316. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  317. machineconfig/scripts/python/repos_helpers/action.py +0 -378
  318. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
  319. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  320. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  321. machineconfig/scripts/windows/fzfrga.bat +0 -20
  322. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  323. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  324. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  325. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  326. machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  327. machineconfig/settings/yazi/keymap.toml +0 -0
  328. machineconfig/settings/yazi/yazi.toml +0 -4
  329. machineconfig/setup_linux/apps.sh +0 -66
  330. machineconfig/setup_linux/nix/cli_installation.sh +0 -137
  331. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  332. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  333. machineconfig/setup_windows/apps.ps1 +0 -62
  334. machineconfig/setup_windows/others/obs.ps1 +0 -4
  335. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  336. machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  337. machineconfig/utils/installer_utils/installer.py +0 -225
  338. machineconfig-6.23.dist-info/METADATA +0 -84
  339. machineconfig-6.23.dist-info/RECORD +0 -428
  340. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  341. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
  342. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
  343. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
  344. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  345. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
  346. machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  347. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  348. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  349. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  350. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  351. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  352. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  353. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  354. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  355. machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
  356. machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
  357. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
  358. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  359. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  360. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  361. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  362. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  363. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  364. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  365. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  366. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  367. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  368. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  369. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  370. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  371. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  372. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  373. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  374. machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
  375. machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  376. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  377. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  378. machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  379. machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
  380. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
  381. /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
  382. /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
  383. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
  384. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
  385. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
  386. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
  387. /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
  388. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
  389. /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  390. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  391. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  392. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
  393. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
  394. /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
  395. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  396. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  397. /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
  398. /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
  399. /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
  400. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  401. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
  402. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
@@ -1,148 +0,0 @@
1
- """SSH"""
2
-
3
- from platform import system
4
- from machineconfig.utils.source_of_truth import LIBRARY_ROOT
5
- from machineconfig.utils.path_extended import PathExtended
6
- from rich.console import Console
7
- from rich.panel import Panel
8
- from rich import box # Import box
9
- from typing import Optional, Annotated
10
- import typer
11
-
12
-
13
- console = Console()
14
-
15
-
16
- def get_add_ssh_key_script(path_to_key: PathExtended):
17
- console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
18
- if system() == "Linux" or system() == "Darwin":
19
- authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
20
- console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
21
- elif system() == "Windows":
22
- authorized_keys = PathExtended("C:/ProgramData/ssh/administrators_authorized_keys")
23
- console.print(Panel(f"🪟 Windows SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
24
- else:
25
- console.print(Panel("❌ ERROR: Unsupported operating system\nOnly Linux and Windows are supported", title="[bold red]Error[/bold red]"))
26
- raise NotImplementedError
27
-
28
- if authorized_keys.exists():
29
- split = "\n"
30
- keys_text = authorized_keys.read_text(encoding="utf-8").split(split)
31
- key_count = len([k for k in keys_text if k.strip()])
32
- console.print(Panel(f"🔍 Current SSH authorization status\n✅ Found {key_count} authorized key(s)", title="[bold blue]Status[/bold blue]"))
33
- if path_to_key.read_text(encoding="utf-8") in authorized_keys.read_text(encoding="utf-8"):
34
- console.print(Panel(f"⚠️ Key already authorized\nKey: {path_to_key.name}\nStatus: Already present in authorized_keys file\nNo action required", title="[bold yellow]Warning[/bold yellow]"))
35
- program = ""
36
- else:
37
- console.print(Panel(f"➕ Adding new SSH key to authorized keys\n🔑 Key file: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
38
- if system() == "Linux":
39
- program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
40
- elif system() == "Windows":
41
- program_path = LIBRARY_ROOT.joinpath("setup_windows/add-sshkey.ps1")
42
- program = program_path.expanduser().read_text(encoding="utf-8")
43
- place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
44
- assert place_holder in program, f"This section performs string manipulation on the script {program_path} to add the key to the authorized_keys file. The script has changed and the string {place_holder} is not found."
45
- program = program.replace(place_holder, f'$sshfile = "{path_to_key}"')
46
- console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Replaced placeholder with actual key path", title="[bold blue]Configuration[/bold blue]"))
47
- else:
48
- raise NotImplementedError
49
- else:
50
- console.print(Panel(f"📝 Creating new authorized_keys file\n🔑 Using key: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
51
- if system() == "Linux":
52
- program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
53
- else:
54
- program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
55
- program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
56
- console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
57
-
58
- if system() == "Linux" or system() == "Darwin":
59
- program += """
60
- sudo chmod 700 ~/.ssh
61
- sudo chmod 644 ~/.ssh/authorized_keys
62
- sudo chmod 644 ~/.ssh/*.pub
63
- sudo service ssh --full-restart
64
- # from superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
65
- """
66
- return program
67
-
68
-
69
-
70
- """
71
- # Common pitfalls:
72
- # 🚫 Wrong line endings (LF/CRLF) in config files
73
- # 🌐 Network port conflicts (try 2222 -> 2223) between WSL and Windows
74
- # sudo service ssh restart
75
- # sudo service ssh status
76
- # sudo nano /etc/ssh/sshd_config
77
- """
78
-
79
-
80
- def main(pub_path: Annotated[Optional[str], typer.Argument(..., help="Path to the public key file")] = None,
81
- pub_choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh")] = False,
82
- pub_val: Annotated[bool, typer.Option(..., "--paste", "-p", help="Paste the public key content manually")] = False,
83
- from_github: Annotated[Optional[str], typer.Option(..., "--from-github", "-g", help="Fetch public keys from a GitHub username")] = None
84
- ) -> None:
85
- if pub_path:
86
- key_path = PathExtended(pub_path).expanduser().absolute()
87
- if not key_path.exists():
88
- console.print(Panel(f"❌ ERROR: Provided key path does not exist\nPath: {key_path}", title="[bold red]Error[/bold red]"))
89
- raise FileNotFoundError(f"Provided key path does not exist: {key_path}")
90
- console.print(Panel(f"📄 Using provided public key file: {key_path}", title="[bold blue]Info[/bold blue]"))
91
- program = get_add_ssh_key_script(key_path)
92
- from machineconfig.utils.code import run_shell_script
93
- run_shell_script(script=program)
94
- console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
95
- return
96
- elif pub_choose:
97
- console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
98
- console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
99
- pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
100
- if pub_keys:
101
- console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
102
- else:
103
- console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
104
- return
105
- console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
106
- program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
107
-
108
- elif pub_val:
109
- console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
110
- key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
111
- key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
112
- key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
113
- console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
114
- program = get_add_ssh_key_script(key_path)
115
- elif from_github:
116
- console.print(Panel(f"🌐 Fetching public keys from GitHub user: {from_github}", title="[bold blue]GitHub Fetch[/bold blue]", border_style="blue"))
117
- import requests
118
- # $pubkey_url = 'https://github.com/thisismygitrepo.keys' # $pubkey_string = (Invoke-WebRequest $pubkey_url).Content
119
- response = requests.get(f"https://api.github.com/users/{from_github}/keys")
120
- if response.status_code != 200:
121
- console.print(Panel(f"❌ ERROR: Failed to fetch keys from GitHub user {from_github}\nStatus Code: {response.status_code}", title="[bold red]Error[/bold red]", border_style="red"))
122
- raise RuntimeError(f"Failed to fetch keys from GitHub user {from_github}: Status Code {response.status_code}")
123
- keys = response.json()
124
- if not keys:
125
- console.print(Panel(f"⚠️ No public keys found for GitHub user: {from_github}", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
126
- return
127
- console.print(Panel(f"✅ Found {len(keys)} public key(s) for user: {from_github}", title="[bold green]Success[/bold green]", border_style="green"))
128
- key_path = PathExtended.home().joinpath(f".ssh/{from_github}_github_keys.pub")
129
- key_path.write_text("\n".join([key["key"] for key in keys]), encoding="utf-8")
130
- console.print(Panel(f"💾 Keys saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
131
- program = get_add_ssh_key_script(key_path)
132
- else:
133
- console.print(Panel("❌ ERROR: No method provided to add SSH key\nUse --help for options", title="[bold red]Error[/bold red]", border_style="red"))
134
- raise ValueError("No method provided to add SSH key. Use --help for options.")
135
- console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
136
- from machineconfig.utils.code import run_shell_script
137
- run_shell_script(script=program)
138
- import socket
139
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
140
- s.connect(('8.8.8.8',80))
141
- local_ip_v4 = s.getsockname()[0]
142
- s.close()
143
- print(f"This computer is @ {local_ip_v4}")
144
- console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
145
-
146
-
147
- if __name__ == "__main__":
148
- pass
@@ -1,66 +0,0 @@
1
- """TWSL"""
2
-
3
- from machineconfig.utils.path_extended import PathExtended
4
- from typing import Annotated, Optional
5
- import typer
6
- import platform
7
- import getpass
8
- from pathlib import Path
9
-
10
- system = platform.system() # e.g. "Windows", "Linux", "Darwin" (macOS)
11
- # HostName = platform.node() # e.g. "MY-SURFACE", os.env["COMPUTERNAME") only works for windows.
12
- UserName = getpass.getuser() # e.g: username, os.env["USERNAME") only works for windows.
13
- # UserDomain = os.environ["USERDOMAIN"] # e.g. HAD OR MY-SURFACE
14
- # UserDomainRoaming = PathExtended(os.environ["USERDOMAIN_ROAMINGPROFILE"]) # e.g. SURFACE
15
- # LogonServer = os.environ["LOGONSERVER"] # e.g. "\\MY-SURFACE"
16
- # UserProfile = PathExtended(os.env["USERPROFILE")) # e.g C:\Users\username
17
- # HomePath = PathExtended(os.env["HOMEPATH")) # e.g. C:\Users\username
18
- # Public = PathExtended(os.environ["PUBLIC"]) # C:\Users\Public
19
-
20
- WSL_FROM_WIN = Path(r"\\wsl.localhost\Ubuntu-22.04\home") # PathExtended(rf"\\wsl$\Ubuntu\home") # see localappdata/canonical
21
- WIN_FROM_WSL = Path(r"/mnt/c/Users")
22
-
23
-
24
- def main(
25
- path: Annotated[str, typer.Argument(help="📁 Path of file/folder to transfer over.")],
26
- same_file_system: Annotated[bool, typer.Option("--same_file_system", "-s", help="⚠️ Move file across the same file system (not recommended).")] = False,
27
- destination: Annotated[str, typer.Option("--destination", "-d", help="📍 New path.")] = "",
28
- pwd: Annotated[Optional[str], typer.Option("--pwd", "-P", help="🔑 Password for encryption.")] = None,
29
- sshkey: Annotated[Optional[str], typer.Option("--sshkey", "-i", help="🔐 Path to SSH private key.")] = None,
30
- port: Annotated[Optional[str], typer.Option("--port", "-p", help="🔌 Port number.")] = None,
31
- zip_first: Annotated[bool, typer.Option("--zip_first", "-z", help="📦 Zip before transferring.")] = False,
32
- ) -> None:
33
- print("\n" + "=" * 50)
34
- print("🔄 Welcome to the WSL-Windows File Transfer Tool")
35
- print("=" * 50 + "\n")
36
-
37
- path_obj = PathExtended(path).expanduser().absolute()
38
-
39
- if same_file_system:
40
- print("⚠️ Using a not recommended transfer method! Copying files across the same file system.")
41
- if system == "Windows": # move files over to WSL
42
- print("📤 Transferring files from Windows to WSL...")
43
- path_obj.copy(folder=WSL_FROM_WIN.joinpath(UserName).joinpath(path_obj.rel2home().parent), overwrite=True) # the following works for files and folders alike.
44
- else: # move files from WSL to win
45
- print("📤 Transferring files from WSL to Windows...")
46
- path_obj.copy(folder=WIN_FROM_WSL.joinpath(UserName).joinpath(path_obj.rel2home().parent), overwrite=True)
47
- print("✅ Transfer completed successfully!\n")
48
- else:
49
- from machineconfig.utils.ssh import SSH
50
- import platform
51
-
52
- port_int = int(port) if port else (2222 if system == "Windows" else 22)
53
- username = UserName
54
- hostname = platform.node()
55
- ssh = SSH(host=None, username=username, hostname=hostname, ssh_key_path=sshkey, password=pwd, port=port_int, enable_compression=False)
56
- print("🌐 Initiating SSH transfer...")
57
- ssh.copy_from_here(source_path=path_obj, target_path=Path(destination) if destination else None, compress_with_zip=zip_first, recursive=False, overwrite_existing=False)
58
- print("✅ SSH transfer completed successfully!\n")
59
-
60
-
61
- def arg_parser() -> None:
62
- typer.run(main)
63
-
64
-
65
- if __name__ == "__main__":
66
- arg_parser()
@@ -1,378 +0,0 @@
1
- from machineconfig.utils.path_extended import PathExtended
2
- from machineconfig.utils.accessories import randstr
3
- from machineconfig.scripts.python.repos_helpers.update import update_repository
4
-
5
- from typing import Optional
6
- from dataclasses import dataclass
7
- from enum import Enum
8
-
9
- from rich import print as pprint
10
- from rich.table import Table
11
- from rich.panel import Panel
12
- from rich.columns import Columns
13
-
14
-
15
- class GitAction(Enum):
16
- commit = "commit"
17
- push = "push"
18
- pull = "pull"
19
-
20
-
21
- @dataclass
22
- class GitOperationResult:
23
- """Result of a git operation on a single repository."""
24
- repo_path: PathExtended
25
- action: str
26
- success: bool
27
- message: str
28
- is_git_repo: bool = True
29
- had_changes: bool = False
30
- remote_count: int = 0
31
-
32
-
33
- @dataclass
34
- class GitOperationSummary:
35
- """Summary of all git operations performed."""
36
- # Basic statistics
37
- total_paths_processed: int = 0
38
- git_repos_found: int = 0
39
- non_git_paths: int = 0
40
-
41
- # Per-operation statistics
42
- commits_attempted: int = 0
43
- commits_successful: int = 0
44
- commits_no_changes: int = 0
45
- commits_failed: int = 0
46
-
47
- pulls_attempted: int = 0
48
- pulls_successful: int = 0
49
- pulls_failed: int = 0
50
-
51
- pushes_attempted: int = 0
52
- pushes_successful: int = 0
53
- pushes_failed: int = 0
54
-
55
- def __post_init__(self):
56
- self.failed_operations: list[GitOperationResult] = []
57
- self.repos_without_remotes: list[PathExtended] = []
58
-
59
-
60
- def git_action(path: PathExtended, action: GitAction, mess: Optional[str] = None, r: bool = False, auto_sync: bool = True) -> GitOperationResult:
61
- """Perform git actions using Python instead of shell scripts. Returns detailed operation result."""
62
- from git.exc import InvalidGitRepositoryError
63
- from git.repo import Repo
64
-
65
- try:
66
- repo = Repo(str(path), search_parent_directories=False)
67
- except InvalidGitRepositoryError:
68
- pprint(f"⚠️ Skipping {path} because it is not a git repository.")
69
- if r:
70
- results = [git_action(path=sub_path, action=action, mess=mess, r=r, auto_sync=auto_sync) for sub_path in path.search()]
71
- # For recursive calls, we need to aggregate results somehow
72
- # For now, return success if all recursive operations succeeded
73
- all_successful = all(result.success for result in results)
74
- return GitOperationResult(
75
- repo_path=path,
76
- action=action.value,
77
- success=all_successful,
78
- message=f"Recursive operation: {len([r for r in results if r.success])}/{len(results)} succeeded",
79
- is_git_repo=False
80
- )
81
- else:
82
- return GitOperationResult(
83
- repo_path=path,
84
- action=action.value,
85
- success=False,
86
- message="Not a git repository",
87
- is_git_repo=False
88
- )
89
-
90
- print(f">>>>>>>>> 🔧{action} - {path}")
91
- remote_count = len(repo.remotes)
92
-
93
- try:
94
- if action == GitAction.commit:
95
- if mess is None:
96
- mess = "auto_commit_" + randstr()
97
-
98
- # Check if there are changes to commit
99
- if repo.is_dirty() or repo.untracked_files:
100
- repo.git.add(A=True) # Stage all changes
101
- repo.index.commit(mess)
102
- print(f"✅ Committed changes with message: {mess}")
103
- return GitOperationResult(
104
- repo_path=path,
105
- action=action.value,
106
- success=True,
107
- message=f"Committed changes with message: {mess}",
108
- had_changes=True,
109
- remote_count=remote_count
110
- )
111
- else:
112
- print("ℹ️ No changes to commit")
113
- return GitOperationResult(
114
- repo_path=path,
115
- action=action.value,
116
- success=True,
117
- message="No changes to commit",
118
- had_changes=False,
119
- remote_count=remote_count
120
- )
121
-
122
- elif action == GitAction.push:
123
- if not repo.remotes:
124
- print("⚠️ No remotes configured for push")
125
- return GitOperationResult(
126
- repo_path=path,
127
- action=action.value,
128
- success=False,
129
- message="No remotes configured",
130
- remote_count=0
131
- )
132
-
133
- success = True
134
- failed_remotes = []
135
- for remote in repo.remotes:
136
- try:
137
- print(f"🚀 Pushing to {remote.url}")
138
- remote.push(repo.active_branch.name)
139
- print(f"✅ Pushed to {remote.name}")
140
- except Exception as e:
141
- print(f"❌ Failed to push to {remote.name}: {e}")
142
- failed_remotes.append(f"{remote.name}: {str(e)}")
143
- success = False
144
-
145
- message = "Push successful" if success else f"Push failed for: {', '.join(failed_remotes)}"
146
- return GitOperationResult(
147
- repo_path=path,
148
- action=action.value,
149
- success=success,
150
- message=message,
151
- remote_count=remote_count
152
- )
153
-
154
- elif action == GitAction.pull:
155
- # Use the enhanced update function with uv sync support
156
- try:
157
- update_repository(repo, auto_uv_sync=auto_sync, allow_password_prompt=False)
158
- print("✅ Pull completed")
159
- return GitOperationResult(
160
- repo_path=path,
161
- action=action.value,
162
- success=True,
163
- message="Pull completed successfully",
164
- remote_count=remote_count
165
- )
166
- except Exception as e:
167
- print(f"❌ Pull failed: {e}")
168
- return GitOperationResult(
169
- repo_path=path,
170
- action=action.value,
171
- success=False,
172
- message=f"Pull failed: {str(e)}",
173
- remote_count=remote_count
174
- )
175
-
176
- except Exception as e:
177
- print(f"❌ Error performing {action} on {path}: {e}")
178
- return GitOperationResult(
179
- repo_path=path,
180
- action=action.value,
181
- success=False,
182
- message=f"Error: {str(e)}",
183
- remote_count=remote_count
184
- )
185
-
186
- # This should never be reached, but just in case
187
- return GitOperationResult(
188
- repo_path=path,
189
- action=action.value,
190
- success=False,
191
- message="Unknown error",
192
- remote_count=remote_count
193
- )
194
-
195
-
196
- def print_git_operations_summary(summary: GitOperationSummary, operations_performed: list[str]) -> None:
197
- """Print a detailed summary of git operations with rich formatting and tables."""
198
- from rich.console import Console
199
- console = Console()
200
-
201
- # Main summary panel
202
- summary_stats = [
203
- f"Total paths processed: {summary.total_paths_processed}",
204
- f"Git repositories found: {summary.git_repos_found}",
205
- f"Non-git paths skipped: {summary.non_git_paths}"
206
- ]
207
-
208
- console.print(Panel.fit(
209
- "\n".join(summary_stats),
210
- title="[bold blue]📊 Git Operations Summary[/bold blue]",
211
- border_style="blue"
212
- ))
213
-
214
- # Statistics panels in columns
215
- stat_panels = []
216
-
217
- if "commit" in operations_performed:
218
- commit_stats = [
219
- f"Attempted: {summary.commits_attempted}",
220
- f"Successful: {summary.commits_successful}",
221
- f"No changes: {summary.commits_no_changes}",
222
- f"Failed: {summary.commits_failed}"
223
- ]
224
- stat_panels.append(Panel.fit(
225
- "\n".join(commit_stats),
226
- title="[bold green]💾 Commit Operations[/bold green]",
227
- border_style="green"
228
- ))
229
-
230
- if "pull" in operations_performed:
231
- pull_stats = [
232
- f"Attempted: {summary.pulls_attempted}",
233
- f"Successful: {summary.pulls_successful}",
234
- f"Failed: {summary.pulls_failed}"
235
- ]
236
- stat_panels.append(Panel.fit(
237
- "\n".join(pull_stats),
238
- title="[bold cyan]⬇️ Pull Operations[/bold cyan]",
239
- border_style="cyan"
240
- ))
241
-
242
- if "push" in operations_performed:
243
- push_stats = [
244
- f"Attempted: {summary.pushes_attempted}",
245
- f"Successful: {summary.pushes_successful}",
246
- f"Failed: {summary.pushes_failed}"
247
- ]
248
- stat_panels.append(Panel.fit(
249
- "\n".join(push_stats),
250
- title="[bold magenta]🚀 Push Operations[/bold magenta]",
251
- border_style="magenta"
252
- ))
253
-
254
- if stat_panels:
255
- console.print(Columns(stat_panels, equal=True, expand=True))
256
-
257
- # Repositories without remotes warning
258
- if summary.repos_without_remotes:
259
- repos_table = Table(title="[bold yellow]⚠️ Repositories Without Remotes[/bold yellow]")
260
- repos_table.add_column("Repository Name", style="cyan", no_wrap=True)
261
- repos_table.add_column("Full Path", style="dim")
262
-
263
- for repo_path in summary.repos_without_remotes:
264
- repos_table.add_row(repo_path.name, str(repo_path))
265
-
266
- console.print(repos_table)
267
- console.print("[yellow]These repositories cannot be pushed to remote servers.[/yellow]")
268
- elif "push" in operations_performed:
269
- console.print("[green]✅ All repositories have remote configurations.[/green]")
270
-
271
- # Failed operations table
272
- if summary.failed_operations:
273
- failed_table = Table(title=f"[bold red]❌ Failed Operations ({len(summary.failed_operations)} total)[/bold red]")
274
- failed_table.add_column("Action", style="bold red", no_wrap=True)
275
- failed_table.add_column("Repository", style="cyan", no_wrap=True)
276
- failed_table.add_column("Problem", style="red")
277
-
278
- # Group failed operations by type for better organization
279
- failed_by_action = {}
280
- for failed_op in summary.failed_operations:
281
- if failed_op.action not in failed_by_action:
282
- failed_by_action[failed_op.action] = []
283
- failed_by_action[failed_op.action].append(failed_op)
284
-
285
- for action, failures in failed_by_action.items():
286
- for failure in failures:
287
- repo_name = failure.repo_path.name if failure.is_git_repo else f"{failure.repo_path.name} (not git repo)"
288
- problem = failure.message if failure.is_git_repo else "Not a git repository"
289
- failed_table.add_row(action.upper(), repo_name, problem)
290
-
291
- console.print(failed_table)
292
- else:
293
- console.print("[green]✅ All git operations completed successfully![/green]")
294
-
295
- # Overall success assessment
296
- total_failed = len(summary.failed_operations)
297
- total_operations = (summary.commits_attempted + summary.pulls_attempted +
298
- summary.pushes_attempted)
299
-
300
- if total_failed == 0 and total_operations > 0:
301
- console.print(f"\n[bold green]🎉 SUCCESS: All {total_operations} operations completed successfully![/bold green]")
302
- elif total_operations == 0:
303
- console.print("\n[blue]📝 No git operations were performed.[/blue]")
304
- else:
305
- success_rate = ((total_operations - total_failed) / total_operations * 100) if total_operations > 0 else 0
306
- if total_failed > 0:
307
- console.print(f"\n[bold yellow]⚖️ SUMMARY: {total_operations - total_failed}/{total_operations} operations succeeded ({success_rate:.1f}% success rate)[/bold yellow]")
308
- console.print("[yellow]Review the failed operations table above for details on what needs attention.[/yellow]")
309
- else:
310
- console.print(f"\n[bold green]⚖️ SUMMARY: {total_operations}/{total_operations} operations succeeded (100% success rate)[/bold green]")
311
-
312
-
313
- def perform_git_operations(repos_root: PathExtended, pull: bool, commit: bool, push: bool, recursive: bool, auto_uv_sync: bool) -> None:
314
- """Perform git operations on all repositories and provide detailed summary."""
315
- print(f"\n🔄 Performing Git actions on repositories @ `{repos_root}`...")
316
- summary = GitOperationSummary()
317
- operations_performed = []
318
- # Determine which operations to perform
319
- if pull:
320
- operations_performed.append("pull")
321
- if commit:
322
- operations_performed.append("commit")
323
- if push:
324
- operations_performed.append("push")
325
-
326
- for a_path in repos_root.search("*"):
327
- print(f"{('Handling ' + str(a_path)).center(80, '-')}")
328
- summary.total_paths_processed += 1
329
-
330
- # Check if this is a git repository first
331
- from git.exc import InvalidGitRepositoryError
332
- from git.repo import Repo
333
-
334
- try:
335
- repo = Repo(str(a_path), search_parent_directories=False)
336
- summary.git_repos_found += 1
337
-
338
- # Track repos without remotes
339
- if len(repo.remotes) == 0:
340
- summary.repos_without_remotes.append(a_path)
341
-
342
- # Now perform the actual operations
343
- if pull:
344
- result = git_action(path=a_path, action=GitAction.pull, r=recursive, auto_sync=auto_uv_sync)
345
- summary.pulls_attempted += 1
346
- if result.success:
347
- summary.pulls_successful += 1
348
- else:
349
- summary.pulls_failed += 1
350
- summary.failed_operations.append(result)
351
-
352
- if commit:
353
- result = git_action(a_path, action=GitAction.commit, r=recursive, auto_sync=auto_uv_sync)
354
- summary.commits_attempted += 1
355
- if result.success:
356
- if result.had_changes:
357
- summary.commits_successful += 1
358
- else:
359
- summary.commits_no_changes += 1
360
- else:
361
- summary.commits_failed += 1
362
- summary.failed_operations.append(result)
363
-
364
- if push:
365
- result = git_action(a_path, action=GitAction.push, r=recursive, auto_sync=auto_uv_sync)
366
- summary.pushes_attempted += 1
367
- if result.success:
368
- summary.pushes_successful += 1
369
- else:
370
- summary.pushes_failed += 1
371
- summary.failed_operations.append(result)
372
-
373
- except InvalidGitRepositoryError:
374
- summary.non_git_paths += 1
375
- pprint(f"⚠️ Skipping {a_path} because it is not a git repository.")
376
-
377
- # Print the detailed summary
378
- print_git_operations_summary(summary, operations_performed)
@@ -1,17 +0,0 @@
1
-
2
- import typer
3
- from typing import Annotated
4
-
5
-
6
- def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
7
- from machineconfig.scripts.python.repos_helpers import count_lines
8
- from pathlib import Path
9
- count_lines_path = Path(count_lines.__file__)
10
- # --project $HOME/code/ machineconfig --group plot
11
- cmd = f"""uv run --python 3.14 --with "machineconfig[plot]>=5.87" {count_lines_path} analyze-over-time {repo_path}"""
12
- from machineconfig.utils.code import run_shell_script
13
- run_shell_script(cmd)
14
-
15
-
16
- if __name__ == "__main__":
17
- pass
@@ -1,3 +0,0 @@
1
-
2
- # TODO change bat to pistol
3
- fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}'
@@ -1,2 +0,0 @@
1
-
2
- Invoke-PsFzfRipgrep $args
@@ -1,20 +0,0 @@
1
-
2
- REM adopted from https://github.com/phiresky/ripgrep-all/wiki/fzf-Integration
3
-
4
- @echo off
5
- setlocal
6
-
7
- set RG_PREFIX=rga --files-with-matches
8
- set FZF_DEFAULT_COMMAND=%RG_PREFIX% %1
9
- for /f "delims=" %%i in ('fzf --sort --preview "rga --pretty --context 5 {q} {}" --phony -q %1 --bind "change:reload:%RG_PREFIX% {q}" --preview-window="70%:wrap"') do (
10
- set FILE=%%i
11
- )
12
-
13
- if not "%FILE%" == "" (
14
- echo Opening %FILE%
15
- start "" "%FILE%"
16
- ) else (
17
- echo No file selected.
18
- )
19
-
20
- endlocal
@@ -1,13 +0,0 @@
1
-
2
-
3
- winget install WinFsp.WinFsp; winget install SSHFS-Win.SSHFS-Win
4
-
5
- $host = ''
6
- $user = ''
7
- $sharePath = ''
8
- $driveLetter = ''
9
-
10
- uv run --python 3.14 --with "machineconfig>=5.87" python -m machineconfig.scripts.python.mount_ssh
11
-
12
- net use T: \\sshfs.kr\$user@$host.local
13
- # this worked: net use T: \\sshfs\alex@alex-p51s-5.local
@@ -1,16 +0,0 @@
1
- #!/bin/sh
2
- # 🔍 Fuzzy Finder with Nano Editor Integration
3
-
4
- # 📝 Open selected file in nano
5
- nano (~/scripts/fzf2g) # space used for precedence in execution
6
-
7
- # 💡 Alternative commands (commented):
8
- # 🔎 FZF with bat preview:
9
- # fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}'
10
-
11
- # 🪟 Windows Git Bash version:
12
- # & "C:\Program Files\Git\usr\bin\nano.exe" (fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}')
13
-
14
- # 📜 PowerShell script integration:
15
- # fzf | ~/scripts/nano.ps1
16
-