machineconfig 5.15__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 (389) 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 +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,89 @@
1
+
2
+ """Like yadm and dotter."""
3
+
4
+ from machineconfig.profile.create_links_export import ON_CONFLICT_LOOSE, ON_CONFLICT_MAPPER
5
+ from typing import Annotated, Literal
6
+ import typer
7
+
8
+
9
+
10
+ def main(
11
+ file: Annotated[str, typer.Argument(help="file/folder path.")],
12
+ method: Annotated[Literal["symlink", "s", "copy", "c"], typer.Option(..., "--method", "-m", help="Method to use for linking files")] = "copy",
13
+ on_conflict: Annotated[ON_CONFLICT_LOOSE, typer.Option(..., "--on-conflict", "-o", help="Action to take on conflict")] = "throw-error",
14
+ sensitivity: Annotated[Literal["private", "v", "public", "b"], typer.Option(..., "--sensitivity", "-s", help="Sensitivity of the config file.")] = "private",
15
+ destination: Annotated[str, typer.Option("--destination", "-d", help="destination folder (override the default, use at your own risk)")] = "",
16
+ shared: Annotated[bool, typer.Option("--shared", "-sh", help="Whether the config file is shared across destinations directory.")] = False,
17
+ ) -> None:
18
+ from rich.console import Console
19
+ from rich.panel import Panel
20
+ from machineconfig.utils.links import symlink_map, copy_map
21
+ from pathlib import Path
22
+ match sensitivity:
23
+ case "private" | "v":
24
+ backup_root = Path.home().joinpath("dotfiles/mapper")
25
+ case "public" | "b":
26
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
27
+ backup_root = Path(CONFIG_ROOT).joinpath("dotfiles/mapper")
28
+
29
+ console = Console()
30
+ orig_path = Path(file).expanduser().absolute()
31
+ if destination == "":
32
+ if shared:
33
+ new_path = backup_root.joinpath("shared").joinpath(orig_path.name)
34
+ new_path.parent.mkdir(parents=True, exist_ok=True)
35
+ else:
36
+ new_path = backup_root.joinpath(orig_path.relative_to(Path.home()))
37
+ new_path.parent.mkdir(parents=True, exist_ok=True)
38
+ else:
39
+ if shared:
40
+ dest_path = Path(destination).expanduser().absolute()
41
+ dest_path.mkdir(parents=True, exist_ok=True)
42
+ new_path = dest_path.joinpath("shared").joinpath(orig_path.name)
43
+ new_path.parent.mkdir(parents=True, exist_ok=True)
44
+ else:
45
+ dest_path = Path(destination).expanduser().absolute()
46
+ dest_path.mkdir(parents=True, exist_ok=True)
47
+ new_path = dest_path.joinpath(orig_path.name)
48
+ match method:
49
+ case "copy" | "c":
50
+ try:
51
+ copy_map(config_file_default_path=orig_path, self_managed_config_file_path=new_path, on_conflict=ON_CONFLICT_MAPPER[on_conflict]) # type: ignore[arg-type]
52
+ except Exception as e:
53
+ typer.echo(f"[red]Error:[/] {e}")
54
+ typer.Exit(code=1)
55
+ return
56
+ case "symlink" | "s":
57
+ try:
58
+ symlink_map(config_file_default_path=orig_path, self_managed_config_file_path=new_path, on_conflict=ON_CONFLICT_MAPPER[on_conflict]) # type: ignore[arg-type]
59
+ except Exception as e:
60
+ typer.echo(f"[red]Error:[/] {e}")
61
+ typer.Exit(code=1)
62
+ case _:
63
+ raise ValueError(f"Unknown method: {method}")
64
+ console.print(Panel("\n".join(["✅ Symbolic link created successfully!", "🔄 Add the following snippet to mapper.toml to persist this mapping:",]), title="Symlink Created", border_style="green", padding=(1, 2),))
65
+
66
+ # mapper_snippet = "\n".join(
67
+ # [
68
+ # f"[bold]📝 Edit configuration file:[/] [cyan]nano {Path(CONFIG_ROOT)}/symlinks/mapper.toml[/cyan]",
69
+ # "",
70
+ # f"[{new_path.parent.name}]",
71
+ # f"{orig_path.name.split('.')[0]} = {{ this = '{orig_path.as_posix()}', to_this = '{new_path.as_posix()}' }}",
72
+ # ]
73
+ # )
74
+ # console.print(
75
+ # Panel(
76
+ # mapper_snippet,
77
+ # title="Mapper Entry",
78
+ # border_style="cyan",
79
+ # padding=(1, 2),
80
+ # )
81
+ # )
82
+
83
+
84
+ def arg_parser() -> None:
85
+ typer.run(main)
86
+
87
+
88
+ if __name__ == "__main__":
89
+ arg_parser()
@@ -0,0 +1,25 @@
1
+
2
+ import typer
3
+ from typing import Annotated, Optional
4
+
5
+ def backup(cloud: Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Cloud configuration name (rclone config name)")] = None,
6
+ which: Annotated[Optional[str], typer.Option("--which", "-w", help="📝 Comma-separated list of items to BACKUP (from backup.toml), or 'all' for all items")] = None):
7
+ """💾 BACKUP"""
8
+ from machineconfig.scripts.python.helpers_devops.devops_backup_retrieve import main_backup_retrieve
9
+ main_backup_retrieve(direction="BACKUP", which=which, cloud=cloud)
10
+
11
+
12
+ def retrieve(cloud: Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Cloud configuration name (rclone config name)")] = None,
13
+ which: Annotated[Optional[str], typer.Option("--which", "-w", help="📝 Comma-separated list of items to RETRIEVE (from backup.toml), or 'all' for all items")] = None):
14
+ """📥 RETRIEVE"""
15
+ from machineconfig.scripts.python.helpers_devops.devops_backup_retrieve import main_backup_retrieve
16
+ main_backup_retrieve(direction="RETRIEVE", which=which, cloud=cloud)
17
+
18
+
19
+ def get_app() -> typer.Typer:
20
+ app = typer.Typer(name="data", help="💾 [d] Backup and Retrieve configuration files and directories to/from cloud storage using rclone.", no_args_is_help=True)
21
+ app.command(name="backup", no_args_is_help=True, hidden=False, help="💾 [b] Backup files and directories to cloud storage using rclone.")(backup)
22
+ app.command(name="b", no_args_is_help=True, hidden=True,)(backup)
23
+ app.command(name="retrieve", no_args_is_help=True, hidden=False, help="📥 [r] Retrieve files and directories from cloud storage using rclone.")(retrieve)
24
+ app.command(name="r", no_args_is_help=True, hidden=True, )(retrieve)
25
+ return app
@@ -0,0 +1,134 @@
1
+
2
+ import machineconfig.scripts.python.helpers_devops.cli_share_file
3
+ import machineconfig.scripts.python.helpers_devops.cli_terminal as cli_terminal
4
+ import machineconfig.scripts.python.helpers_devops.cli_share_server as cli_share_server
5
+ import typer
6
+ from typing import Optional, Annotated
7
+
8
+
9
+
10
+ def install_ssh_server():
11
+ """📡 SSH install server"""
12
+ import platform
13
+ if platform.system() == "Windows":
14
+ from machineconfig.setup_windows import SSH_SERVER
15
+ elif platform.system() == "Linux" or platform.system() == "Darwin":
16
+ from machineconfig.setup_linux import SSH_SERVER
17
+ else:
18
+ raise NotImplementedError(f"Platform {platform.system()} is not supported.")
19
+ from machineconfig.utils.code import run_shell_script
20
+ run_shell_script(script=SSH_SERVER.read_text(encoding="utf-8"))
21
+
22
+
23
+ def add_ssh_key(path: Annotated[Optional[str], typer.Option(..., help="Path to the public key file")] = None,
24
+ choose: Annotated[bool, typer.Option(..., "--choose", "-c", help="Choose from available public keys in ~/.ssh/*.pub")] = False,
25
+ value: Annotated[bool, typer.Option(..., "--value", "-v", help="Paste the public key content manually")] = False,
26
+ github: Annotated[Optional[str], typer.Option(..., "--github", "-g", help="Fetch public keys from a GitHub username")] = None
27
+ ):
28
+ """🔑 SSH add pub key to this machine so its accessible by owner of corresponding private key."""
29
+ import machineconfig.scripts.python.nw.devops_add_ssh_key as helper
30
+ helper.main(pub_path=path, pub_choose=choose, pub_val=value, from_github=github)
31
+ def add_ssh_identity():
32
+ """🗝️ SSH add identity (private key) to this machine"""
33
+ import machineconfig.scripts.python.nw.devops_add_identity as helper
34
+ helper.main()
35
+
36
+
37
+ def show_address():
38
+ import socket
39
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
40
+ s.connect(('8.8.8.8',80))
41
+ local_ip_v4 = s.getsockname()[0]
42
+ s.close()
43
+ print(f"This computer is @ {local_ip_v4}")
44
+
45
+
46
+ def debug_ssh():
47
+ """🐛 SSH debug"""
48
+ from platform import system
49
+ if system() == "Linux" or system() == "Darwin":
50
+ import machineconfig.scripts.python.nw.ssh_debug_linux as helper
51
+ helper.ssh_debug_linux()
52
+ elif system() == "Windows":
53
+ import machineconfig.scripts.python.nw.ssh_debug_windows as helper
54
+ helper.ssh_debug_windows()
55
+ else:
56
+ raise NotImplementedError(f"Platform {system()} is not supported.")
57
+
58
+ def wifi_select(
59
+ ssid: Annotated[str, typer.Option("-n", "--ssid", help="🔗 SSID of WiFi (from config)")] = "MyPhoneHotSpot",
60
+ manual: Annotated[bool, typer.Option("-m", "--manual", help="🔍 Manual network selection mode")] = False,
61
+ list_: Annotated[bool, typer.Option("-l", "--list", help="📡 List available networks only")] = False,
62
+ ) -> None:
63
+ """Main function with fallback network selection"""
64
+ from rich.panel import Panel
65
+ from rich.prompt import Confirm
66
+ from rich.console import Console
67
+ from machineconfig.scripts.python.nw.wifi_conn import try_config_connection, manual_network_selection, display_available_networks
68
+ console = Console()
69
+ console.print(Panel("📶 Welcome to the WiFi Connector Tool", title="[bold blue]WiFi Connection[/bold blue]", border_style="blue"))
70
+
71
+ # If user just wants to list networks
72
+ if list_:
73
+ display_available_networks()
74
+ return
75
+
76
+ # If user wants manual mode, skip config and go straight to selection
77
+ if manual:
78
+ console.print("[blue]🔍 Manual network selection mode[/blue]")
79
+ if manual_network_selection():
80
+ console.print("[green]🎉 Successfully connected![/green]")
81
+ else:
82
+ console.print("[red]❌ Failed to connect[/red]")
83
+ return
84
+
85
+ # Try to connect using configuration first
86
+ console.print(f"[blue]🔍 Attempting to connect to configured network: {ssid}[/blue]")
87
+
88
+ if try_config_connection(ssid):
89
+ console.print("[green]🎉 Successfully connected using configuration![/green]")
90
+ return
91
+
92
+ # Configuration failed, offer fallback options
93
+ console.print("\n[yellow]⚠️ Configuration connection failed or not available[/yellow]")
94
+
95
+ if Confirm.ask("[blue]Would you like to manually select a network?[/blue]", default=True):
96
+ if manual_network_selection():
97
+ console.print("[green]🎉 Successfully connected![/green]")
98
+ else:
99
+ console.print("[red]❌ Failed to connect[/red]")
100
+ else:
101
+ console.print("[blue]👋 Goodbye![/blue]")
102
+
103
+
104
+ def get_app():
105
+ nw_apps = typer.Typer(help="🔐 [n] Network subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
106
+ nw_apps.command(name="share-terminal", help="📡 [t] Share terminal via web browser")(cli_terminal.main)
107
+ nw_apps.command(name="t", help="Share terminal via web browser", hidden=True)(cli_terminal.main)
108
+
109
+ nw_apps.command(name="share-server", help="🌐 [s] Start local/global server to share files/folders via web browser", no_args_is_help=True)(cli_share_server.web_file_explorer)
110
+ nw_apps.command(name="s", help="Start local/global server to share files/folders via web browser", hidden=True, no_args_is_help=True)(cli_share_server.web_file_explorer)
111
+
112
+ # app = cli_share_server.get_share_file_app()
113
+ # nw_apps.add_typer(app, name="share-file", help="📁 [f] Share a file via relay server", no_args_is_help=True)
114
+ # nw_apps.add_typer(app, name="f", help="Share a file via relay server", hidden=True, no_args_is_help=True)
115
+ nw_apps.command(name="send", no_args_is_help=True, hidden=False, help="📁 [sx] send files from here.")(machineconfig.scripts.python.helpers_devops.cli_share_file.share_file_send)
116
+ nw_apps.command(name="sx", no_args_is_help=True, hidden=True, help="📁 [sx] send files from here.")(machineconfig.scripts.python.helpers_devops.cli_share_file.share_file_send)
117
+ nw_apps.command(name="receive", no_args_is_help=True, hidden=False, help="📁 [rx] receive files to here.")(machineconfig.scripts.python.helpers_devops.cli_share_file.share_file_receive)
118
+ nw_apps.command(name="rx", no_args_is_help=True, hidden=True, help="📁 [rx] receive files to here.")(machineconfig.scripts.python.helpers_devops.cli_share_file.share_file_receive)
119
+
120
+ nw_apps.command(name="install-ssh-server", help="📡 [i] Install SSH server")(install_ssh_server)
121
+ nw_apps.command(name="i", help="Install SSH server", hidden=True)(install_ssh_server)
122
+ nw_apps.command(name="add-ssh-key", help="🔑 [k] Add SSH public key to this machine", no_args_is_help=True)(add_ssh_key)
123
+ nw_apps.command(name="k", help="Add SSH public key to this machine", hidden=True, no_args_is_help=True)(add_ssh_key)
124
+ nw_apps.command(name="add-ssh-identity", help="🗝️ [A] Add SSH identity (private key) to this machine")(add_ssh_identity)
125
+ nw_apps.command(name="A", help="Add SSH identity (private key) to this machine", hidden=True)(add_ssh_identity)
126
+ nw_apps.command(name="show-address", help="📌 [a] Show this computer addresses on network")(show_address)
127
+ nw_apps.command(name="a", help="Show this computer addresses on network", hidden=True)(show_address)
128
+ nw_apps.command(name="debug-ssh", help="🐛 [d] Debug SSH connection")(debug_ssh)
129
+ nw_apps.command(name="d", help="Debug SSH connection", hidden=True)(debug_ssh)
130
+
131
+ nw_apps.command(name="wifi-select", no_args_is_help=True, help="📶 WiFi connection utility.")(wifi_select)
132
+ nw_apps.command(name="w", no_args_is_help=True, hidden=True)(wifi_select)
133
+
134
+ return nw_apps
@@ -0,0 +1,182 @@
1
+ """Repos CLI powered by Typer.
2
+
3
+ # TODO use gh api user --jq '.login' to get the username and use it to clone the repos.
4
+ in the event that username@github.com is not mentioned in the remote url.
5
+
6
+ """
7
+
8
+ from pathlib import Path
9
+ from typing import Annotated, Optional
10
+ import typer
11
+ from machineconfig.scripts.python.helpers_repos.cloud_repo_sync import main as secure_repo_main
12
+
13
+
14
+ DirectoryArgument = Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")]
15
+ RecursiveOption = Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")]
16
+ UVsyncOption = Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")]
17
+ CloudOption = Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Upload to or download from this cloud remote.")]
18
+
19
+
20
+ def push(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
21
+ """🚀 Push changes across repositories."""
22
+ from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
23
+ git_operations(directory, pull=False, commit=False, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
24
+
25
+
26
+ def pull(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
27
+ """⬇️ Pull changes across repositories."""
28
+ from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
29
+
30
+ git_operations(directory, pull=True, commit=False, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
31
+
32
+
33
+ def commit(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
34
+ """💾 Commit changes across repositories."""
35
+ from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
36
+ git_operations(directory, pull=False, commit=True, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
37
+
38
+
39
+ def sync(directory: DirectoryArgument = None, recursive: RecursiveOption = False, auto_uv_sync: UVsyncOption = False) -> None:
40
+ """🔄 Pull, commit, and push changes across repositories."""
41
+ from machineconfig.scripts.python.helpers_repos.entrypoint import git_operations
42
+ git_operations(directory, pull=True, commit=True, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
43
+
44
+
45
+ def capture(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
46
+ """📝 Record repositories into a repos.json specification."""
47
+ from machineconfig.scripts.python.helpers_repos.entrypoint import resolve_directory
48
+ repos_root = resolve_directory(directory)
49
+ from machineconfig.scripts.python.helpers_repos.record import main_record as record_repos
50
+ save_path = record_repos(repos_root=repos_root)
51
+ from machineconfig.utils.path_extended import PathExtended
52
+ if cloud is not None:
53
+ PathExtended(save_path).to_cloud(rel2home=True, cloud=cloud)
54
+
55
+
56
+ def clone(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
57
+ """📥 Clone repositories described by a repos.json specification."""
58
+ from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
59
+ clone_from_specs(directory, cloud, checkout_branch_flag=False, checkout_commit_flag=False)
60
+
61
+
62
+ def checkout_command(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
63
+ """🔀 Check out specific commits listed in the specification."""
64
+ from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
65
+ clone_from_specs(directory, cloud, checkout_branch_flag=False, checkout_commit_flag=True)
66
+
67
+
68
+ def checkout_to_branch_command(directory: DirectoryArgument = None, cloud: CloudOption = None) -> None:
69
+ """🔀 Check out to the main branch defined in the specification."""
70
+ from machineconfig.scripts.python.helpers_repos.entrypoint import clone_from_specs
71
+ clone_from_specs(directory, cloud, checkout_branch_flag=True, checkout_commit_flag=False)
72
+
73
+
74
+ def analyze(directory: DirectoryArgument = None) -> None:
75
+ """📊 Analyze repository development over time."""
76
+ repo_path = directory if directory is not None else "."
77
+ from machineconfig.scripts.python.helpers_repos.count_lines_frontend import analyze_repo_development
78
+ analyze_repo_development(repo_path=repo_path)
79
+
80
+
81
+ def viz(
82
+ repo: Annotated[str, typer.Option(..., "--repo", "-r", help="Path to git repository to visualize")] = ".",
83
+ output_file: Annotated[Optional[Path], typer.Option(..., "--output", "-o", help="Output video file (e.g., output.mp4). If specified, gource will render to video.")] = None,
84
+ resolution: Annotated[str, typer.Option(..., "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)")] = "1920x1080",
85
+ seconds_per_day: Annotated[float, typer.Option(..., "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)")] = 0.1,
86
+ auto_skip_seconds: Annotated[float, typer.Option(..., "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds")] = 1.0,
87
+ title: Annotated[Optional[str], typer.Option(..., "--title", "-t", help="Title for the visualization")] = None,
88
+ hide_items: Annotated[list[str], typer.Option(..., "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames")] = [],
89
+ key_items: Annotated[bool, typer.Option(..., "--key", "-k", help="Show file extension key")] = False,
90
+ fullscreen: Annotated[bool, typer.Option(..., "--fullscreen", "-f", help="Run in fullscreen mode")] = False,
91
+ viewport: Annotated[Optional[str], typer.Option(..., "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')")] = None,
92
+ start_date: Annotated[Optional[str], typer.Option(..., "--start-date", help="Start date (YYYY-MM-DD)")] = None,
93
+ stop_date: Annotated[Optional[str], typer.Option(..., "--stop-date", help="Stop date (YYYY-MM-DD)")] = None,
94
+ user_image_dir: Annotated[Optional[Path], typer.Option(..., "--user-image-dir", help="Directory with user avatar images")] = None,
95
+ max_files: Annotated[int, typer.Option(..., "--max-files", help="Maximum number of files to show (0 = no limit)")] = 0,
96
+ max_file_lag: Annotated[float, typer.Option(..., "--max-file-lag", help="Max time files remain on screen after last change")] = 5.0,
97
+ file_idle_time: Annotated[int, typer.Option(..., "--file-idle-time", help="Time in seconds files remain idle before being removed")] = 0,
98
+ framerate: Annotated[int, typer.Option(..., "--framerate", help="Frames per second for video output")] = 60,
99
+ background_color: Annotated[str, typer.Option(..., "--background-color", help="Background color in hex (e.g., 000000 for black)")] = "000000",
100
+ font_size: Annotated[int, typer.Option(..., "--font-size", help="Font size")] = 22,
101
+ camera_mode: Annotated[str, typer.Option(..., "--camera-mode", help="Camera mode: overview or track")] = "overview",
102
+ ) -> None:
103
+ """🎬 Visualize repository activity using Gource."""
104
+ from machineconfig.scripts.python.helpers_repos.grource import visualize
105
+ visualize(repo=repo, output_file=output_file, resolution=resolution, seconds_per_day=seconds_per_day,
106
+ auto_skip_seconds=auto_skip_seconds, title=title, hide_items=hide_items, key_items=key_items,
107
+ fullscreen=fullscreen, viewport=viewport, start_date=start_date, stop_date=stop_date,
108
+ user_image_dir=user_image_dir, max_files=max_files, max_file_lag=max_file_lag,
109
+ file_idle_time=file_idle_time, framerate=framerate, background_color=background_color,
110
+ font_size=font_size, camera_mode=camera_mode)
111
+
112
+
113
+ def cleanup(repo: DirectoryArgument = None, recursive: RecursiveOption = False) -> None:
114
+ """🧹 Clean repository directories from cache files."""
115
+ if repo is None:
116
+ repo = Path.cwd().as_posix()
117
+
118
+ arg_path = Path(repo).expanduser().absolute()
119
+ from git import Repo, InvalidGitRepositoryError
120
+ if not recursive:
121
+ # Check if the directory is a git repo
122
+ try:
123
+ Repo(str(arg_path), search_parent_directories=False)
124
+ except InvalidGitRepositoryError:
125
+ typer.echo(f"❌ {arg_path} is not a git repository. Use -r flag for recursive cleanup.")
126
+ return
127
+ # Run cleanup on this repo
128
+ repos_to_clean = [arg_path]
129
+ else:
130
+ # Find all git repos recursively under the directory
131
+ git_dirs = list(arg_path.rglob('.git'))
132
+ repos_to_clean = [git_dir.parent for git_dir in git_dirs if git_dir.is_dir()]
133
+ if not repos_to_clean:
134
+ typer.echo(f"❌ No git repositories found under {arg_path}")
135
+ return
136
+
137
+ for repo_path in repos_to_clean:
138
+ typer.echo(f"🧹 Cleaning {repo_path}")
139
+ script = fr"""
140
+ cd "{repo_path}"
141
+ uv run --with cleanpy cleanpy .
142
+ # mcinit .
143
+ # find "." -type f \( -name "*.py" -o -name "*.md" -o -name "*.json" \) -not -path "*/\.*" -not -path "*/__pycache__/*" -print0 | xargs -0 sed -i 's/[[:space:]]*$//'
144
+ """
145
+ from machineconfig.utils.code import run_shell_script
146
+ run_shell_script(script)
147
+
148
+
149
+ def get_app():
150
+ repos_apps = typer.Typer(help="📁 [r] Manage development repositories", no_args_is_help=True, add_help_option=False, add_completion=False)
151
+ mirror_app = typer.Typer(help="🔄 [m] Manage repository specifications and syncing", no_args_is_help=True, add_help_option=False, add_completion=False)
152
+ repos_apps.add_typer(mirror_app, name="mirror", help="🔄 [m] mirror repositories using saved specs")
153
+ repos_apps.add_typer(mirror_app, name="m", help="mirror repositories using saved specs", hidden=True)
154
+
155
+ repos_apps.command(name="push", help="🚀 [p] Push changes across repositories")(push)
156
+ repos_apps.command(name="p", help="Push changes across repositories", hidden=True)(push)
157
+ repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
158
+ repos_apps.command(name="P", help="Pull changes across repositories", hidden=True)(pull)
159
+ repos_apps.command(name="commit", help="💾 [c] Commit changes across repositories")(commit)
160
+ repos_apps.command(name="c", help="Commit changes across repositories", hidden=True)(commit)
161
+ repos_apps.command(name="sync", help="🔄 [y] Pull, commit, and push changes across repositories")(sync)
162
+ repos_apps.command(name="s", help="Pull, commit, and push changes across repositories", hidden=True)(sync)
163
+ repos_apps.command(name="analyze", help="📊 [a] Analyze repository development over time")(analyze)
164
+ repos_apps.command(name="a", help="Analyze repository development over time", hidden=True)(analyze)
165
+ repos_apps.command(name="secure", help="🔐 [s] Securely sync git repository to/from cloud with encryption")(secure_repo_main)
166
+ repos_apps.command(name="s", help="Securely sync git repository to/from cloud with encryption", hidden=True)(secure_repo_main)
167
+ repos_apps.command(name="viz", help="🎬 [v] Visualize repository activity using Gource")(viz)
168
+ repos_apps.command(name="v", help="Visualize repository activity using Gource", hidden=True)(viz)
169
+ repos_apps.command(name="cleanup", help="🧹 [n] Clean repository directories from cache files")(cleanup)
170
+ repos_apps.command(name="n", help="Clean repository directories from cache files", hidden=True)(cleanup)
171
+
172
+ mirror_app.command(name="capture", help="📝 [cap] Record repositories into a repos.json specification")(capture)
173
+ mirror_app.command(name="cap", help="Record repositories into a repos.json specification", hidden=True)(capture)
174
+ mirror_app.command(name="clone", help="📥 [clo] Clone repositories described by a repos.json specification")(clone)
175
+ mirror_app.command(name="clo", help="Clone repositories described by a repos.json specification", hidden=True)(clone)
176
+ mirror_app.command(name="checkout-to-commit", help="🔀 [ctc] Check out specific commits listed in the specification")(checkout_command)
177
+ mirror_app.command(name="ctc", help="Check out specific commits listed in the specification", hidden=True)(checkout_command)
178
+ mirror_app.command(name="checkout-to-branch", help="🔀 [ctb] Check out to the main branch defined in the specification")(checkout_to_branch_command)
179
+ mirror_app.command(name="ctb", help="Check out to the main branch defined in the specification", hidden=True)(checkout_to_branch_command)
180
+
181
+ return repos_apps
182
+
@@ -0,0 +1,134 @@
1
+
2
+ import typer
3
+ from typing import Optional, Annotated
4
+
5
+
6
+ def copy_both_assets():
7
+ import machineconfig.profile.create_helper as create_helper
8
+ create_helper.copy_assets_to_machine(which="scripts")
9
+ create_helper.copy_assets_to_machine(which="settings")
10
+
11
+
12
+ def update(copy_assets: Annotated[bool, typer.Option("--assets-copy/--no-assets-copy", "-a/-na", help="Copy (overwrite) assets to the machine after the update")] = True,
13
+ link_public_configs: Annotated[bool, typer.Option("--link-public-configs/--no-link-public-configs", "-b/-nb", help="Link public configs after update (overwrites your configs!)")] = False,
14
+ ):
15
+ """🔄 UPDATE uv and machineconfig"""
16
+ from pathlib import Path
17
+ if Path.home().joinpath("code", "machineconfig").exists():
18
+ shell_script = """
19
+ uv self update
20
+ cd ~/code/machineconfig
21
+ git pull
22
+ uv tool install --upgrade --editable $HOME/code/machineconfig
23
+ """
24
+ else:
25
+ shell_script = """
26
+ uv self update
27
+ uv tool install --upgrade machineconfig
28
+ """
29
+ import platform
30
+ if platform.system() == "Windows":
31
+ from machineconfig.utils.code import exit_then_run_shell_script, get_uv_command_executing_python_script
32
+ from machineconfig.utils.meta import lambda_to_python_script
33
+ python_script = lambda_to_python_script(lambda: copy_both_assets(),
34
+ in_global=True, import_module=False)
35
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=python_script, uv_with=["machineconfig"], uv_project_dir=None)
36
+ exit_then_run_shell_script(shell_script + "\n" + uv_command, strict=True)
37
+ else:
38
+ from machineconfig.utils.code import run_shell_script
39
+ run_shell_script(shell_script)
40
+ if copy_assets:
41
+ copy_both_assets()
42
+ if link_public_configs:
43
+ import machineconfig.profile.create_links_export as create_links_export
44
+ create_links_export.main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
45
+
46
+
47
+ def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-na", help="Copy (overwrite) assets to the machine after the update")] = False):
48
+ """📋 CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates."""
49
+ from machineconfig.utils.code import run_shell_script
50
+ from pathlib import Path
51
+ if Path.home().joinpath("code/machineconfig").exists():
52
+ run_shell_script(f"""$HOME/.local/bin/uv tool install --upgrade --editable "{str(Path.home().joinpath("code/machineconfig"))}" """)
53
+ else:
54
+ import platform
55
+ if platform.system() == "Windows":
56
+ run_shell_script(r"""& "$HOME\.local\bin\uv.exe" tool install --upgrade "machineconfig>=7.66" """)
57
+ else:
58
+ run_shell_script("""$HOME/.local/bin/uv tool install --upgrade "machineconfig>=7.66" """)
59
+ from machineconfig.profile.create_shell_profile import create_default_shell_profile
60
+ if not no_copy_assets:
61
+ create_default_shell_profile() # involves copying assets too
62
+
63
+
64
+
65
+ def interactive():
66
+ """🤖 INTERACTIVE configuration of machine."""
67
+ from machineconfig.scripts.python.interactive import main
68
+ main()
69
+
70
+ def status():
71
+ """📊 STATUS of machine, shell profile, apps, symlinks, dotfiles, etc."""
72
+ import machineconfig.scripts.python.helpers_devops.devops_status as helper
73
+ helper.main()
74
+
75
+
76
+ def navigate():
77
+ """📚 NAVIGATE command structure with TUI"""
78
+ import machineconfig.scripts.python as navigator
79
+ from pathlib import Path
80
+ path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
81
+ from machineconfig.utils.code import run_shell_script
82
+ if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
83
+ else: executable = """--with "machineconfig>=7.66,textual" """
84
+ run_shell_script(f"""uv run {executable} {path}""")
85
+
86
+
87
+ def run_python(ip: Annotated[str, typer.Argument(..., help="Python command to run in the machineconfig environment")],
88
+ command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False):
89
+ """🐍 RUN python command/file in the machineconfig environment"""
90
+ if command:
91
+ exec(ip)
92
+ return
93
+ import machineconfig
94
+ import subprocess
95
+ import sys
96
+ subprocess.run([sys.executable, ip], cwd=machineconfig.__path__[0])
97
+ def readme():
98
+ from rich.console import Console
99
+ from rich.markdown import Markdown
100
+ import requests
101
+
102
+ # URL of the raw README.md file
103
+ url_readme = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/README.md"
104
+
105
+ # Fetch the content
106
+ response = requests.get(url_readme)
107
+ response.raise_for_status() # Raise an error for bad responses
108
+
109
+ # Parse markdown
110
+ md = Markdown(response.text)
111
+
112
+ # Render in terminal
113
+ console = Console()
114
+ console.print(md)
115
+
116
+
117
+ def get_app():
118
+ cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
119
+ cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
120
+ cli_app.command("u", no_args_is_help=False, hidden=True)(update)
121
+ cli_app.command("interactive", no_args_is_help=False, help="🤖 [i] INTERACTIVE configuration of machine.")(interactive)
122
+ cli_app.command("i", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
123
+ cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
124
+ cli_app.command("s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
125
+ cli_app.command("install", no_args_is_help=False, help="📋 [I] CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.")(install)
126
+ cli_app.command("I", no_args_is_help=False, help="CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.", hidden=True)(install)
127
+ cli_app.command("navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
128
+ cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
129
+ cli_app.command("python", no_args_is_help=False, help="🐍 [c] python command/file in the machineconfig environment", context_settings={"show_help_on_error": True})(run_python)
130
+ cli_app.command("c", no_args_is_help=False, help="RUN python command/file in the machineconfig environment", hidden=True)(run_python)
131
+ cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
132
+ cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
133
+ return cli_app
134
+