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,186 +0,0 @@
1
- """utils"""
2
-
3
- from pathlib import Path
4
- import git
5
- from machineconfig.utils.io import read_ini
6
- from machineconfig.utils.path_extended import PathExtended as PathExtended
7
- from machineconfig.utils.terminal import Terminal
8
-
9
- from machineconfig.scripts.python.helpers.repo_sync_helpers import fetch_dotfiles
10
- from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
11
- from machineconfig.utils.options import choose_from_options
12
- from machineconfig.utils.code import get_shell_file_executing_python_script, write_shell_script_to_file
13
- import platform
14
- from typing import Optional, Literal
15
- from rich.console import Console
16
- from rich.panel import Panel
17
-
18
- console = Console()
19
-
20
- _ = fetch_dotfiles
21
-
22
-
23
- def main(cloud: Optional[str] = None, path: Optional[str] = None, message: Optional[str] = None, action: Literal["ask", "pushLocalMerge", "overwriteLocal", "InspectRepos", "RemoveLocalRclone"] = "ask", pwd: Optional[str] = None):
24
- if cloud is None:
25
- try:
26
- cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
27
- console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", title="Default Cloud", border_style="yellow"))
28
- except FileNotFoundError:
29
- console.print(Panel(f"❌ ERROR: No cloud profile found\nLocation: {DEFAULTS_PATH}\nPlease set one up or provide one via the --cloud flag.", title="Error", border_style="red"))
30
- return ""
31
- else:
32
- cloud_resolved = cloud
33
-
34
- # repo_root = PathExtended(args.repo).expanduser().absolute()
35
- repo_local_root = PathExtended.cwd() if path is None else PathExtended(path).expanduser().absolute()
36
- repo_local_obj = git.Repo(repo_local_root, search_parent_directories=True)
37
- repo_local_root = PathExtended(repo_local_obj.working_dir) # cwd might have been in a sub directory of repo_root, so its better to redefine it.
38
- PathExtended(CONFIG_PATH).joinpath("remote").mkdir(parents=True, exist_ok=True)
39
- repo_remote_root = PathExtended(CONFIG_PATH).joinpath("remote", repo_local_root.rel2home()) # .delete(sure=True)
40
-
41
- try:
42
- console.print(Panel("📥 DOWNLOADING REMOTE REPOSITORY", title_align="left", border_style="blue"))
43
- remote_path = repo_local_root.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
44
- repo_remote_root.from_cloud(remotepath=remote_path, cloud=cloud_resolved, unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=pwd)
45
- except AssertionError:
46
- console.print(Panel("🆕 Remote repository doesn't exist\n📤 Creating new remote and exiting...", title_align="left", border_style="green"))
47
- repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
48
- return ""
49
-
50
- repo_remote_obj = git.Repo(repo_remote_root)
51
- if repo_remote_obj.is_dirty():
52
- console.print(Panel(f"⚠️ WARNING: REMOTE REPOSITORY IS DIRTY\nLocation: {repo_remote_root}\nPlease commit or stash changes before proceeding.", title="Warning", border_style="yellow"))
53
-
54
- script = f"""
55
- echo ""
56
- echo 'echo -e "\\033[1;34m═════ COMMITTING LOCAL CHANGES ═════\\033[0m"'
57
- cd {repo_local_root}
58
- git status
59
- git add .
60
- git commit -am "{message}"
61
- echo ""
62
- echo ""
63
- echo 'echo -e "\\033[1;34m═════ PULLING LATEST FROM REMOTE ═════\\033[0m"'
64
- cd {repo_local_root}
65
- echo '-> Trying to removing originEnc remote from local repo if it exists.'
66
- # git remote remove originEnc
67
- git remote remove originEnc 2>/dev/null || true
68
- echo '-> Adding originEnc remote to local repo'
69
- git remote add originEnc {repo_remote_root}
70
- echo '-> Fetching originEnc remote.'
71
- git pull originEnc master
72
-
73
- """
74
-
75
- shell_path = write_shell_script_to_file(shell_script=script)
76
- res = Terminal().run(f". {shell_path}", shell="powershell").capture().print()
77
-
78
- if res.is_successful(strict_err=True, strict_returcode=True):
79
- console.print(Panel("✅ Pull succeeded!\n🧹 Removing originEnc remote and local copy\n📤 Pushing merged repository to cloud storage", title="Success", border_style="green"))
80
- repo_remote_root.delete(sure=True)
81
- from git.remote import Remote
82
-
83
- Remote.remove(repo_local_obj, "originEnc")
84
- repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
85
- return "success"
86
- else:
87
- console.print(Panel(f"⚠️ MERGE FAILED\n💾 Keeping local copy of remote at:\n📂 {repo_remote_root}", title="Merge Failed", border_style="red"))
88
-
89
- # ================================================================================
90
- option1 = "Delete remote copy and push local:"
91
- program_1_py = f"""
92
- from machineconfig.scripts.python.helpers.repo_sync_helpers import delete_remote_repo_copy_and_push_local as func
93
- func(remote_repo=r'{str(repo_remote_root)}', local_repo=r'{str(repo_local_root)}', cloud=r'{cloud_resolved}')
94
- """
95
- shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
96
- # ================================================================================
97
-
98
- option2 = "Delete local repo and replace it with remote copy:"
99
- program_2 = f"""
100
- rm -rfd {repo_local_root}
101
- mv {repo_remote_root} {repo_local_root}
102
- """
103
- if platform.system() in ["Linux", "Darwin"]:
104
- program_2 += """
105
- sudo chmod 600 $HOME/.ssh/*
106
- sudo chmod 700 $HOME/.ssh
107
- sudo chmod +x $HOME/dotfiles/scripts/linux -R
108
- """
109
-
110
- shell_file_2 = write_shell_script_to_file(shell_script=program_2)
111
-
112
- # ================================================================================
113
- option3 = "Inspect repos:"
114
- program_3_py = f"""
115
- from machineconfig.scripts.python.helper.repo_sync_helpers import inspect_repos as func
116
- func(repo_local_root=r'{str(repo_local_root)}', repo_remote_root=r'{str(repo_remote_root)}')
117
- """
118
- shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
119
- # ================================================================================
120
-
121
- option4 = "Remove problematic rclone file from repo and replace with remote:"
122
- program_4 = f"""
123
- rm $HOME/dotfiles/creds/rclone/rclone.conf
124
- cp $HOME/.config/machineconfig/remote/dotfiles/creds/rclone/rclone.conf $HOME/dotfiles/creds/rclone
125
- cd $HOME/dotfiles
126
- git commit -am "finished merging"
127
- . {shell_file_1}
128
- """
129
- shell_file_4 = write_shell_script_to_file(shell_script=program_4)
130
- # ================================================================================
131
-
132
- console.print(Panel("🔄 RESOLVE MERGE CONFLICT\nChoose an option to resolve the conflict:", title_align="left", border_style="blue"))
133
-
134
- print(f"• 1️⃣ {option1:75} 👉 {shell_file_1}")
135
- print(f"• 2️⃣ {option2:75} 👉 {shell_file_2}")
136
- print(f"• 3️⃣ {option3:75} 👉 {shell_file_3}")
137
- print(f"• 4️⃣ {option4:75} 👉 {shell_file_4}")
138
-
139
- program_content = None
140
- match action:
141
- case "ask":
142
- choice = choose_from_options(multi=False, msg="Choose one option", options=[option1, option2, option3, option4], fzf=False)
143
- if choice == option1:
144
- program_content = shell_file_1.read_text(encoding="utf-8")
145
- elif choice == option2:
146
- program_content = program_2
147
- elif choice == option3:
148
- program_content = shell_file_3.read_text(encoding="utf-8")
149
- elif choice == option4:
150
- program_content = program_4
151
- else:
152
- raise NotImplementedError(f"Choice {choice} not implemented.")
153
- case "pushLocalMerge":
154
- program_content = shell_file_1.read_text(encoding="utf-8")
155
- case "overwriteLocal":
156
- program_content = program_2
157
- case "InspectRepos":
158
- program_content = shell_file_3.read_text(encoding="utf-8")
159
- case "RemoveLocalRclone":
160
- program_content = program_4
161
- case _:
162
- raise ValueError(f"Unknown action: {action}")
163
- # PROGRAM_PATH.write_text(program_content, encoding="utf-8")
164
- import subprocess
165
-
166
- subprocess.run(program_content, shell=True, check=True)
167
-
168
- return program_content
169
-
170
-
171
- def args_parser():
172
- # console.print(Panel("🔄 Repository Synchronization Utility", title_align="left", border_style="blue"))
173
- # parser = argparse.ArgumentParser(description="Secure Repo CLI.")
174
- # parser.add_argument("path", nargs="?", type=str, help="Repository path, defaults to cwd.", default=None)
175
- # parser.add_argument("--cloud", "-c", help="rclone cloud profile name.", default=None)
176
- # parser.add_argument("--message", "-m", help="Commit Message", default=f"new message {randstr()}")
177
- # parser.add_argument("--pwd", "-p", help="Password for encryption", default=None)
178
- # parser.add_argument("--action", "-a", help="Action to take if merge fails.", choices=["ask", "pushLocalMerge", "overwriteLocal", "InspectRepos", "RemoveLocalRclone"], default="ask")
179
- # args = parser.parse_args()
180
- # main(cloud=args.cloud, path=args.path, message=args.message, action=args.action)
181
- import typer
182
- typer.run(main)
183
-
184
-
185
- if __name__ == "__main__":
186
- args_parser()
@@ -1,159 +0,0 @@
1
- """Devops Devapps Install"""
2
-
3
- import typer
4
- from rich.progress import Progress, SpinnerColumn, TextColumn
5
- from platform import system
6
- from typing import Optional, Literal, TypeAlias, cast, get_args, Annotated
7
-
8
- WHICH_CAT: TypeAlias = Literal["essentials", "essentialsDev", "systymPackages", "precheckedPackages", "ia"]
9
-
10
-
11
- def main_with_parser():
12
- import typer
13
- app = typer.Typer()
14
- app.command()(main)
15
- app()
16
-
17
-
18
- def main(which: Annotated[Optional[str], typer.Argument(help=f"Choose a category or program to install, {list(get_args(WHICH_CAT))} or <program_name> or list of programs names separated by comma.")]) -> None:
19
- if which in get_args(WHICH_CAT): # install by category
20
- return get_programs_by_category(program_name=which) # type: ignore
21
- from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
22
- from machineconfig.utils.installer import get_installers
23
- if which != "ia" and which is not None: # install by name
24
- total_messages: list[str] = []
25
- for a_which in which.split(",") if type(which) == str else which:
26
- all_installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL", "GITHUB_DEV", "CUSTOM_DEV"])
27
-
28
- # Find installer by exe_name or name
29
- selected_installer = None
30
- for installer in all_installers:
31
- exe_name = installer.installer_data.get("exeName", "")
32
- app_name = installer.installer_data.get("appName", "")
33
- if exe_name == a_which or app_name == a_which:
34
- selected_installer = installer
35
- break
36
-
37
- if selected_installer is None:
38
- available_names = [f"{inst.installer_data.get('exeName', 'unknown')} ({inst.installer_data.get('appName', 'unknown')})" for inst in all_installers[:10]] # Show first 10
39
- raise ValueError(f"{a_which=} not found. Available installers include: {available_names}")
40
-
41
- print(f"""
42
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
43
- ┃ 🔧 Installing: {a_which}
44
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
45
- print(selected_installer)
46
- message = selected_installer.install_robust(version=None) # finish the task
47
- total_messages.append(message)
48
- for a_message in total_messages:
49
- print(a_message)
50
- return None
51
-
52
-
53
-
54
- def install_interactively():
55
- from machineconfig.utils.options import choose_from_options
56
- from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
57
- from machineconfig.utils.installer import get_installers
58
- installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL", "GITHUB_DEV", "CUSTOM_DEV"])
59
- # Check installed programs with progress indicator
60
- with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
61
- task = progress.add_task("✅ Checking installed programs...", total=len(installers))
62
- installer_options = []
63
- for x in installers:
64
- installer_options.append(x.get_description())
65
- progress.update(task, advance=1)
66
-
67
- # Add category options at the beginning for better visibility
68
- category_options = [f"📦 {cat}" for cat in get_args(WHICH_CAT)]
69
- options = category_options + ["─" * 50] + installer_options
70
-
71
- program_names = choose_from_options(multi=True, msg="Categories are prefixed with 📦", options=options, header="🚀 CHOOSE DEV APP OR CATEGORY", default="📦 essentials", fzf=True)
72
-
73
- total_commands = ""
74
- installation_messages: list[str] = []
75
- for _an_idx, a_program_name in enumerate(program_names):
76
- # Skip separator lines
77
- if a_program_name.startswith("─"):
78
- continue
79
-
80
- print(f"""
81
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
82
- ┃ 🔄 Processing: {a_program_name}
83
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
84
-
85
- # Handle category options (remove emoji prefix)
86
- if a_program_name.startswith("📦 "):
87
- category_name = a_program_name[2:] # Remove "📦 " prefix
88
- if category_name in get_args(WHICH_CAT):
89
- get_programs_by_category(program_name=cast(WHICH_CAT, category_name))
90
- else:
91
- # Handle individual installer options
92
- installer_idx = installer_options.index(a_program_name)
93
- an_installer = installers[installer_idx]
94
- status_message = an_installer.install_robust(version=None) # finish the task - this returns a status message, not a command
95
- installation_messages.append(status_message)
96
-
97
- # Print all installation status messages
98
- print("\n📊 INSTALLATION SUMMARY:")
99
- print("=" * 50)
100
- for message in installation_messages:
101
- print(message)
102
-
103
- # Only run shell commands if there are any (from category installations)
104
- if total_commands.strip():
105
- import subprocess
106
-
107
- print("\n🚀 Running additional shell commands...")
108
- subprocess.run(total_commands, shell=True, check=True)
109
-
110
-
111
- def get_programs_by_category(program_name: WHICH_CAT):
112
- print(f"""
113
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
114
- ┃ 📦 Installing Category: {program_name}
115
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
116
- from machineconfig.utils.source_of_truth import LIBRARY_ROOT
117
- from machineconfig.utils.installer import get_installers, install_all
118
- from machineconfig.utils.installer_utils.installer_abc import parse_apps_installer_linux, parse_apps_installer_windows
119
- from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
120
- from machineconfig.utils.options import choose_from_options
121
- match program_name:
122
- case "essentials":
123
- installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL"])
124
- install_all(installers=installers_)
125
- case "essentialsDev":
126
- installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_DEV", "CUSTOM_DEV", "GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL"])
127
- install_all(installers=installers_)
128
- case "systymPackages":
129
- if system() == "Windows":
130
- options_system = parse_apps_installer_windows(LIBRARY_ROOT.joinpath("setup_windows/apps.ps1").read_text(encoding="utf-8"))
131
- elif system() == "Linux":
132
- options_system_1 = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps_dev.sh").read_text(encoding="utf-8"))
133
- options_system_2 = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps.sh").read_text(encoding="utf-8"))
134
- options_system = {**options_system_1, **options_system_2}
135
- else:
136
- raise NotImplementedError(f"❌ System {system()} not supported")
137
- program_names = choose_from_options(multi=True, msg="", options=sorted(list(options_system.keys())), header="🚀 CHOOSE DEV APP", fzf=True)
138
- program = ""
139
- for name in program_names:
140
- print(f"""
141
- ┌────────────────────────────────────────────────────
142
- │ ⚙️ Installing: {name}
143
- └────────────────────────────────────────────────────""")
144
- sub_program = options_system[name]
145
- if sub_program.startswith("#winget"):
146
- sub_program = sub_program[1:]
147
- program += "\n" + sub_program
148
- case "ia":
149
- install_interactively()
150
- case "precheckedPackages":
151
- # from machineconfig.jobs.python.check_installations import precheckedPackages
152
- # ci = precheckedPackages()
153
- # ci.download_safe_apps(name="essentials")
154
- # program = ""
155
- raise NotImplementedError("precheckedPackages is not implemented yet.")
156
-
157
-
158
- if __name__ == "__main__":
159
- pass
@@ -1,180 +0,0 @@
1
- """Update repositories with fancy output"""
2
-
3
- import git
4
- from pathlib import Path
5
- from machineconfig.scripts.python.repos_helper_update import RepositoryUpdateResult, run_uv_sync, update_repository
6
- from machineconfig.utils.path_extended import PathExtended as PathExtended
7
- from machineconfig.utils.source_of_truth import DEFAULTS_PATH
8
- from machineconfig.utils.io import read_ini
9
-
10
-
11
- def _display_summary(results: list[RepositoryUpdateResult]) -> None:
12
- """Display a comprehensive summary of all repository update operations."""
13
- print("\n" + "=" * 80)
14
- print("📊 REPOSITORY UPDATE SUMMARY")
15
- print("=" * 80)
16
-
17
- # Calculate statistics
18
- total_repos = len(results)
19
- successful_repos = sum(1 for r in results if r["status"] == "success")
20
- error_repos = sum(1 for r in results if r["status"] == "error")
21
- skipped_repos = sum(1 for r in results if r["status"] == "skipped")
22
- auth_failed_repos = sum(1 for r in results if r["status"] == "auth_failed")
23
-
24
- repos_with_changes = sum(1 for r in results if r["commits_changed"])
25
- repos_with_uncommitted = sum(1 for r in results if r["had_uncommitted_changes"])
26
- repos_with_dep_changes = sum(1 for r in results if r["dependencies_changed"])
27
- uv_sync_runs = sum(1 for r in results if r["uv_sync_ran"])
28
- uv_sync_successes = sum(1 for r in results if r["uv_sync_ran"] and r["uv_sync_success"])
29
-
30
- # Overview statistics
31
- print("📈 OVERVIEW:")
32
- print(f" Total repositories processed: {total_repos}")
33
- print(f" ✅ Successful updates: {successful_repos}")
34
- print(f" ❌ Failed updates: {error_repos}")
35
- print(f" ⏭️ Skipped: {skipped_repos}")
36
- if auth_failed_repos > 0:
37
- print(f" 🔐 Authentication failed: {auth_failed_repos}")
38
- print()
39
-
40
- print("🔄 CHANGES:")
41
- print(f" Repositories with new commits: {repos_with_changes}")
42
- print(f" Repositories with dependency changes: {repos_with_dep_changes}")
43
- print(f" Repositories with uncommitted changes: {repos_with_uncommitted}")
44
- print()
45
-
46
- print("📦 UV SYNC:")
47
- print(f" uv sync operations attempted: {uv_sync_runs}")
48
- print(f" uv sync operations successful: {uv_sync_successes}")
49
- if uv_sync_runs > uv_sync_successes:
50
- print(f" uv sync operations failed: {uv_sync_runs - uv_sync_successes}")
51
- print()
52
-
53
- # Detailed results per repository
54
- print("📋 DETAILED RESULTS:")
55
- for result in results:
56
- repo_name = Path(result["repo_path"]).name
57
- status_icon = {"success": "✅", "error": "❌", "skipped": "⏭️", "auth_failed": "🔐"}.get(result["status"], "❓")
58
- print(f" {status_icon} {repo_name}")
59
-
60
- if result["status"] == "error" and result["error_message"]:
61
- print(f" 💥 Error: {result['error_message']}")
62
-
63
- if result["commits_changed"]:
64
- print(f" 🔄 Updated: {result['commit_before'][:8]} → {result['commit_after'][:8]}")
65
- elif result["status"] == "success":
66
- print(" 📍 Already up to date")
67
-
68
- if result["had_uncommitted_changes"]:
69
- files_str = ", ".join(result["uncommitted_files"])
70
- print(f" ⚠️ Had uncommitted changes: {files_str}")
71
-
72
- if result["dependencies_changed"]:
73
- changes = []
74
- if result["pyproject_changed"]:
75
- changes.append("pyproject.toml")
76
- print(f" 📋 Dependencies changed: {', '.join(changes)}")
77
-
78
- if result["uv_sync_ran"]:
79
- sync_status = "✅" if result["uv_sync_success"] else "❌"
80
- print(f" 📦 uv sync: {sync_status}")
81
-
82
- if result["is_machineconfig_repo"] and result["permissions_updated"]:
83
- print(" 🛠 Updated permissions for machineconfig files")
84
-
85
- if result["remotes_processed"]:
86
- print(f" 📡 Processed remotes: {', '.join(result['remotes_processed'])}")
87
- if result["remotes_skipped"]:
88
- print(f" ⏭️ Skipped remotes: {', '.join(result['remotes_skipped'])}")
89
-
90
- print("\n" + "=" * 80)
91
-
92
- # Final status
93
- if error_repos == 0 and auth_failed_repos == 0:
94
- print("🎉 All repositories processed successfully!")
95
- elif successful_repos > 0:
96
- print(f"⚠️ {successful_repos}/{total_repos} repositories processed successfully")
97
- else:
98
- print("❌ No repositories were successfully processed")
99
- print("=" * 80)
100
-
101
-
102
- def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
103
- """Main function to update all configured repositories."""
104
- _ = verbose
105
- repos: list[PathExtended] = [PathExtended.home() / "code/machineconfig", PathExtended.home() / "code/crocodile"]
106
- try:
107
- tmp = read_ini(DEFAULTS_PATH)["general"]["repos"].split(",")
108
- if tmp[-1] == "":
109
- tmp = tmp[:-1]
110
- for item in tmp:
111
- item_obj = PathExtended(item).expanduser()
112
- if item_obj not in repos:
113
- repos.append(item_obj)
114
- except (FileNotFoundError, KeyError, IndexError):
115
- print(f"""
116
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
- ┃ 🚫 Configuration Error: Missing {DEFAULTS_PATH} or section [general] or key repos
118
- ┃ ℹ️ Using default repositories instead
119
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
120
- print("""
121
- ┌────────────────────────────────────────────────────────────────
122
- │ ✨ Example Configuration:
123
-
124
- │ [general]
125
- │ repos = ~/code/repo1,~/code/repo2
126
- │ rclone_config_name = onedrivePersonal
127
- │ email_config_name = Yahoo3
128
- │ to_email = myemail@email.com
129
- └────────────────────────────────────────────────────────────────""")
130
-
131
- # Process repositories
132
- results: list[RepositoryUpdateResult] = []
133
- repos_with_changes = []
134
-
135
- for expanded_path in repos:
136
- try:
137
- repo = git.Repo(str(expanded_path), search_parent_directories=True)
138
- # Update repository and get detailed results
139
- result = update_repository(repo, allow_password_prompt=allow_password_prompt, auto_sync=True)
140
- results.append(result)
141
-
142
- # Keep track of repos with dependency changes for additional uv sync
143
- if result["dependencies_changed"] and not result["uv_sync_ran"]:
144
- repos_with_changes.append(Path(repo.working_dir))
145
-
146
- except Exception as ex:
147
- # Create a result for failed repos
148
- error_result: RepositoryUpdateResult = {
149
- "repo_path": str(expanded_path),
150
- "status": "error",
151
- "had_uncommitted_changes": False,
152
- "uncommitted_files": [],
153
- "commit_before": "",
154
- "commit_after": "",
155
- "commits_changed": False,
156
- "pyproject_changed": False,
157
- "dependencies_changed": False,
158
- "uv_sync_ran": False,
159
- "uv_sync_success": False,
160
- "remotes_processed": [],
161
- "remotes_skipped": [],
162
- "error_message": str(ex),
163
- "is_machineconfig_repo": False,
164
- "permissions_updated": False,
165
- }
166
- results.append(error_result)
167
- print(f"""❌ Repository Error: Path: {expanded_path}
168
- Exception: {ex}
169
- {"-" * 50}""")
170
-
171
- # Run uv sync for repositories where pyproject.toml changed but sync wasn't run yet
172
- for repo_path in repos_with_changes:
173
- run_uv_sync(repo_path)
174
-
175
- # Generate and display summary
176
- _display_summary(results)
177
-
178
-
179
- if __name__ == "__main__":
180
- main()
@@ -1,52 +0,0 @@
1
- """Like yadm and dotter."""
2
-
3
- from machineconfig.utils.path_extended import PathExtended as PathExtended
4
- from machineconfig.utils.links import symlink_func
5
- from machineconfig.utils.source_of_truth import LIBRARY_ROOT, REPO_ROOT
6
- from typing import Annotated
7
- import typer
8
-
9
-
10
- def main(
11
- file: Annotated[str, typer.Argument(help="file/folder path.")],
12
- overwrite: Annotated[bool, typer.Option("--overwrite", "-o", help="Overwrite.")] = False,
13
- dest: Annotated[str, typer.Option("--dest", "-d", help="destination folder")] = "",
14
- ) -> None:
15
- orig_path = PathExtended(file).expanduser().absolute()
16
- if dest == "":
17
- if "Local" in str(orig_path):
18
- junction = orig_path.split(at="Local", sep=-1)[1]
19
- elif "Roaming" in str(orig_path):
20
- junction = orig_path.split(at="Roaming", sep=-1)[1]
21
- elif ".config" in str(orig_path):
22
- junction = orig_path.split(at=".config", sep=-1)[1]
23
- else:
24
- junction = orig_path.rel2home()
25
- new_path = PathExtended(REPO_ROOT).joinpath(junction)
26
- else:
27
- dest_path = PathExtended(dest).expanduser().absolute()
28
- dest_path.mkdir(parents=True, exist_ok=True)
29
- new_path = dest_path.joinpath(orig_path.name)
30
-
31
- symlink_func(this=orig_path, to_this=new_path, prioritize_to_this=overwrite)
32
-
33
- print("""
34
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
35
- ┃ ✅ Symbolic Link Created Successfully
36
-
37
- ┃ 🔄 To enshrine this mapping, add the following to mapper.toml:
38
- ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
39
- print(f"""
40
- 📝 Edit configuration file: nano {PathExtended(LIBRARY_ROOT)}/symlinks/mapper.toml
41
-
42
- [{new_path.parent.name}]
43
- {orig_path.name.split(".")[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}
44
- """)
45
-
46
-
47
- def arg_parser() -> None:
48
- typer.run(main)
49
-
50
-
51
- if __name__ == "__main__":
52
- arg_parser()