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,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
+
@@ -0,0 +1,137 @@
1
+ import typer
2
+ # import platform
3
+ # import sys
4
+ from typing import Annotated
5
+
6
+
7
+ def share_file_receive(code_args: Annotated[list[str], typer.Argument(help="Receive code or relay command. Examples: '7121-donor-olympic-bicycle' or '--relay 10.17.62.206:443 7121-donor-olympic-bicycle'")],
8
+ ) -> None:
9
+ """Receive a file using croc with relay server.
10
+ Usage examples:
11
+ devops network receive 7121-donor-olympic-bicycle
12
+ devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle
13
+ devops network receive -- croc --relay 10.17.62.206:443 7121-donor-olympic-bicycle
14
+ """
15
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
16
+ install_if_missing(which="croc")
17
+ import platform
18
+ import sys
19
+
20
+ is_windows = platform.system() == "Windows"
21
+
22
+ # If no args passed via typer, try to get them from sys.argv directly
23
+ # This handles the case where -- was used and arguments weren't parsed by typer
24
+ if not code_args or (len(code_args) == 1 and code_args[0] in ['--relay', 'croc']):
25
+ # Find the index of 'rx' or 'receive' in sys.argv and get everything after it
26
+ try:
27
+ for i, arg in enumerate(sys.argv):
28
+ if arg in ['rx', 'receive', 'r'] and i + 1 < len(sys.argv):
29
+ code_args = sys.argv[i + 1:]
30
+ break
31
+ except Exception:
32
+ pass
33
+
34
+ # Join all arguments
35
+ input_str = " ".join(code_args)
36
+ tokens = input_str.split()
37
+
38
+ # Parse input to extract relay server and secret code
39
+ relay_server: str | None = None
40
+ secret_code: str | None = None
41
+
42
+ # Remove 'croc' and 'export' from tokens if present
43
+ tokens = [t for t in tokens if t not in ['croc', 'export']]
44
+
45
+ # Look for --relay flag and capture next token
46
+ relay_idx = -1
47
+ for i, token in enumerate(tokens):
48
+ if token == '--relay' and i + 1 < len(tokens):
49
+ relay_server = tokens[i + 1]
50
+ relay_idx = i
51
+ break
52
+
53
+ # Look for CROC_SECRET= prefix in any token
54
+ for token in tokens:
55
+ if token.startswith('CROC_SECRET='):
56
+ secret_code = token.split('=', 1)[1].strip('"').strip("'")
57
+ break
58
+
59
+ # If no secret code found yet, look for tokens with dashes (typical pattern: number-word-word-word)
60
+ # Skip relay server and relay flag
61
+ if not secret_code:
62
+ for i, token in enumerate(tokens):
63
+ if '-' in token and not token.startswith('-') and token != relay_server:
64
+ if relay_idx >= 0 and (i == relay_idx or i == relay_idx + 1):
65
+ continue # Skip relay server parts
66
+ secret_code = token
67
+ break
68
+
69
+ if not secret_code and not relay_server:
70
+ typer.echo(f"❌ Error: Could not parse croc receive code from input: {input_str}", err=True)
71
+ typer.echo("Usage:", err=True)
72
+ typer.echo(" devops network receive 7121-donor-olympic-bicycle", err=True)
73
+ typer.echo(" devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle", err=True)
74
+ raise typer.Exit(code=1)
75
+
76
+ # Build the appropriate script for current OS
77
+ if is_windows:
78
+ # Windows PowerShell format: croc --relay server:port secret-code --yes
79
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
80
+ code_arg = f"{secret_code}" if secret_code else ""
81
+ script = f"""croc {relay_arg} {code_arg} --yes""".strip()
82
+ else:
83
+ # Linux/macOS Bash format: CROC_SECRET="secret-code" croc --relay server:port --yes
84
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
85
+ if secret_code:
86
+ script = f"""export CROC_SECRET="{secret_code}"
87
+ croc {relay_arg} --yes""".strip()
88
+ else:
89
+ script = f"""croc {relay_arg} --yes""".strip()
90
+
91
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
92
+ print_code(code=script, desc="🚀 Receiving file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
93
+ exit_then_run_shell_script(script=script, strict=False)
94
+
95
+
96
+ def share_file_send(path: Annotated[str, typer.Argument(help="Path to the file or directory to send")],
97
+ zip_folder: Annotated[bool, typer.Option("--zip", help="Zip folder before sending")] = False,
98
+ code: Annotated[str | None, typer.Option("--code", "-c", help="Codephrase used to connect to relay")] = None,
99
+ text: Annotated[str | None, typer.Option("--text", "-t", help="Send some text")] = None,
100
+ qrcode: Annotated[bool, typer.Option("--qrcode", "--qr", help="Show receive code as a qrcode")] = False,
101
+ ) -> None:
102
+ """Send a file using croc with relay server."""
103
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
104
+ install_if_missing(which="croc")
105
+ # Get relay server IP from environment or use default
106
+ import socket
107
+ import platform
108
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
109
+ s.connect(('8.8.8.8',80))
110
+ local_ip_v4 = s.getsockname()[0]
111
+ s.close()
112
+ relay_port = "443"
113
+ is_windows = platform.system() == "Windows"
114
+
115
+ # Build command parts
116
+ relay_arg = f"--relay {local_ip_v4}:{relay_port} --ip {local_ip_v4}:{relay_port}"
117
+ zip_arg = "--zip" if zip_folder else ""
118
+ text_arg = f"--text '{text}'" if text else ""
119
+ qrcode_arg = "--qrcode" if qrcode else ""
120
+ path_arg = f"{path}" if not text else ""
121
+
122
+ if is_windows:
123
+ # Windows PowerShell format
124
+ code_arg = f"--code {code}" if code else ""
125
+ script = f"""croc {relay_arg} send {zip_arg} {code_arg} {qrcode_arg} {text_arg} {path_arg}"""
126
+ else:
127
+ # Linux/macOS Bash format
128
+ if code:
129
+ script = f"""export CROC_SECRET="{code}"
130
+ croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
131
+ else:
132
+ script = f"""croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
133
+
134
+ typer.echo(f"🚀 Sending file: {path}. Use: devops network receive")
135
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
136
+ print_code(code=script, desc="🚀 sending file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
137
+ exit_then_run_shell_script(script=script, strict=False)
@@ -0,0 +1,141 @@
1
+ from pathlib import Path
2
+ from typing import Optional, Annotated
3
+ from machineconfig.scripts.python.helpers_devops.cli_share_file import share_file_receive, share_file_send
4
+ import typer
5
+
6
+
7
+ def display_share_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
8
+ """Display a flashy, unmissable share URL announcement."""
9
+ from rich.console import Console
10
+ from rich.panel import Panel
11
+ from rich.text import Text
12
+ from rich.align import Align
13
+ console = Console()
14
+ # Create the main message with styling
15
+ url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
16
+ message = Text.assemble(
17
+ ("🚀 ", "bright_red"),
18
+ ("Share server is now accessible at: ", "bright_white bold"),
19
+ url_text,
20
+ (" 🚀", "bright_red")
21
+ )
22
+ # Create a fancy panel with borders and styling
23
+ panel = Panel(
24
+ Align.center(message),
25
+ title="[bold bright_green]🌐 SHARE SERVER READY 🌐[/bold bright_green]",
26
+ subtitle="[italic bright_yellow]⚡ Click the link above to access your shared files! ⚡[/italic bright_yellow]",
27
+ border_style="bright_magenta",
28
+ padding=(1, 2),
29
+ expand=False
30
+ )
31
+ # Print with extra spacing and attention-grabbing elements
32
+ console.print(panel)
33
+
34
+
35
+ def web_file_explorer(
36
+ path: Annotated[str, typer.Argument(help="Path to the file or directory to share")],
37
+ port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the share server on (default: 8080)")] = None,
38
+ username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for share access (default: current user)")] = None,
39
+ password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for share access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
40
+ over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the share server over the internet using ngrok")] = False,
41
+ backend: Annotated[str, typer.Option("--backend", "-b", help="Backend to use: filebrowser (default), miniserve, or easy-sharing")] = "filebrowser"
42
+ ) -> None:
43
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
44
+
45
+ if backend not in ["filebrowser", "miniserve", "easy-sharing"]:
46
+ typer.echo(f"❌ ERROR: Invalid backend '{backend}'. Must be one of: filebrowser, miniserve, easy-sharing", err=True)
47
+ raise typer.Exit(code=1)
48
+
49
+ install_if_missing(which=backend)
50
+ if over_internet:
51
+ install_if_missing(which="ngrok")
52
+
53
+ if username is None:
54
+ import getpass
55
+ username = getpass.getuser()
56
+
57
+ if password is None:
58
+ pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
59
+ if pwd_path.exists():
60
+ password = pwd_path.read_text(encoding="utf-8").strip()
61
+ else:
62
+ typer.echo(f"⚠️ WARNING: Password not provided and default password file does not exist.\nPath: {pwd_path}\nUsing default password: 'quick_password' (insecure!)", err=True)
63
+ raise typer.Exit(code=1)
64
+
65
+ if port is None:
66
+ port = 8080
67
+
68
+ import socket
69
+ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
70
+ s.connect(('8.8.8.8', 80))
71
+ local_ip_v4 = s.getsockname()[0]
72
+ s.close()
73
+
74
+ protocol = "http"
75
+ display_share_url(local_ip_v4, port, protocol)
76
+
77
+ path_obj = Path(path).resolve()
78
+ if not path_obj.exists():
79
+ typer.echo(f"❌ ERROR: Path does not exist: {path}", err=True)
80
+ raise typer.Exit(code=1)
81
+
82
+ if backend == "filebrowser":
83
+ db_path = Path.home().joinpath(".config/filebrowser/filebrowser.db")
84
+ db_path.parent.mkdir(parents=True, exist_ok=True)
85
+ command = f"""
86
+ filebrowser users add {username} "{password}" --database {db_path}
87
+ filebrowser --address 0.0.0.0 --port {port} --root "{path_obj}" --database {db_path}
88
+ """
89
+ elif backend == "miniserve":
90
+ command = f"""miniserve --port {port} --interfaces 0.0.0.0 --auth {username}:{password} --upload-files --mkdir --enable-tar --enable-tar-gz --enable-zip --qrcode "{path_obj}" """
91
+ elif backend == "easy-sharing":
92
+ command = f"""easy-sharing --port {port} --username {username} --password "{password}" "{path_obj}" """
93
+ else:
94
+ typer.echo(f"❌ ERROR: Unknown backend '{backend}'", err=True)
95
+ raise typer.Exit(code=1)
96
+
97
+ from machineconfig.utils.code import exit_then_run_shell_script
98
+ exit_then_run_shell_script(script=command, strict=False)
99
+ # import subprocess
100
+ # import time
101
+ # server_process: subprocess.Popen[bytes]
102
+ # server_process = subprocess.Popen(command, shell=True)
103
+ # processes = [server_process]
104
+ # if over_internet:
105
+ # ngrok_process = subprocess.Popen(f"ngrok http {port}", shell=True)
106
+ # processes.append(ngrok_process)
107
+ # time.sleep(3)
108
+ # try:
109
+ # import requests
110
+ # response = requests.get("http://localhost:4040/api/tunnels")
111
+ # data = response.json()
112
+ # public_url = data['tunnels'][0]['public_url']
113
+ # print(f"🌐 Ngrok tunnel ready: {public_url}")
114
+ # except Exception as e:
115
+ # print(f"Could not retrieve ngrok URL: {e}")
116
+
117
+ # try:
118
+ # while True:
119
+ # print(f"Share server ({backend}) is running. Press Ctrl+C to stop.")
120
+ # time.sleep(2)
121
+ # except KeyboardInterrupt:
122
+ # print("\nTerminating processes...")
123
+ # for p in processes:
124
+ # p.terminate()
125
+ # p.wait()
126
+
127
+
128
+ def get_share_file_app():
129
+ app = typer.Typer(name="share-file", help="Send or receive files using croc with relay server.")
130
+ app.command(name="send", no_args_is_help=True, hidden=False, help="[s] send files from here.")(share_file_send)
131
+ app.command(name="s", no_args_is_help=True, hidden=True, help="[s] send files from here.")(share_file_send)
132
+ app.command(name="receive", no_args_is_help=True, hidden=False, help="[r] receive files to here.")(share_file_receive)
133
+ app.command(name="r", no_args_is_help=True, hidden=True, help="[r] receive files to here.")(share_file_receive)
134
+ return app
135
+
136
+ def main_with_parser():
137
+ typer.run(web_file_explorer)
138
+
139
+
140
+ if __name__ == "__main__":
141
+ pass