machineconfig 3.99__py3-none-any.whl → 7.66__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 (418) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +1 -2
  5. machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
  6. machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +128 -330
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -16
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/gh.py +69 -53
  34. machineconfig/jobs/installer/custom/hx.py +77 -20
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
  36. machineconfig/jobs/installer/custom_dev/brave.py +43 -35
  37. machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
  38. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  39. machineconfig/jobs/installer/custom_dev/code.py +33 -21
  40. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  41. machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
  42. machineconfig/jobs/installer/custom_dev/goes.py +41 -36
  43. machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
  44. machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
  45. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
  46. machineconfig/jobs/installer/custom_dev/redis.py +51 -33
  47. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  48. machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
  49. machineconfig/jobs/installer/custom_dev/winget.py +1 -0
  50. machineconfig/jobs/installer/installer_data.json +3406 -0
  51. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  52. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  53. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  54. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  55. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  56. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  57. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  58. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  59. machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
  60. machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
  61. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  62. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  63. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  64. machineconfig/jobs/installer/package_groups.py +255 -0
  65. machineconfig/logger.py +0 -1
  66. machineconfig/profile/backup.toml +49 -0
  67. machineconfig/profile/bash_shell_profiles.md +11 -0
  68. machineconfig/profile/create_helper.py +74 -0
  69. machineconfig/profile/create_links.py +288 -0
  70. machineconfig/profile/create_links_export.py +100 -0
  71. machineconfig/profile/create_shell_profile.py +136 -0
  72. machineconfig/profile/mapper.toml +258 -0
  73. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  74. machineconfig/scripts/__init__.py +0 -4
  75. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  76. machineconfig/scripts/linux/wrap_mcfg +47 -0
  77. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  78. machineconfig/scripts/python/agents.py +198 -0
  79. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  80. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  81. machineconfig/scripts/python/ai/generate_files.py +307 -42
  82. machineconfig/scripts/python/ai/initai.py +3 -28
  83. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  84. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  85. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  86. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  87. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  88. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  89. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  90. machineconfig/scripts/python/cloud.py +29 -0
  91. machineconfig/scripts/python/croshell.py +117 -181
  92. machineconfig/scripts/python/define.py +31 -0
  93. machineconfig/scripts/python/devops.py +44 -124
  94. machineconfig/scripts/python/devops_navigator.py +10 -0
  95. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  96. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  97. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  98. machineconfig/scripts/python/explore.py +49 -0
  99. machineconfig/scripts/python/fire_jobs.py +106 -244
  100. machineconfig/scripts/python/ftpx.py +125 -68
  101. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  102. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  103. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  104. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  106. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
  107. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  108. machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
  109. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  110. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  111. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  112. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  113. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
  114. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  115. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
  116. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  117. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
  118. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  119. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  120. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  121. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  122. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  123. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  124. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  125. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  126. machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
  127. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  128. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  129. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  130. machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
  131. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  132. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  133. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  134. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  135. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
  136. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
  137. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
  138. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  139. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  140. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  141. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  142. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  143. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  144. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  145. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  146. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  147. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  148. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  149. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  150. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  151. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  152. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
  153. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  154. machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
  155. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  156. machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
  157. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  158. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
  159. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  160. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  161. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  162. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  163. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  164. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  165. machineconfig/scripts/python/interactive.py +79 -160
  166. machineconfig/scripts/python/machineconfig.py +63 -0
  167. machineconfig/scripts/python/msearch.py +21 -0
  168. machineconfig/scripts/python/nw/__init__.py +0 -0
  169. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
  170. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
  171. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  172. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
  173. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  174. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
  175. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  176. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  177. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  178. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  179. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
  180. machineconfig/scripts/python/sessions.py +167 -0
  181. machineconfig/scripts/python/terminal.py +127 -0
  182. machineconfig/scripts/python/utils.py +66 -0
  183. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  184. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  185. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  186. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  187. machineconfig/settings/broot/br.sh +0 -4
  188. machineconfig/settings/broot/conf.toml +1 -1
  189. machineconfig/settings/helix/config.toml +16 -0
  190. machineconfig/settings/helix/languages.toml +13 -4
  191. machineconfig/settings/helix/yazi-picker.sh +12 -0
  192. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  193. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  194. machineconfig/settings/lf/linux/lfrc +10 -12
  195. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  196. machineconfig/settings/lf/windows/lfrc +18 -38
  197. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  198. machineconfig/settings/linters/.ruff.toml +1 -1
  199. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  200. machineconfig/settings/marimo/marimo.toml +80 -0
  201. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  202. machineconfig/settings/pistol/pistol.conf +1 -1
  203. machineconfig/settings/shells/bash/init.sh +55 -31
  204. machineconfig/settings/shells/nushell/config.nu +1 -34
  205. machineconfig/settings/shells/nushell/init.nu +127 -0
  206. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  207. machineconfig/settings/shells/starship/starship.toml +16 -0
  208. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  209. machineconfig/settings/shells/wt/settings.json +32 -17
  210. machineconfig/settings/shells/zsh/init.sh +89 -0
  211. machineconfig/settings/svim/linux/init.toml +0 -4
  212. machineconfig/settings/svim/windows/init.toml +0 -3
  213. machineconfig/settings/yazi/init.lua +57 -0
  214. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  215. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  216. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  217. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  218. machineconfig/settings/yazi/yazi.toml +13 -0
  219. machineconfig/setup_linux/__init__.py +10 -0
  220. machineconfig/setup_linux/apps_desktop.sh +89 -0
  221. machineconfig/setup_linux/apps_gui.sh +64 -0
  222. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  223. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  224. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  225. machineconfig/setup_linux/uv.sh +15 -0
  226. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  227. machineconfig/setup_mac/__init__.py +16 -0
  228. machineconfig/setup_mac/apps_gui.sh +248 -0
  229. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  230. machineconfig/setup_mac/uv.sh +36 -0
  231. machineconfig/setup_windows/__init__.py +8 -0
  232. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  233. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  234. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  235. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  236. machineconfig/setup_windows/uv.ps1 +10 -0
  237. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
  238. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  239. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
  240. machineconfig/utils/accessories.py +7 -5
  241. machineconfig/utils/cloud/onedrive/README.md +139 -0
  242. machineconfig/utils/code.py +140 -93
  243. machineconfig/utils/files/art/fat_croco.txt +10 -0
  244. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  245. machineconfig/utils/files/art/happy_croco.txt +22 -0
  246. machineconfig/utils/files/art/water_croco.txt +11 -0
  247. machineconfig/utils/files/ascii_art.py +118 -0
  248. machineconfig/utils/files/dbms.py +257 -0
  249. machineconfig/utils/files/headers.py +68 -0
  250. machineconfig/utils/files/ouch/__init__.py +0 -0
  251. machineconfig/utils/files/ouch/decompress.py +45 -0
  252. machineconfig/utils/files/read.py +95 -0
  253. machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
  254. machineconfig/utils/installer_utils/installer_class.py +68 -126
  255. machineconfig/utils/installer_utils/installer_cli.py +181 -0
  256. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
  257. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
  258. machineconfig/utils/io.py +77 -23
  259. machineconfig/utils/links.py +309 -100
  260. machineconfig/utils/meta.py +255 -0
  261. machineconfig/utils/notifications.py +1 -1
  262. machineconfig/utils/options.py +10 -25
  263. machineconfig/utils/path_extended.py +94 -104
  264. machineconfig/utils/path_helper.py +75 -22
  265. machineconfig/utils/procs.py +50 -74
  266. machineconfig/utils/scheduler.py +94 -97
  267. machineconfig/utils/scheduling.py +0 -3
  268. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
  269. machineconfig/utils/schemas/installer/installer_types.py +0 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +2 -1
  271. machineconfig/utils/source_of_truth.py +3 -6
  272. machineconfig/utils/ssh.py +742 -254
  273. machineconfig/utils/ssh_utils/utils.py +0 -0
  274. machineconfig/utils/terminal.py +3 -140
  275. machineconfig/utils/tst.py +20 -0
  276. machineconfig/utils/upgrade_packages.py +109 -28
  277. machineconfig/utils/ve.py +13 -5
  278. machineconfig-7.66.dist-info/METADATA +124 -0
  279. machineconfig-7.66.dist-info/RECORD +451 -0
  280. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  281. machineconfig/cluster/templates/utils.py +0 -51
  282. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  283. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  284. machineconfig/jobs/installer/packages_custom_dev.json +0 -226
  285. machineconfig/jobs/installer/packages_custom_essential.json +0 -39
  286. machineconfig/jobs/installer/packages_github_dev.json +0 -1110
  287. machineconfig/jobs/installer/packages_github_essential.json +0 -804
  288. machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
  289. machineconfig/jobs/python/create_bootable_media.py +0 -16
  290. machineconfig/jobs/python/python_cargo_build_share.py +0 -59
  291. machineconfig/jobs/python/python_ve_symlink.py +0 -29
  292. machineconfig/jobs/python/tasks.py +0 -3
  293. machineconfig/jobs/python/vscode/api.py +0 -49
  294. machineconfig/jobs/python/vscode/sync_code.py +0 -58
  295. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  296. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  297. machineconfig/jobs/windows/startup_file.cmd +0 -2
  298. machineconfig/profile/create.py +0 -170
  299. machineconfig/profile/shell.py +0 -176
  300. machineconfig/scripts/cloud/init.sh +0 -119
  301. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  302. machineconfig/scripts/linux/cloud_copy +0 -2
  303. machineconfig/scripts/linux/cloud_mount +0 -2
  304. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  305. machineconfig/scripts/linux/cloud_sync +0 -2
  306. machineconfig/scripts/linux/croshell +0 -3
  307. machineconfig/scripts/linux/devops +0 -2
  308. machineconfig/scripts/linux/fire +0 -2
  309. machineconfig/scripts/linux/fire_agents +0 -2
  310. machineconfig/scripts/linux/ftpx +0 -2
  311. machineconfig/scripts/linux/fzf2g +0 -21
  312. machineconfig/scripts/linux/fzffg +0 -25
  313. machineconfig/scripts/linux/gh_models +0 -2
  314. machineconfig/scripts/linux/initai +0 -2
  315. machineconfig/scripts/linux/kill_process +0 -2
  316. machineconfig/scripts/linux/programs +0 -21
  317. machineconfig/scripts/linux/repos +0 -2
  318. machineconfig/scripts/linux/scheduler +0 -2
  319. machineconfig/scripts/linux/share_smb +0 -1
  320. machineconfig/scripts/linux/start_slidev +0 -2
  321. machineconfig/scripts/linux/start_terminals +0 -3
  322. machineconfig/scripts/linux/warp-cli.sh +0 -122
  323. machineconfig/scripts/linux/wifi_conn +0 -2
  324. machineconfig/scripts/linux/z_ls +0 -104
  325. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  326. machineconfig/scripts/python/cloud_repo_sync.py +0 -186
  327. machineconfig/scripts/python/devops_devapps_install.py +0 -159
  328. machineconfig/scripts/python/devops_update_repos.py +0 -180
  329. machineconfig/scripts/python/dotfile.py +0 -52
  330. machineconfig/scripts/python/fire_agents.py +0 -175
  331. machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
  332. machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
  333. machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
  334. machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
  335. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  336. machineconfig/scripts/python/gh_models.py +0 -104
  337. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
  338. machineconfig/scripts/python/repos.py +0 -80
  339. machineconfig/scripts/python/repos_helper_action.py +0 -335
  340. machineconfig/scripts/python/share_terminal.py +0 -104
  341. machineconfig/scripts/python/snapshot.py +0 -25
  342. machineconfig/scripts/python/start_terminals.py +0 -121
  343. machineconfig/scripts/python/t4.py +0 -17
  344. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  345. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  346. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  347. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  348. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  349. machineconfig/scripts/windows/croshell.ps1 +0 -1
  350. machineconfig/scripts/windows/devops.ps1 +0 -1
  351. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  352. machineconfig/scripts/windows/fire.ps1 +0 -1
  353. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  354. machineconfig/scripts/windows/gpt.ps1 +0 -1
  355. machineconfig/scripts/windows/grep.ps1 +0 -2
  356. machineconfig/scripts/windows/initai.ps1 +0 -1
  357. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  358. machineconfig/scripts/windows/nano.ps1 +0 -3
  359. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  360. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  361. machineconfig/scripts/windows/repos.ps1 +0 -1
  362. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  363. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  364. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  365. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  366. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  367. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  368. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  369. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  370. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  371. machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
  372. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  373. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  374. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  375. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  376. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  377. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  378. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  379. machineconfig-3.99.dist-info/METADATA +0 -167
  380. machineconfig-3.99.dist-info/RECORD +0 -409
  381. machineconfig-3.99.dist-info/entry_points.txt +0 -18
  382. machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
  383. machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
  384. machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
  385. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  386. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  387. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  388. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  389. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  390. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  391. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  392. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  393. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  394. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  395. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  396. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  397. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  398. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  399. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  400. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  401. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  402. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  403. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  404. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  405. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  406. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  407. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  408. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  409. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  410. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  411. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  412. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  413. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  414. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  415. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  416. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  417. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  418. {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -1,114 +0,0 @@
1
- from machineconfig.utils.path_extended import PathExtended as PathExtended
2
- from machineconfig.utils.terminal import Terminal
3
- from machineconfig.scripts.python.get_zellij_cmd import get_zellij_cmd
4
- from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
5
- from machineconfig.utils.io import read_ini
6
- from machineconfig.utils.code import write_shell_script_to_file
7
- import platform
8
- from rich.console import Console
9
- from rich.panel import Panel
10
-
11
- console = Console()
12
-
13
-
14
- def delete_remote_repo_copy_and_push_local(remote_repo: str, local_repo: str, cloud: str):
15
- console.print(Panel("🗑️ Deleting remote repo copy and pushing local copy", title="[bold blue]Repo Sync[/bold blue]", border_style="blue"))
16
- repo_sync_root = PathExtended(remote_repo).expanduser().absolute()
17
- repo_root_path = PathExtended(local_repo).expanduser().absolute()
18
- repo_sync_root.delete(sure=True)
19
- print("🧹 Removed temporary remote copy")
20
- from git.remote import Remote
21
- from git.repo import Repo
22
-
23
- try:
24
- Remote.remove(Repo(repo_root_path), "originEnc")
25
- console.print(Panel("🔗 Removed originEnc remote reference", border_style="blue"))
26
- except Exception:
27
- pass # type: ignore
28
- console.print(Panel("📈 Deleting remote repository copy and pushing local changes", width=150, border_style="blue"))
29
-
30
- repo_root_path.to_cloud(cloud=cloud, zip=True, encrypt=True, rel2home=True, os_specific=False)
31
-
32
- console.print(Panel("✅ Repository successfully pushed to cloud", title="[bold green]Repo Sync[/bold green]", border_style="green"))
33
-
34
-
35
- # import sys
36
- # import subprocess
37
-
38
-
39
- def get_wt_cmd(wd1: PathExtended, wd2: PathExtended) -> str:
40
- lines = [
41
- f"""wt --window 0 new-tab --profile pwsh --title "gitdiff" --tabColor `#3b04d1 --startingDirectory {wd1} ` --colorScheme "Solarized Dark" """,
42
- f"""split-pane --horizontal --profile pwsh --startingDirectory {wd2} --size 0.5 --colorScheme "Tango Dark" -- pwsh -Interactive """,
43
- ]
44
- return " `; ".join(lines)
45
-
46
-
47
- def inspect_repos(repo_local_root: str, repo_remote_root: str):
48
- console.print(Panel(f"📂 Local: {repo_local_root}\n📂 Remote: {repo_remote_root}", title="[bold blue]🔍 Inspecting Repositories[/bold blue]", border_style="blue"))
49
-
50
- if platform.system() == "Windows":
51
- program = get_wt_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_local_root))
52
- write_shell_script_to_file(shell_script=program)
53
- return None
54
- elif platform.system() in ["Linux", "Darwin"]:
55
- program = get_zellij_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_remote_root))
56
- write_shell_script_to_file(shell_script=program)
57
- return None
58
- else:
59
- raise NotImplementedError(f"Platform {platform.system()} not implemented.")
60
-
61
-
62
- def fetch_dotfiles():
63
- console.print(Panel("📁 Fetching Dotfiles", title="[bold blue]Dotfiles[/bold blue]", border_style="blue"))
64
-
65
- cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
66
- console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", width=150, border_style="yellow"))
67
-
68
- dotfiles_local = PathExtended.home().joinpath("dotfiles")
69
- CONFIG_PATH.joinpath("remote").mkdir(parents=True, exist_ok=True)
70
- dotfiles_remote = PathExtended(CONFIG_PATH).joinpath("remote", dotfiles_local.rel2home())
71
- remote_path = dotfiles_local.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
72
-
73
- console.print(Panel("📥 Downloading dotfiles from cloud...", width=150, border_style="blue"))
74
-
75
- dotfiles_remote.from_cloud(remotepath=remote_path, cloud=cloud_resolved, unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=None)
76
-
77
- console.print(Panel("🗑️ Removing old dotfiles and replacing with cloud version...", width=150, border_style="blue"))
78
-
79
- dotfiles_local.delete(sure=True)
80
- dotfiles_remote.move(folder=PathExtended.home())
81
- script = f"""
82
- # rm -rf {dotfiles_local}
83
- # mv {dotfiles_remote} {dotfiles_local}
84
- """
85
- if platform.system() == "Linux":
86
- script += """
87
- sudo chmod 600 $HOME/.ssh/*
88
- sudo chmod 700 $HOME/.ssh
89
- sudo chmod +x $HOME/dotfiles/scripts/linux -R
90
- """
91
- shell_path = write_shell_script_to_file(shell_script=script)
92
- Terminal().run(f". {shell_path}", shell="bash").capture().print()
93
-
94
- console.print(Panel("✅ Dotfiles successfully fetched and installed", title="[bold green]Dotfiles[/bold green]", border_style="green"))
95
-
96
-
97
- def check_dotfiles_version_is_beyond(commit_dtm: str, update: bool) -> bool:
98
- dotfiles_path = str(PathExtended.home().joinpath("dotfiles"))
99
- from git import Repo
100
-
101
- repo = Repo(path=dotfiles_path)
102
- last_commit = repo.head.commit
103
- dtm = last_commit.committed_datetime
104
- from datetime import datetime # make it tz unaware
105
-
106
- dtm = datetime(dtm.year, dtm.month, dtm.day, dtm.hour, dtm.minute, dtm.second)
107
- res = dtm > datetime.fromisoformat(commit_dtm)
108
- if res is False and update is True:
109
- console = Console()
110
- console.print(Panel(f"🔄 UPDATE REQUIRED | Updating dotfiles because {dtm} < {datetime.fromisoformat(commit_dtm)}", border_style="bold blue", expand=False))
111
- from machineconfig.scripts.python.cloud_repo_sync import main
112
-
113
- main(cloud=None, path=dotfiles_path)
114
- return res
@@ -1,80 +0,0 @@
1
- """Repos
2
-
3
- # TODO use gh api user --jq '.login' to get the username and use it to clone the repos.
4
- in the event that username@github.com is not mentioned in the remote url.
5
-
6
- """
7
-
8
- from machineconfig.utils.io import read_ini
9
- from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
10
- from machineconfig.utils.path_extended import PathExtended as PathExtended
11
- from machineconfig.scripts.python.repos_helper_record import main as record_repos
12
- from machineconfig.scripts.python.repos_helper_clone import clone_repos
13
- from machineconfig.scripts.python.repos_helper_action import perform_git_operations
14
-
15
- import typer
16
- from typing import Annotated, Optional
17
-
18
-
19
- def main(
20
- directory: Annotated[str, typer.Argument(help="📁 Folder containing repos to record or a specs JSON file to follow.")] = "",
21
- push: Annotated[bool, typer.Option("--push", help="🚀 Push changes.")] = False,
22
- pull: Annotated[bool, typer.Option("--pull", help="⬇️ Pull changes.")] = False,
23
- commit: Annotated[bool, typer.Option("--commit", help="💾 Commit changes.")] = False,
24
- all: Annotated[bool, typer.Option("--all", help="🔄 Pull, commit, and push changes.")] = False,
25
- record: Annotated[bool, typer.Option("--record", help="📝 Record repositories.")] = False,
26
- clone: Annotated[bool, typer.Option("--clone", help="📥 Clone repositories from record.")] = False,
27
- checkout: Annotated[bool, typer.Option("--checkout", help="🔀 Check out to versions provided in a JSON file.")] = False,
28
- checkout_to_branch: Annotated[bool, typer.Option("--checkout-to-branch", help="🔀 Check out to the main branch.")] = False,
29
- recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recursive flag.")] = False,
30
- no_sync: Annotated[bool, typer.Option("--no-sync", help="🚫 Disable automatic uv sync after pulls.")] = False,
31
- cloud: Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Cloud storage option.")] = None,
32
- ) -> None:
33
- print("\n" + "=" * 50)
34
- print("📂 Welcome to the Repository Manager")
35
- print("=" * 50 + "\n")
36
-
37
- if directory == "":
38
- repos_root = PathExtended.home().joinpath("code") # it is a positional argument, can never be empty.
39
- else:
40
- repos_root = PathExtended(directory).expanduser().absolute()
41
- auto_sync = not no_sync # Enable auto sync by default, disable with --no-sync
42
- if record:
43
- save_path = record_repos(repos_root=repos_root)
44
- if cloud is not None:
45
- PathExtended(save_path).to_cloud(rel2home=True, cloud=cloud)
46
-
47
- elif clone or checkout or checkout_to_branch:
48
- print("\n📥 Cloning or checking out repositories...")
49
- if not repos_root.exists() or repos_root.name != "repos.json":
50
- repos_root = PathExtended(CONFIG_PATH).joinpath("repos").joinpath(repos_root.rel2home()).joinpath("repos.json")
51
- if not repos_root.exists():
52
- if cloud is None:
53
- cloud_name: str = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
54
- print(f"⚠️ Using default cloud: {cloud_name}")
55
- else:
56
- cloud_name = cloud
57
- assert cloud_name is not None, f"Path {repos_root} does not exist and cloud was not passed. You can't clone without one of them."
58
- repos_root.from_cloud(cloud=cloud_name, rel2home=True)
59
- assert (repos_root.exists() and repos_root.name == "repos.json") or cloud is not None, f"Path {repos_root} does not exist and cloud was not passed. You can't clone without one of them."
60
- clone_repos(spec_path=repos_root, preferred_remote=None, checkout_branch_flag=checkout_to_branch, checkout_commit_flag=checkout)
61
-
62
- elif all or commit or pull or push:
63
- perform_git_operations(
64
- repos_root=repos_root,
65
- pull=pull or all,
66
- commit=commit or all,
67
- push=push or all,
68
- recursive=recursive,
69
- auto_sync=auto_sync
70
- )
71
- else:
72
- print("❌ No action specified. Try passing --push, --pull, --commit, or --all.")
73
-
74
-
75
- def main_from_parser() -> None:
76
- typer.run(main)
77
-
78
-
79
- if __name__ == "__main__":
80
- main_from_parser()
@@ -1,335 +0,0 @@
1
- from machineconfig.utils.path_extended import PathExtended as PathExtended
2
- from machineconfig.utils.accessories import randstr
3
- from machineconfig.scripts.python.repos_helper_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
-
11
-
12
- class GitAction(Enum):
13
- commit = "commit"
14
- push = "push"
15
- pull = "pull"
16
-
17
-
18
- @dataclass
19
- class GitOperationResult:
20
- """Result of a git operation on a single repository."""
21
- repo_path: PathExtended
22
- action: str
23
- success: bool
24
- message: str
25
- is_git_repo: bool = True
26
- had_changes: bool = False
27
- remote_count: int = 0
28
-
29
-
30
- @dataclass
31
- class GitOperationSummary:
32
- """Summary of all git operations performed."""
33
- # Basic statistics
34
- total_paths_processed: int = 0
35
- git_repos_found: int = 0
36
- non_git_paths: int = 0
37
-
38
- # Per-operation statistics
39
- commits_attempted: int = 0
40
- commits_successful: int = 0
41
- commits_no_changes: int = 0
42
- commits_failed: int = 0
43
-
44
- pulls_attempted: int = 0
45
- pulls_successful: int = 0
46
- pulls_failed: int = 0
47
-
48
- pushes_attempted: int = 0
49
- pushes_successful: int = 0
50
- pushes_failed: int = 0
51
-
52
- def __post_init__(self):
53
- self.failed_operations: list[GitOperationResult] = []
54
- self.repos_without_remotes: list[PathExtended] = []
55
-
56
-
57
- def git_action(path: PathExtended, action: GitAction, mess: Optional[str] = None, r: bool = False, auto_sync: bool = True) -> GitOperationResult:
58
- """Perform git actions using Python instead of shell scripts. Returns detailed operation result."""
59
- from git.exc import InvalidGitRepositoryError
60
- from git.repo import Repo
61
-
62
- try:
63
- repo = Repo(str(path), search_parent_directories=False)
64
- except InvalidGitRepositoryError:
65
- pprint(f"⚠️ Skipping {path} because it is not a git repository.")
66
- if r:
67
- results = [git_action(path=sub_path, action=action, mess=mess, r=r, auto_sync=auto_sync) for sub_path in path.search()]
68
- # For recursive calls, we need to aggregate results somehow
69
- # For now, return success if all recursive operations succeeded
70
- all_successful = all(result.success for result in results)
71
- return GitOperationResult(
72
- repo_path=path,
73
- action=action.value,
74
- success=all_successful,
75
- message=f"Recursive operation: {len([r for r in results if r.success])}/{len(results)} succeeded",
76
- is_git_repo=False
77
- )
78
- else:
79
- return GitOperationResult(
80
- repo_path=path,
81
- action=action.value,
82
- success=False,
83
- message="Not a git repository",
84
- is_git_repo=False
85
- )
86
-
87
- print(f">>>>>>>>> 🔧{action} - {path}")
88
- remote_count = len(repo.remotes)
89
-
90
- try:
91
- if action == GitAction.commit:
92
- if mess is None:
93
- mess = "auto_commit_" + randstr()
94
-
95
- # Check if there are changes to commit
96
- if repo.is_dirty() or repo.untracked_files:
97
- repo.git.add(A=True) # Stage all changes
98
- repo.index.commit(mess)
99
- print(f"✅ Committed changes with message: {mess}")
100
- return GitOperationResult(
101
- repo_path=path,
102
- action=action.value,
103
- success=True,
104
- message=f"Committed changes with message: {mess}",
105
- had_changes=True,
106
- remote_count=remote_count
107
- )
108
- else:
109
- print("ℹ️ No changes to commit")
110
- return GitOperationResult(
111
- repo_path=path,
112
- action=action.value,
113
- success=True,
114
- message="No changes to commit",
115
- had_changes=False,
116
- remote_count=remote_count
117
- )
118
-
119
- elif action == GitAction.push:
120
- if not repo.remotes:
121
- print("⚠️ No remotes configured for push")
122
- return GitOperationResult(
123
- repo_path=path,
124
- action=action.value,
125
- success=False,
126
- message="No remotes configured",
127
- remote_count=0
128
- )
129
-
130
- success = True
131
- failed_remotes = []
132
- for remote in repo.remotes:
133
- try:
134
- print(f"🚀 Pushing to {remote.url}")
135
- remote.push(repo.active_branch.name)
136
- print(f"✅ Pushed to {remote.name}")
137
- except Exception as e:
138
- print(f"❌ Failed to push to {remote.name}: {e}")
139
- failed_remotes.append(f"{remote.name}: {str(e)}")
140
- success = False
141
-
142
- message = "Push successful" if success else f"Push failed for: {', '.join(failed_remotes)}"
143
- return GitOperationResult(
144
- repo_path=path,
145
- action=action.value,
146
- success=success,
147
- message=message,
148
- remote_count=remote_count
149
- )
150
-
151
- elif action == GitAction.pull:
152
- # Use the enhanced update function with uv sync support
153
- try:
154
- update_repository(repo, auto_sync=auto_sync, allow_password_prompt=False)
155
- print("✅ Pull completed")
156
- return GitOperationResult(
157
- repo_path=path,
158
- action=action.value,
159
- success=True,
160
- message="Pull completed successfully",
161
- remote_count=remote_count
162
- )
163
- except Exception as e:
164
- print(f"❌ Pull failed: {e}")
165
- return GitOperationResult(
166
- repo_path=path,
167
- action=action.value,
168
- success=False,
169
- message=f"Pull failed: {str(e)}",
170
- remote_count=remote_count
171
- )
172
-
173
- except Exception as e:
174
- print(f"❌ Error performing {action} on {path}: {e}")
175
- return GitOperationResult(
176
- repo_path=path,
177
- action=action.value,
178
- success=False,
179
- message=f"Error: {str(e)}",
180
- remote_count=remote_count
181
- )
182
-
183
- # This should never be reached, but just in case
184
- return GitOperationResult(
185
- repo_path=path,
186
- action=action.value,
187
- success=False,
188
- message="Unknown error",
189
- remote_count=remote_count
190
- )
191
-
192
-
193
- def print_git_operations_summary(summary: GitOperationSummary, operations_performed: list[str]) -> None:
194
- """Print a detailed summary of git operations similar to repos_helper_record.py."""
195
- print("\n📊 Git Operations Summary:")
196
- print(f" Total paths processed: {summary.total_paths_processed}")
197
- print(f" Git repositories found: {summary.git_repos_found}")
198
- print(f" Non-git paths skipped: {summary.non_git_paths}")
199
-
200
- # Show per-operation statistics
201
- if "commit" in operations_performed:
202
- print("\n💾 Commit Operations:")
203
- print(f" Attempted: {summary.commits_attempted}")
204
- print(f" Successful: {summary.commits_successful}")
205
- print(f" No changes: {summary.commits_no_changes}")
206
- print(f" Failed: {summary.commits_failed}")
207
-
208
- if "pull" in operations_performed:
209
- print("\n⬇️ Pull Operations:")
210
- print(f" Attempted: {summary.pulls_attempted}")
211
- print(f" Successful: {summary.pulls_successful}")
212
- print(f" Failed: {summary.pulls_failed}")
213
-
214
- if "push" in operations_performed:
215
- print("\n🚀 Push Operations:")
216
- print(f" Attempted: {summary.pushes_attempted}")
217
- print(f" Successful: {summary.pushes_successful}")
218
- print(f" Failed: {summary.pushes_failed}")
219
-
220
- # Show repositories without remotes (important for push operations)
221
- if summary.repos_without_remotes:
222
- print(f"\n⚠️ WARNING: {len(summary.repos_without_remotes)} repositories have no remote configurations:")
223
- for repo_path in summary.repos_without_remotes:
224
- print(f" • {repo_path.name} ({repo_path})")
225
- print(" These repositories cannot be pushed to remote servers.")
226
- else:
227
- if "push" in operations_performed:
228
- print("\n✅ All repositories have remote configurations.")
229
-
230
- # Show failed operations
231
- if summary.failed_operations:
232
- print(f"\n❌ FAILED OPERATIONS ({len(summary.failed_operations)} total):")
233
-
234
- # Group failed operations by type
235
- failed_by_action = {}
236
- for failed_op in summary.failed_operations:
237
- if failed_op.action not in failed_by_action:
238
- failed_by_action[failed_op.action] = []
239
- failed_by_action[failed_op.action].append(failed_op)
240
-
241
- for action, failures in failed_by_action.items():
242
- print(f"\n {action.upper()} failures ({len(failures)}):")
243
- for failure in failures:
244
- if not failure.is_git_repo:
245
- print(f" • {failure.repo_path.name} ({failure.repo_path}) - Not a git repository")
246
- else:
247
- print(f" • {failure.repo_path.name} ({failure.repo_path}) - {failure.message}")
248
- else:
249
- print("\n✅ All git operations completed successfully!")
250
-
251
- # Overall success assessment
252
- total_failed = len(summary.failed_operations)
253
- total_operations = (summary.commits_attempted + summary.pulls_attempted +
254
- summary.pushes_attempted)
255
-
256
- if total_failed == 0 and total_operations > 0:
257
- print(f"\n🎉 SUCCESS: All {total_operations} operations completed successfully!")
258
- elif total_operations == 0:
259
- print("\n📝 No git operations were performed.")
260
- else:
261
- success_rate = ((total_operations - total_failed) / total_operations * 100) if total_operations > 0 else 0
262
- print(f"\n⚖️ SUMMARY: {total_operations - total_failed}/{total_operations} operations succeeded ({success_rate:.1f}% success rate)")
263
- if total_failed > 0:
264
- print(" Review the failed operations above for details on what needs attention.")
265
-
266
-
267
- def perform_git_operations(repos_root: PathExtended, pull: bool, commit: bool, push: bool, recursive: bool, auto_sync: bool) -> None:
268
- """Perform git operations on all repositories and provide detailed summary."""
269
- print(f"\n🔄 Performing Git actions on repositories @ `{repos_root}`...")
270
-
271
- # Initialize summary tracking
272
- summary = GitOperationSummary()
273
- operations_performed = []
274
-
275
- # Determine which operations to perform
276
- if pull:
277
- operations_performed.append("pull")
278
- if commit:
279
- operations_performed.append("commit")
280
- if push:
281
- operations_performed.append("push")
282
-
283
- for a_path in repos_root.search("*"):
284
- print(f"{('Handling ' + str(a_path)).center(80, '-')}")
285
- summary.total_paths_processed += 1
286
-
287
- # Check if this is a git repository first
288
- from git.exc import InvalidGitRepositoryError
289
- from git.repo import Repo
290
-
291
- try:
292
- repo = Repo(str(a_path), search_parent_directories=False)
293
- summary.git_repos_found += 1
294
-
295
- # Track repos without remotes
296
- if len(repo.remotes) == 0:
297
- summary.repos_without_remotes.append(a_path)
298
-
299
- # Now perform the actual operations
300
- if pull:
301
- result = git_action(path=a_path, action=GitAction.pull, r=recursive, auto_sync=auto_sync)
302
- summary.pulls_attempted += 1
303
- if result.success:
304
- summary.pulls_successful += 1
305
- else:
306
- summary.pulls_failed += 1
307
- summary.failed_operations.append(result)
308
-
309
- if commit:
310
- result = git_action(a_path, action=GitAction.commit, r=recursive, auto_sync=auto_sync)
311
- summary.commits_attempted += 1
312
- if result.success:
313
- if result.had_changes:
314
- summary.commits_successful += 1
315
- else:
316
- summary.commits_no_changes += 1
317
- else:
318
- summary.commits_failed += 1
319
- summary.failed_operations.append(result)
320
-
321
- if push:
322
- result = git_action(a_path, action=GitAction.push, r=recursive, auto_sync=auto_sync)
323
- summary.pushes_attempted += 1
324
- if result.success:
325
- summary.pushes_successful += 1
326
- else:
327
- summary.pushes_failed += 1
328
- summary.failed_operations.append(result)
329
-
330
- except InvalidGitRepositoryError:
331
- summary.non_git_paths += 1
332
- pprint(f"⚠️ Skipping {a_path} because it is not a git repository.")
333
-
334
- # Print the detailed summary
335
- print_git_operations_summary(summary, operations_performed)
@@ -1,104 +0,0 @@
1
-
2
-
3
- from pathlib import Path
4
- from typing import Optional, Annotated
5
- import typer
6
- from rich.console import Console
7
- from rich.panel import Panel
8
- from rich.text import Text
9
- from rich.align import Align
10
-
11
-
12
- """
13
- uv run --python 3.13 --with machineconfig
14
- reference:
15
- # https://github.com/tsl0922/ttyd/wiki/Serving-web-fonts
16
- # -t "fontFamily=CaskaydiaCove" bash
17
- # --terminal-type xterm-kitty
18
-
19
- """
20
-
21
-
22
- def display_terminal_url(local_ip_v4: str, port: int) -> None:
23
- """Display a flashy, unmissable terminal URL announcement."""
24
- console = Console()
25
-
26
- # Create the main message with styling
27
- url_text = Text(f"http://{local_ip_v4}:{port}", style="bold bright_cyan underline")
28
- message = Text.assemble(
29
- ("🚀 ", "bright_red"),
30
- ("Terminal is now accessible at: ", "bright_white bold"),
31
- url_text,
32
- (" 🚀", "bright_red")
33
- )
34
-
35
- # Create a fancy panel with borders and styling
36
- panel = Panel(
37
- Align.center(message),
38
- title="[bold bright_green]🌐 WEB TERMINAL READY 🌐[/bold bright_green]",
39
- subtitle="[italic bright_yellow]⚡ Click the link above to access your terminal! ⚡[/italic bright_yellow]",
40
- border_style="bright_magenta",
41
- padding=(1, 2),
42
- expand=False
43
- )
44
-
45
- # Print with extra spacing and attention-grabbing elements
46
- # console.print("\n" + "🔥" * 60 + "\n", style="bright_red bold")
47
- console.print(panel)
48
- # console.print("🔥" * 60 + "\n", style="bright_red bold")
49
-
50
-
51
- def install_ttyd():
52
- # uv run --python 3.13 --with machineconfig devops install ttyd
53
- from machineconfig.utils.installer_utils.installer_abc import check_tool_exists
54
- exists = check_tool_exists("ttyd")
55
- if exists:
56
- print("✅ ttyd is already installed.")
57
- return
58
- print("⏳ ttyd not found. Installing...")
59
- from machineconfig.scripts.python.devops_devapps_install import main
60
- main(which="ttyd")
61
-
62
-
63
-
64
- def main(
65
- port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the terminal server on (default: 7681)")] = None,
66
- username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for terminal access (default: current user)")] = None,
67
- password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for terminal access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None
68
- ) -> None:
69
- install_ttyd()
70
- if username is None:
71
- import getpass
72
- username = getpass.getuser()
73
- if password is None:
74
- pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
75
- if pwd_path.exists():
76
- password = pwd_path.read_text(encoding="utf-8").strip()
77
- else:
78
- raise ValueError("Password not provided and default password file does not exist.")
79
-
80
- if port is None:
81
- port = 7681 # Default port for ttyd
82
-
83
- import socket
84
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
85
- s.connect(('8.8.8.8',80))
86
- local_ip_v4 = s.getsockname()[0]
87
- s.close()
88
-
89
- # Display the flashy terminal announcement
90
- display_terminal_url(local_ip_v4, port)
91
-
92
- code = f"""#!/bin/bash
93
- ttyd --writable -t enableSixel=true --port {port} --credential "{username}:{password}" -t 'theme={{"background": "black"}}' bash
94
- """
95
- import subprocess
96
- subprocess.run(code, shell=True, check=True)
97
-
98
-
99
- def main_with_parser():
100
- typer.run(main)
101
-
102
-
103
- if __name__ == "__main__":
104
- pass
@@ -1,25 +0,0 @@
1
- # def main():
2
- # print("\n" + "=" * 50)
3
- # print("📸 Welcome to the Snapshot Tool")
4
- # print("=" * 50 + "\n")
5
-
6
- # parser = argparse.ArgumentParser(description='📷 Capture snapshots using your webcam.')
7
- # parser.add_argument("--to_text", "-t", help="📝 Convert the snapshot to text using OCR.", action="store_true")
8
- # args = parser.parse_args()
9
-
10
- # print("📷 Capturing image from webcam...")
11
- # img_path = capture_from_webcam(show=False, wait=False, save=True)
12
- # print(f"✅ Image captured and saved at: {img_path}\n")
13
-
14
- # if args.to_text:
15
- # print("🔍 Converting image to text using Tesseract OCR...")
16
- # q = Terminal().run(f"cd ~/AppData/Local/Tesseract-OCR; pytesseract '{img_path}'", shell="pwsh").capture().op
17
- # print("📝 Extracted Text:")
18
- # print("-" * 50)
19
- # print(q)
20
- # print("-" * 50 + "\n")
21
- # else:
22
- # print("📂 Image saved successfully. No text extraction requested.\n")
23
-
24
- # if __name__ == '__main__':
25
- # main()