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
@@ -0,0 +1,255 @@
1
+
2
+ GUI = [
3
+ "brave",
4
+ "code",
5
+ "git",
6
+ "wezterm",
7
+ ]
8
+
9
+ # AI/LLM Tools - AI-powered coding and chat assistants
10
+ AGENTS = [
11
+ "aider",
12
+ "aichat",
13
+ "copilot",
14
+ "gemini",
15
+ "crush",
16
+ "opencode-ai",
17
+ "ollama",
18
+ "chatgpt",
19
+ "mods",
20
+ "q",
21
+ "qwen-code",
22
+ "cursor-cli",
23
+ "droid",
24
+ "kilocode",
25
+ "cline",
26
+ "auggie",
27
+ # "gorilla",
28
+ ]
29
+
30
+
31
+ # Terminal Emulators & Shells - Terminal applications, emulators, and shell environments
32
+ PACKAGES_TERMINAL_EMULATORS = [
33
+ "Alacritty",
34
+ "Wezterm",
35
+ "warp",
36
+ "vtm",
37
+ "edex-ui",
38
+ "extraterm",
39
+ "nushell",
40
+ ]
41
+
42
+ # Browsers - Web browsers and terminal browsers
43
+ PACKAGES_BROWSERS = [
44
+ "Brave",
45
+ "bypass-paywalls-chrome",
46
+ "browsh",
47
+ "carbonyl",
48
+ "m365",
49
+ "zoomit",
50
+ ]
51
+
52
+ # Code Editors & IDEs - Code editing tools
53
+ # NOTE: Entries must match the corresponding `appName` in installer_data.json for filtering to work.
54
+ PACKAGES_CODE_EDITORS = [
55
+ "code",
56
+ "Cursor",
57
+ "lvim",
58
+ ]
59
+
60
+
61
+
62
+ # Database Tools - Database clients and visualizers
63
+ PACKAGES_DATABASE = [
64
+ "SqliteBrowser",
65
+ "sqlite3",
66
+ "redis",
67
+ "redis-cli",
68
+ "postgresql-client",
69
+ "duckdb",
70
+ "DBeaver",
71
+ "rainfrog",
72
+
73
+ ]
74
+
75
+
76
+ # Media & Entertainment - Music players and media tools
77
+ PACKAGES_MEDIA = [
78
+ "ytui-music",
79
+ "youtube-tui",
80
+ "termusic",
81
+ "kronos",
82
+ "OBS Background removal",
83
+ ]
84
+
85
+ # File Sharing & Cloud - File sharing, transfer, backup, sync, and QR tools
86
+ PACKAGES_FILE_SHARING = [
87
+ "ngrok",
88
+ "devtunnel",
89
+ "cloudflared",
90
+ "forward-cli",
91
+ "ffsend",
92
+ "portal",
93
+ "qrcp",
94
+ "termscp",
95
+ "filebrowser",
96
+ "qr",
97
+ "qrscan",
98
+ "sharewifi",
99
+ "share-wifi",
100
+ "easy-sharing",
101
+ "ezshare",
102
+ "restic",
103
+ "syncthing",
104
+ "cloudreve",
105
+ "ots",
106
+ ]
107
+
108
+
109
+ # Development Tools - Various development utilities
110
+ PACKAGES_DEV_UTILS = [
111
+ "devcontainer",
112
+ "rust-analyzer",
113
+ "evcxr",
114
+ "geckodriver",
115
+ ]
116
+
117
+ # Code Analysis, Git & Docs - Code analysis, statistics, documentation, and Git tools
118
+ PACKAGES_CODE_ANALYSIS = [
119
+ "lazygit",
120
+ "onefetch",
121
+ "gitcs",
122
+ "lazydocker",
123
+ "hyperfine",
124
+ "kondo",
125
+ "tokei",
126
+ "navi",
127
+ "tealdeer",
128
+ "gitui",
129
+ "delta",
130
+ "gh",
131
+ "watchexec",
132
+ "jq",
133
+ ]
134
+
135
+ # Productivity & Utilities - Productivity tools, security, remote access, and terminal enhancements
136
+ PACKAGES_PRODUCTIVITY = [
137
+ "espanso",
138
+ "bitwarden",
139
+ "openpomodoro-cli",
140
+ "rustdesk",
141
+ "mermaid-cli",
142
+ "html2markdown",
143
+ "pandoc",
144
+ "patat",
145
+ "marp",
146
+ "presenterm",
147
+ "glow",
148
+ "gum",
149
+ "hx",
150
+ ]
151
+
152
+
153
+ # sudo nala install cowsay -y || true
154
+ # sudo nala install lolcat -y || true
155
+ # sudo nala install boxes -y || true
156
+ # sudo nala install figlet -y || true
157
+ # sudo nala install fortune -y || true
158
+ # sudo nala install toilet -y || true
159
+ TERMINAL_EYE_CANDY = [
160
+ "lolcatjs",
161
+ "figlet-cli",
162
+ "boxes",
163
+ # "transmission",
164
+ # "bytehound",
165
+ # "xcrawl3r",
166
+ # "obsidian",
167
+ # "istio",
168
+ # "cointop",
169
+ ]
170
+
171
+
172
+ # System & Network Monitoring - System resource monitors, process viewers, network analysis, and system info tools
173
+ PACKAGES_SYSTEM_MONITORS = [
174
+ "btop",
175
+ "btm",
176
+ "ntop",
177
+ "procs",
178
+ "bandwhich",
179
+ "ipinfo",
180
+ "sniffnet",
181
+ "cpufetch",
182
+ "fastfetch",
183
+ "topgrade",
184
+ "speedtest",
185
+ ]
186
+
187
+
188
+
189
+
190
+ # Search & Archive Tools - File and content search utilities, archive management
191
+ PACKAGES_FILE = [
192
+ "nerdfont",
193
+ "winget",
194
+ "fd",
195
+ "fzf",
196
+ "broot",
197
+ "rg",
198
+ "rga",
199
+ "ugrep",
200
+ "ouch",
201
+ "pistol",
202
+ "bat",
203
+ "viu",
204
+ # "xplr",
205
+ # "joshuto",
206
+ # "lf",
207
+ # "nnn",
208
+ "yazi",
209
+ "tere",
210
+ # "exa",
211
+ "lsd",
212
+ "zoxide",
213
+ "diskonaut",
214
+ "dua",
215
+ "dust",
216
+ "cpz",
217
+ "rmz",
218
+ ]
219
+
220
+ # Terminal & Shell Enhancements - Terminal multiplexers, shell history, and prompts
221
+ PACKAGES_TERMINAL_SHELL = [
222
+ "zellij",
223
+ "mprocs",
224
+ "mcfly",
225
+ "atuin",
226
+ "starship",
227
+ "gotty",
228
+ "ttyd",
229
+ "rclone",
230
+ "cb"
231
+ ]
232
+
233
+
234
+
235
+ PACKAGE_GROUP2NAMES: dict[str, list[str]] = {
236
+ "sysabc": ["sysabc"],
237
+ "termabc": [*PACKAGES_CODE_ANALYSIS, *PACKAGES_SYSTEM_MONITORS, *PACKAGES_TERMINAL_SHELL, *PACKAGES_FILE,],
238
+ "gui": GUI,
239
+ "dev": [*PACKAGES_TERMINAL_EMULATORS, *PACKAGES_BROWSERS, *PACKAGES_CODE_EDITORS, *PACKAGES_DATABASE, *PACKAGES_MEDIA, *PACKAGES_FILE_SHARING, *PACKAGES_DEV_UTILS, *PACKAGES_CODE_ANALYSIS, *PACKAGES_PRODUCTIVITY, *TERMINAL_EYE_CANDY,],
240
+ "dev-utils": PACKAGES_DEV_UTILS,
241
+ "term-eye-candy": TERMINAL_EYE_CANDY,
242
+ "agents": AGENTS,
243
+ "terminal-emulator": PACKAGES_TERMINAL_EMULATORS,
244
+ "shell": PACKAGES_TERMINAL_SHELL,
245
+ "browsers": PACKAGES_BROWSERS,
246
+ "code-editors": PACKAGES_CODE_EDITORS,
247
+ "code-analysis": PACKAGES_CODE_ANALYSIS,
248
+ "db": PACKAGES_DATABASE,
249
+ "media": PACKAGES_MEDIA,
250
+ "file-sharing": PACKAGES_FILE_SHARING,
251
+ "productivity": PACKAGES_PRODUCTIVITY,
252
+ "sys-monitor": PACKAGES_SYSTEM_MONITORS,
253
+ "search": PACKAGES_FILE,
254
+ }
255
+
machineconfig/logger.py CHANGED
@@ -1,4 +1,3 @@
1
- from __future__ import annotations
2
1
 
3
2
  import logging
4
3
  import os
@@ -0,0 +1,49 @@
1
+
2
+ # locations to be backed up to the cloud.
3
+
4
+ [thunderbird_windows]
5
+ path = '~/AppData/Roaming/Thunderbird/Profiles'
6
+ encrypt = 'True'
7
+ zip = 'True'
8
+ rel2home = 'True'
9
+ os_specific = 'True'
10
+
11
+
12
+ [thunderbird_linux]
13
+ path = '~/.thunderbird'
14
+ encrypt = 'True'
15
+ zip = 'True'
16
+ rel2home = 'True'
17
+ os_specific = 'True'
18
+
19
+
20
+ [zoxide_windows]
21
+ path = '~/AppData/Local/zoxide/db.zo'
22
+ encrypt = 'False'
23
+ zip = 'False'
24
+ rel2home = 'True'
25
+ os_specific = 'True'
26
+
27
+
28
+ [zoxide_linux]
29
+ path = '~/.local/share/zoxide/db.zo'
30
+ encrypt = 'False'
31
+ zip = 'False'
32
+ rel2home = 'True'
33
+ os_specific = 'True'
34
+
35
+
36
+ #[dotfiles]
37
+ # path = '~/dotfiles'
38
+ # encrypt = 'True'
39
+ # zip = 'True'
40
+ # rel2home = 'True'
41
+ # os_specific = 'True'
42
+
43
+
44
+ [ipython]
45
+ path = '~/.ipython'
46
+ encrypt = 'True'
47
+ zip = 'True'
48
+ rel2home = 'True'
49
+ os_specific = 'False'
@@ -0,0 +1,11 @@
1
+
2
+ # Non-login shells, .bashrc > .profile are read.
3
+ # for login shells, e.g. SSH, .bash_login > .bash_profile > .profile is read.
4
+
5
+ # The strategy to ensure consistent configuration for login and nonlogin shells is to put all the configuration in .bashrc, and then source it from .bash_profile and .profile.
6
+
7
+ # ensure .bash_profile only calls .profile
8
+ # ensure .profile calls .bashrc only at the end.
9
+
10
+ When you login: /etc/profile -> ~/.profile -> ~/.bash_profile -> ~/.bashrc
11
+ When you open a new terminal: ~/.bashrc
@@ -0,0 +1,74 @@
1
+
2
+ from typing import Literal
3
+ from pathlib import Path
4
+ import shutil
5
+ from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
6
+
7
+
8
+ def _copy_path(source: Path, target: Path, overwrite: bool = False) -> None:
9
+ source = source.expanduser().resolve()
10
+ target = target.expanduser().resolve()
11
+ if not source.exists():
12
+ raise FileNotFoundError(f"Source path does not exist: {source}")
13
+ target.parent.mkdir(parents=True, exist_ok=True)
14
+ if target.exists() and not overwrite:
15
+ raise FileExistsError(f"Target already exists and overwrite=False: {target}")
16
+ if target.exists() and overwrite:
17
+ if target.is_dir():
18
+ shutil.rmtree(target)
19
+ else:
20
+ target.unlink()
21
+ if source.is_file():
22
+ shutil.copy2(source, target)
23
+ elif source.is_dir():
24
+ shutil.copytree(source, target, dirs_exist_ok=overwrite)
25
+ else:
26
+ raise ValueError(f"Source is neither file nor directory: {source}")
27
+
28
+
29
+ def copy_assets_to_machine(which: Literal["scripts", "settings"]) -> None:
30
+ import platform
31
+ import subprocess
32
+
33
+ system_name = platform.system().lower()
34
+ if system_name == "windows":
35
+ system = "windows"
36
+ elif system_name in {"linux", "darwin"}:
37
+ system = "linux"
38
+ else:
39
+ raise NotImplementedError(f"System {system_name} not supported")
40
+
41
+ match which:
42
+ case "scripts":
43
+ source = LIBRARY_ROOT.joinpath("scripts", system)
44
+ target = CONFIG_ROOT.joinpath("scripts")
45
+
46
+ wrap_mcfg_source = LIBRARY_ROOT.joinpath("scripts", "nu", "wrap_mcfg.nu")
47
+ wrap_mcfg_target = CONFIG_ROOT.joinpath("scripts", "wrap_mcfg.nu")
48
+ wrap_mcfg_target.parent.mkdir(parents=True, exist_ok=True)
49
+ _copy_path(source=wrap_mcfg_source, target=wrap_mcfg_target, overwrite=True)
50
+ case "settings":
51
+ source = LIBRARY_ROOT.joinpath("settings")
52
+ target = CONFIG_ROOT.joinpath("settings")
53
+
54
+ _copy_path(source=source, target=target, overwrite=True)
55
+
56
+ if system_name == "linux" and which == "scripts":
57
+ from rich.console import Console
58
+ console = Console()
59
+ console.print("\n[bold]📜 Setting executable permissions for scripts...[/bold]")
60
+ scripts_path = CONFIG_ROOT.joinpath("scripts")
61
+ subprocess.run(f"chmod +x {scripts_path} -R", shell=True, capture_output=True, text=True, check=False)
62
+ console.print("[green]✅ Script permissions updated[/green]")
63
+
64
+ home_dir = Path.home()
65
+ if system_name == "windows":
66
+ yazi_plugins_dir = home_dir.joinpath("AppData", "Roaming", "yazi", "config")
67
+ else:
68
+ yazi_plugins_dir = home_dir.joinpath(".config", "yazi")
69
+
70
+ yazi_plugins_path = yazi_plugins_dir.joinpath("plugins")
71
+ if not yazi_plugins_path.exists():
72
+ yazi_plugins_dir.mkdir(parents=True, exist_ok=True)
73
+ import git
74
+ git.Repo.clone_from("https://github.com/yazi-rs/plugins", yazi_plugins_path)
@@ -0,0 +1,288 @@
1
+ """
2
+ This script Takes away all config files from the computer, place them in one directory
3
+ `dotfiles`, and create symlinks to those files from thier original locations.
4
+
5
+ """
6
+
7
+ from machineconfig.utils.links import OperationRecord
8
+ from rich.console import Console
9
+ from rich.panel import Panel
10
+ from rich.pretty import Pretty
11
+ from rich.text import Text
12
+ from rich.table import Table
13
+
14
+ from machineconfig.utils.path_extended import PathExtended
15
+ from machineconfig.utils.links import symlink_map, copy_map
16
+ from machineconfig.profile.create_links_export import ON_CONFLICT_STRICT
17
+ from machineconfig.utils.source_of_truth import LIBRARY_ROOT, CONFIG_ROOT
18
+
19
+ import platform
20
+ import subprocess
21
+ import tomllib
22
+ from typing import Optional, Any, TypedDict, Literal
23
+
24
+
25
+ system = platform.system() # Linux or Windows
26
+ ERROR_LIST: list[Any] = [] # append to this after every exception captured.
27
+ SYSTEM = system.lower()
28
+
29
+ console = Console()
30
+
31
+
32
+ class Base(TypedDict):
33
+ this: str
34
+ to_this: str
35
+ contents: Optional[bool]
36
+ copy: Optional[bool]
37
+ class ConfigMapper(TypedDict):
38
+ file_name: str
39
+ config_file_default_path: str
40
+ self_managed_config_file_path: str
41
+ contents: Optional[bool]
42
+ copy: Optional[bool]
43
+ class MapperFileData(TypedDict):
44
+ public: dict[str, list[ConfigMapper]]
45
+ private: dict[str, list[ConfigMapper]]
46
+ def read_mapper() -> MapperFileData:
47
+ mapper_data: dict[str, dict[str, Base]] = tomllib.loads(LIBRARY_ROOT.joinpath("profile/mapper.toml").read_text(encoding="utf-8"))
48
+ public: dict[str, list[ConfigMapper]] = {}
49
+ private: dict[str, list[ConfigMapper]] = {}
50
+ # def get_other_systems(current_system: str) -> list[str]:
51
+ # all_systems = ["linux", "windows", "darwin"]
52
+ # return [s for s in all_systems if s != current_system.lower()]
53
+ # OTHER_SYSTEMS = get_other_systems(SYSTEM)
54
+ for program_key, program_map in mapper_data.items():
55
+ parts = program_key.split("_")
56
+ if len(parts) > 1:
57
+ if parts[-1].lower() == "windows" and SYSTEM != "windows":
58
+ # console.print(f"Skipping Windows-only program mapping: {program_key}")
59
+ continue
60
+ elif parts[-1].lower() == "linux" and SYSTEM == "windows":
61
+ # console.print(f"Skipping Linux-only program mapping: {program_key}")
62
+ continue
63
+ for file_name, file_base in program_map.items():
64
+ file_map: ConfigMapper = {
65
+ "file_name": file_name,
66
+ "config_file_default_path": file_base["this"],
67
+ "self_managed_config_file_path": file_base["to_this"],
68
+ "contents": file_base.get("contents"),
69
+ "copy": file_base.get("copy"),
70
+ }
71
+ if "CONFIG_ROOT" in file_map["self_managed_config_file_path"]:
72
+ if program_key not in public:
73
+ public[program_key] = []
74
+ public[program_key].append(file_map)
75
+ else:
76
+ if program_key not in private:
77
+ private[program_key] = []
78
+ private[program_key].append(file_map)
79
+ return {"public": public, "private": private}
80
+
81
+
82
+ def apply_mapper(mapper_data: dict[str, list[ConfigMapper]],
83
+ on_conflict: ON_CONFLICT_STRICT,
84
+ method: Literal["symlink", "copy"]
85
+ ):
86
+ operation_records: list[OperationRecord] = []
87
+ print(f"Working with {len(mapper_data)} programs from mapper data.")
88
+ if len(mapper_data) == 1:
89
+ print(mapper_data)
90
+ import os
91
+ if os.name == "nt":
92
+ import ctypes
93
+ try:
94
+ is_admin = ctypes.windll.shell32.IsUserAnAdmin()
95
+ except Exception:
96
+ is_admin = False
97
+ total_length = sum(len(item) for item in mapper_data.values())
98
+ if not is_admin and method == "symlink" and total_length > 5:
99
+ warning_body = "\n".join([
100
+ "[bold yellow]Administrator privileges required[/]",
101
+ "Run the terminal as admin and try again to avoid repeated elevation prompts.",
102
+ ])
103
+ console.print(
104
+ Panel.fit(
105
+ warning_body,
106
+ title="⚠️ Permission Needed",
107
+ border_style="yellow",
108
+ padding=(1, 2),
109
+ )
110
+ )
111
+ raise RuntimeError("Run terminal as admin and try again, otherwise, there will be too many popups for admin requests and no chance to terminate the program.")
112
+ for program_name, program_files in mapper_data.items():
113
+ console.rule(f"🔄 Processing [bold]{program_name}[/] symlinks", style="cyan")
114
+ for a_mapper in program_files:
115
+ config_file_default_path = PathExtended(a_mapper["config_file_default_path"])
116
+ self_managed_config_file_path = PathExtended(a_mapper["self_managed_config_file_path"].replace("CONFIG_ROOT", CONFIG_ROOT.as_posix()))
117
+ # Determine whether to use copy or symlink
118
+ use_copy = method == "copy" or a_mapper.get("copy", False)
119
+ if "contents" in a_mapper and a_mapper["contents"]:
120
+ targets = list(self_managed_config_file_path.expanduser().search("*"))
121
+ for a_target in targets:
122
+ operation_type = "contents_copy" if use_copy else "contents_symlink"
123
+ try:
124
+ if use_copy:
125
+ result = copy_map(config_file_default_path=config_file_default_path.joinpath(a_target.name), self_managed_config_file_path=a_target, on_conflict=on_conflict)
126
+ else:
127
+ result = symlink_map(config_file_default_path=config_file_default_path.joinpath(a_target.name), self_managed_config_file_path=a_target, on_conflict=on_conflict)
128
+ operation_records.append({
129
+ "program": program_name,
130
+ "file_key": a_mapper["file_name"],
131
+ "defaultPath": str(config_file_default_path.joinpath(a_target.name)),
132
+ "selfManaged": str(a_target),
133
+ "operation": operation_type,
134
+ "action": result["action"],
135
+ "details": result["details"],
136
+ "status": "success"
137
+ })
138
+ except ValueError as ex:
139
+ if "resolve to the same location" in str(ex):
140
+ operation_records.append({
141
+ "program": program_name,
142
+ "file_key": a_mapper["file_name"],
143
+ "defaultPath": str(config_file_default_path.joinpath(a_target.name)),
144
+ "selfManaged": str(a_target),
145
+ "operation": operation_type,
146
+ "action": "already_linked",
147
+ "details": "defaultPath and selfManaged resolve to same location - already correctly configured",
148
+ "status": "success"
149
+ })
150
+ else:
151
+ raise
152
+ except Exception as ex:
153
+ console.print(f"❌ [red]Config error[/red]: {program_name} | {a_mapper['file_name']} | {a_target.name}. {ex}")
154
+ operation_records.append({
155
+ "program": program_name,
156
+ "file_key": a_mapper["file_name"],
157
+ "defaultPath": str(config_file_default_path.joinpath(a_target.name)),
158
+ "selfManaged": str(a_target),
159
+ "operation": operation_type,
160
+ "action": "error",
161
+ "details": f"Failed to process contents: {str(ex)}",
162
+ "status": f"error: {str(ex)}"
163
+ })
164
+ else:
165
+ operation_type = "copy" if use_copy else "symlink"
166
+ try:
167
+ if use_copy:
168
+ result = copy_map(config_file_default_path=config_file_default_path, self_managed_config_file_path=self_managed_config_file_path, on_conflict=on_conflict)
169
+ else:
170
+ result = symlink_map(config_file_default_path=config_file_default_path, self_managed_config_file_path=self_managed_config_file_path, on_conflict=on_conflict)
171
+ operation_records.append({
172
+ "program": program_name,
173
+ "file_key": a_mapper["file_name"],
174
+ "defaultPath": str(config_file_default_path),
175
+ "selfManaged": str(self_managed_config_file_path),
176
+ "operation": operation_type,
177
+ "action": result["action"],
178
+ "details": result["details"],
179
+ "status": "success"
180
+ })
181
+ except ValueError as ex:
182
+ if "resolve to the same location" in str(ex):
183
+ operation_records.append({
184
+ "program": program_name,
185
+ "file_key": a_mapper["file_name"],
186
+ "defaultPath": str(config_file_default_path),
187
+ "selfManaged": str(self_managed_config_file_path),
188
+ "operation": operation_type,
189
+ "action": "already_linked",
190
+ "details": "defaultPath and selfManaged resolve to same location - already correctly configured",
191
+ "status": "success"
192
+ })
193
+ else:
194
+ raise
195
+ except Exception as ex:
196
+ console.print(f"❌ [red]Config error[/red]: {program_name} | {a_mapper['file_name']} | {ex}")
197
+ operation_records.append({
198
+ "program": program_name,
199
+ "file_key": a_mapper["file_name"],
200
+ "defaultPath": str(config_file_default_path),
201
+ "selfManaged": str(self_managed_config_file_path),
202
+ "operation": operation_type,
203
+ "action": "error",
204
+ "details": f"Failed to create {operation_type}: {str(ex)}",
205
+ "status": f"error: {str(ex)}"
206
+ })
207
+
208
+ if program_name == "ssh" and system == "Linux": # permissions of ~/dotfiles/.ssh should be adjusted
209
+ try:
210
+ console.print("\n[bold]🔒 Setting secure permissions for SSH files...[/bold]")
211
+ subprocess.run("chmod 700 $HOME/.ssh/", shell=True, check=True)
212
+ subprocess.run("chmod 700 $HOME/dotfiles/creds/.ssh/", shell=True, check=True)
213
+ subprocess.run("chmod 600 $HOME/dotfiles/creds/.ssh/*", shell=True, check=True)
214
+ subprocess.run("chmod 600 $HOME/.ssh/*", shell=True, check=True)
215
+ console.print("[green]✅ SSH permissions set successfully[/green]")
216
+ except Exception as e:
217
+ ERROR_LIST.append(e)
218
+ console.print(f"❌ [red]Error setting SSH permissions[/red]: {e}")
219
+
220
+ # Display operation summary table
221
+ if operation_records:
222
+ table = Table(title="🔗 Symlink Operations Summary", show_header=True, header_style="bold magenta")
223
+ table.add_column("Program", style="cyan", no_wrap=True)
224
+ table.add_column("File Key", style="blue", no_wrap=True)
225
+ table.add_column("Default Path", style="green")
226
+ table.add_column("Self Managed", style="yellow")
227
+ table.add_column("Operation", style="magenta", no_wrap=True)
228
+ table.add_column("Action", style="red", no_wrap=True)
229
+ table.add_column("Details", style="white")
230
+ table.add_column("Status", style="red", no_wrap=True)
231
+
232
+ for record in operation_records:
233
+ status_style = "green" if record["status"] == "success" else "red"
234
+ action_style = "green" if record["action"] != "error" else "red"
235
+ table.add_row(
236
+ record["program"],
237
+ record["file_key"],
238
+ record["defaultPath"],
239
+ record["selfManaged"],
240
+ record["operation"],
241
+ f"[{action_style}]{record['action']}[/{action_style}]",
242
+ record["details"],
243
+ f"[{status_style}]{record['status']}[/{status_style}]"
244
+ )
245
+
246
+ console.print("\n")
247
+ console.print(table)
248
+
249
+ # Export operation records to CSV
250
+ import csv
251
+ from datetime import datetime
252
+
253
+ csv_dir = PathExtended(CONFIG_ROOT).joinpath("symlink_operations")
254
+ csv_dir.mkdir(parents=True, exist_ok=True)
255
+
256
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
257
+ csv_filename = f"symlink_operations_{timestamp}.csv"
258
+ csv_path = csv_dir.joinpath(csv_filename)
259
+
260
+ with open(csv_path, "w", newline="", encoding="utf-8") as csvfile:
261
+ fieldnames = ["program", "file_key", "defaultPath", "selfManaged", "operation", "action", "details", "status"]
262
+ writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
263
+ writer.writeheader()
264
+ writer.writerows(operation_records)
265
+
266
+ console.print(f"\n[bold green]📊 Operations exported to CSV:[/bold green] [cyan]{csv_path}[/cyan]")
267
+
268
+ if len(ERROR_LIST) > 0:
269
+ console.print(
270
+ Panel(
271
+ Pretty(ERROR_LIST),
272
+ title="❗ Errors Encountered During Processing",
273
+ border_style="red",
274
+ padding=(1, 2),
275
+ )
276
+ )
277
+ else:
278
+ console.print(
279
+ Panel.fit(
280
+ Text("✅ All symlinks created successfully!", justify="center"),
281
+ title="Symlink Creation Complete",
282
+ border_style="green",
283
+ )
284
+ )
285
+
286
+
287
+ if __name__ == "__main__":
288
+ pass