machineconfig 7.98__py3-none-any.whl → 8.61__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.
Files changed (353) hide show
  1. machineconfig/cluster/remote/run_cluster.py +1 -1
  2. machineconfig/cluster/remote/run_remote.py +1 -1
  3. machineconfig/cluster/sessions_managers/utils/maker.py +10 -8
  4. machineconfig/cluster/sessions_managers/wt_local.py +1 -1
  5. machineconfig/cluster/sessions_managers/wt_local_manager.py +1 -1
  6. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  7. machineconfig/cluster/sessions_managers/zellij_local_manager.py +1 -1
  8. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  9. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  10. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  11. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  12. machineconfig/jobs/installer/installer_data.json +271 -152
  13. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  14. machineconfig/jobs/installer/package_groups.py +11 -9
  15. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +1 -2
  16. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +1 -1
  17. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +10 -8
  18. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +30 -13
  19. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +1 -1
  20. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +6 -5
  21. machineconfig/jobs/installer/{custom_dev → python_scripts}/sysabc.py +28 -43
  22. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +1 -1
  23. machineconfig/jobs/installer/{custom → python_scripts}/yazi.py +39 -19
  24. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  25. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  26. machineconfig/logger.py +1 -1
  27. machineconfig/profile/create_helper.py +21 -10
  28. machineconfig/profile/create_links.py +77 -20
  29. machineconfig/profile/create_links_export.py +63 -58
  30. machineconfig/profile/create_shell_profile.py +14 -0
  31. machineconfig/profile/mapper_data.toml +45 -0
  32. machineconfig/profile/mapper_dotfiles.toml +249 -0
  33. machineconfig/scripts/python/agents.py +76 -171
  34. machineconfig/scripts/python/ai/initai.py +3 -1
  35. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  36. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  37. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  38. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  39. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  40. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +1 -1
  41. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +29 -0
  42. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  43. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  44. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  45. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  46. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  47. machineconfig/scripts/python/ai/utils/vscode_tasks.py +6 -3
  48. machineconfig/scripts/python/cloud.py +58 -11
  49. machineconfig/scripts/python/croshell.py +4 -155
  50. machineconfig/scripts/python/devops.py +57 -38
  51. machineconfig/scripts/python/devops_navigator.py +17 -3
  52. machineconfig/scripts/python/fire_jobs.py +10 -193
  53. machineconfig/scripts/python/ftpx.py +5 -224
  54. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  55. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  56. machineconfig/scripts/python/{env_manager → helpers/helper_env}/env_manager_tui.py +1 -1
  57. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  58. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.py +1 -1
  59. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +1 -1
  60. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_gemini.py +1 -1
  61. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_qwen.py +1 -1
  62. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  63. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_launch.py +10 -7
  64. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  65. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  66. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  67. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  68. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  69. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  70. machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.sh +3 -1
  71. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +6 -6
  72. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +10 -5
  73. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +4 -4
  74. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  75. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +229 -0
  76. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  77. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +7 -6
  78. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  79. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  80. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +130 -0
  81. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  82. machineconfig/scripts/python/helpers/helpers_devops/cli_config_mount.py +77 -0
  83. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +71 -0
  84. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +285 -0
  85. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  86. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_self.py +84 -33
  87. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_file.py +44 -30
  88. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_server.py +26 -43
  89. machineconfig/scripts/python/helpers/helpers_devops/cli_share_temp.py +69 -0
  90. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/cli_share_terminal.py +12 -6
  91. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  92. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +12 -6
  93. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  94. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +64 -50
  95. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/commands.py +25 -0
  96. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/device_entry.py +17 -0
  97. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/devices.py +17 -0
  98. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/linux.py +103 -0
  99. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/macos.py +100 -0
  100. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/selection.py +47 -0
  101. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/utils.py +28 -0
  102. machineconfig/scripts/python/helpers/helpers_devops/mount_helpers/windows.py +91 -0
  103. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  104. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  105. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  106. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +3 -3
  107. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/file_wrangler.py +1 -0
  108. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  109. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  110. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +3 -3
  111. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  112. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  113. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_linux/fzfg +4 -3
  114. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  115. machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/scripts_windows/fzfg.ps1 +2 -7
  116. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  117. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  118. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  119. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  120. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  121. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  122. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  123. machineconfig/scripts/python/helpers/helpers_network/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/address.py +52 -10
  125. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  126. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  127. machineconfig/scripts/python/helpers/helpers_network/ssh/__init__.py +0 -0
  128. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_identity.py +73 -0
  129. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_key_windows.py +23 -0
  130. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_add_ssh_key.py +169 -0
  131. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_cloud_init.py +33 -0
  132. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux.py +338 -0
  133. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_linux_utils.py +35 -0
  134. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows.py +245 -0
  135. machineconfig/scripts/python/helpers/helpers_network/ssh/ssh_debug_windows_utils.py +34 -0
  136. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  137. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  138. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +120 -37
  139. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +3 -2
  140. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -13
  141. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_2.py +63 -19
  142. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  143. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  144. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  145. machineconfig/scripts/python/helpers/helpers_sessions/attach_impl.py +87 -0
  146. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +114 -0
  147. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +1 -2
  148. machineconfig/scripts/python/helpers/helpers_sessions/utils.py +69 -0
  149. machineconfig/scripts/python/{helpers_utils → helpers/helpers_utils}/download.py +1 -1
  150. machineconfig/scripts/python/{helpers_devops/cli_utils.py → helpers/helpers_utils/pdf.py} +2 -2
  151. machineconfig/scripts/python/{helpers_utils/path.py → helpers/helpers_utils/python.py} +65 -40
  152. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  153. machineconfig/scripts/python/mcfg_entry.py +126 -48
  154. machineconfig/scripts/python/msearch.py +16 -61
  155. machineconfig/scripts/python/sessions.py +137 -191
  156. machineconfig/scripts/python/utils.py +104 -24
  157. machineconfig/settings/atuin/config.toml +294 -0
  158. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  159. machineconfig/settings/linters/.ruff.toml +2 -1
  160. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  161. machineconfig/settings/shells/bash/init.sh +6 -10
  162. machineconfig/settings/shells/nushell/config.nu +23 -1
  163. machineconfig/settings/shells/nushell/env.nu +22 -48
  164. machineconfig/settings/shells/nushell/init.nu +64 -240
  165. machineconfig/settings/shells/pwsh/init.ps1 +71 -5
  166. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  167. machineconfig/settings/shells/wezterm/wezterm.lua +4 -0
  168. machineconfig/settings/shells/wt/settings.json +31 -37
  169. machineconfig/settings/shells/zsh/init.sh +25 -5
  170. machineconfig/settings/television/cable_unix/bash-history.toml +1 -1
  171. machineconfig/settings/television/cable_windows/pwsh-history.toml +1 -1
  172. machineconfig/settings/tv/config.toml +234 -0
  173. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  174. machineconfig/settings/wsl/.wslconfig +5 -30
  175. machineconfig/settings/wt/__init__.py +0 -0
  176. machineconfig/settings/yazi/yazi_linux.toml +18 -8
  177. machineconfig/settings/zellij/__init__.py +0 -0
  178. machineconfig/settings/zellij/config.kdl +0 -295
  179. machineconfig/settings/zellij/layouts/__init__.py +0 -0
  180. machineconfig/settings/zellij/layouts/st.kdl +39 -9
  181. machineconfig/settings/zellij/layouts/st2.kdl +6 -2
  182. machineconfig/setup_linux/__init__.py +0 -1
  183. machineconfig/setup_linux/apps_desktop.sh +8 -27
  184. machineconfig/setup_linux/web_shortcuts/interactive.sh +10 -10
  185. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +3 -0
  186. machineconfig/setup_mac/__init__.py +0 -2
  187. machineconfig/setup_windows/__init__.py +2 -5
  188. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +14 -13
  189. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +4 -3
  190. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +3 -3
  191. machineconfig/type_hinting/sql/__init__.py +1 -0
  192. machineconfig/type_hinting/sql/base.py +216 -0
  193. machineconfig/type_hinting/sql/core_schema.py +64 -0
  194. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  195. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  196. machineconfig/type_hinting/typedict/__init__.py +1 -0
  197. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  198. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  199. machineconfig/type_hinting/typedict/generators.py +231 -0
  200. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  201. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  202. machineconfig/utils/accessories.py +24 -0
  203. machineconfig/utils/code.py +78 -33
  204. machineconfig/utils/files/ascii_art.py +10 -14
  205. machineconfig/utils/files/headers.py +3 -5
  206. machineconfig/utils/files/read.py +8 -1
  207. machineconfig/utils/installer_utils/github_release_bulk.py +11 -91
  208. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  209. machineconfig/utils/installer_utils/install_from_url.py +1 -1
  210. machineconfig/utils/installer_utils/installer_class.py +12 -4
  211. machineconfig/utils/installer_utils/installer_cli.py +7 -17
  212. machineconfig/utils/installer_utils/installer_helper.py +52 -36
  213. machineconfig/utils/installer_utils/installer_locator_utils.py +15 -25
  214. machineconfig/utils/installer_utils/installer_runner.py +4 -4
  215. machineconfig/utils/io.py +25 -8
  216. machineconfig/utils/meta.py +6 -4
  217. machineconfig/utils/options.py +49 -19
  218. machineconfig/utils/options_utils/__init__.py +0 -0
  219. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  220. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  221. machineconfig/utils/options_utils/tv_options.py +37 -0
  222. machineconfig/utils/path_extended.py +8 -7
  223. machineconfig/utils/procs.py +35 -27
  224. machineconfig/utils/scheduler.py +8 -2
  225. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  226. machineconfig/utils/schemas/layouts/layout_types.py +10 -0
  227. machineconfig/utils/source_of_truth.py +7 -1
  228. machineconfig/utils/ssh.py +73 -23
  229. machineconfig/utils/ssh_utils/abc.py +1 -1
  230. machineconfig/utils/ssh_utils/copy_from_here.py +19 -14
  231. machineconfig/utils/ssh_utils/copy_to_here.py +2 -1
  232. machineconfig/utils/ssh_utils/utils.py +23 -7
  233. machineconfig/utils/ssh_utils/wsl.py +107 -170
  234. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  235. machineconfig/utils/upgrade_packages.py +4 -8
  236. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/METADATA +30 -23
  237. machineconfig-8.61.dist-info/RECORD +539 -0
  238. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/entry_points.txt +0 -1
  239. machineconfig/jobs/installer/check_installations.py +0 -248
  240. machineconfig/profile/backup.toml +0 -49
  241. machineconfig/profile/mapper.toml +0 -263
  242. machineconfig/scripts/linux/other/share_cloud.sh +0 -64
  243. machineconfig/scripts/linux/other/share_nfs +0 -49
  244. machineconfig/scripts/linux/other/start_docker +0 -23
  245. machineconfig/scripts/linux/other/switch_ip +0 -20
  246. machineconfig/scripts/python/helpers/run_py_script.py +0 -79
  247. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +0 -26
  248. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -105
  249. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -89
  250. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  251. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -214
  252. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -215
  253. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  254. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  255. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  256. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  257. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -620
  258. machineconfig/scripts/python/helpers_network/devops_add_identity.py +0 -82
  259. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +0 -153
  260. machineconfig/scripts/python/helpers_network/mount_drive +0 -128
  261. machineconfig/scripts/python/helpers_network/mount_nfs +0 -49
  262. machineconfig/scripts/python/helpers_network/mount_nfs.py +0 -85
  263. machineconfig/scripts/python/helpers_network/mount_nw_drive +0 -61
  264. machineconfig/scripts/python/helpers_network/mount_nw_drive.py +0 -48
  265. machineconfig/scripts/python/helpers_network/mount_smb +0 -3
  266. machineconfig/scripts/python/helpers_network/mount_ssh.py +0 -64
  267. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +0 -391
  268. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +0 -338
  269. machineconfig/scripts/python/helpers_network/wsl_windows_transfer.py +0 -67
  270. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -77
  271. machineconfig/scripts/python/terminal.py +0 -133
  272. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +0 -92
  273. machineconfig/scripts/windows/mounts/mount_nfs.ps1 +0 -42
  274. machineconfig/scripts/windows/mounts/mount_nw.ps1 +0 -9
  275. machineconfig/scripts/windows/mounts/mount_smb.ps1 +0 -2
  276. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  277. machineconfig/scripts/windows/mounts/share_cloud.cmd +0 -34
  278. machineconfig/scripts/windows/mounts/share_smb.ps1 +0 -16
  279. machineconfig/settings/zellij/config.orig.kdl +0 -295
  280. machineconfig/setup_linux/others/android.sh +0 -2
  281. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  282. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  283. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  284. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  285. machineconfig/setup_windows/others/docker.ps1 +0 -7
  286. machineconfig/setup_windows/others/obs.ps1 +0 -4
  287. machineconfig/setup_windows/others/power_options.ps1 +0 -7
  288. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  289. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  290. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  291. machineconfig/setup_windows/ssh/openssh-server_add_key.ps1 +0 -7
  292. machineconfig/setup_windows/ssh/openssh-server_copy-ssh-id.ps1 +0 -14
  293. machineconfig/utils/options_tv.py +0 -119
  294. machineconfig/utils/tst.py +0 -20
  295. machineconfig-7.98.dist-info/RECORD +0 -504
  296. /machineconfig/{jobs/installer/custom_dev → cluster/sessions_managers/wt_utils/examples}/__init__.py +0 -0
  297. /machineconfig/{scripts/python/helpers_agents → jobs/installer/checks}/__init__.py +0 -0
  298. /machineconfig/{scripts/python/helpers_agents/agentic_frameworks → jobs/installer/python_scripts}/__init__.py +0 -0
  299. /machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  300. /machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  301. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cloudflare_warp_cli.py +0 -0
  302. /machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  303. /machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +0 -0
  304. /machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  305. /machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  306. /machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  307. /machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  308. /machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  309. /machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +0 -0
  310. /machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  311. /machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  312. /machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  313. /machineconfig/scripts/python/{helpers_cloud → graph}/__init__.py +0 -0
  314. /machineconfig/scripts/python/{helpers_croshell → helpers}/__init__.py +0 -0
  315. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  316. /machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  317. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_agents}/__init__.py +0 -0
  318. /machineconfig/scripts/python/{helpers_devops/themes → helpers/helpers_agents/agentic_frameworks}/__init__.py +0 -0
  319. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +0 -0
  320. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  321. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_helper_types.py +0 -0
  322. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  323. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/prompt.txt +0 -0
  324. /machineconfig/scripts/python/{helpers_agents → helpers/helpers_agents}/templates/template.ps1 +0 -0
  325. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  326. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +0 -0
  327. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  328. /machineconfig/scripts/python/{helpers_network → helpers/helpers_croshell}/__init__.py +0 -0
  329. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +0 -0
  330. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  331. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  332. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  333. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_devops}/__init__.py +0 -0
  334. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/mount_helpers}/__init__.py +0 -0
  335. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_devops/themes/__init__.py} +0 -0
  336. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  337. /machineconfig/scripts/python/{helpers_fire_command/f.py → helpers/helpers_fire_command/__init__.py} +0 -0
  338. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  339. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  340. /machineconfig/scripts/python/{helpers_msearch → helpers/helpers_msearch}/__init__.py +0 -0
  341. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  342. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/onetimeshare.py +0 -0
  343. /machineconfig/scripts/python/{helpers_network → helpers/helpers_network}/wifi_conn.py +0 -0
  344. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -0
  345. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/repo_analyzer_1.py +0 -0
  346. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  347. /machineconfig/scripts/python/helpers/{ast_search.py → helpers_search/ast_search.py} +0 -0
  348. /machineconfig/scripts/python/helpers/{qr_code.py → helpers_search/qr_code.py} +0 -0
  349. /machineconfig/scripts/python/helpers/{repo_rag.py → helpers_search/repo_rag.py} +0 -0
  350. /machineconfig/scripts/python/helpers/{symantic_search.py → helpers_search/symantic_search.py} +0 -0
  351. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  352. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/WHEEL +0 -0
  353. {machineconfig-7.98.dist-info → machineconfig-8.61.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,274 @@
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.helpers_repos.cloud_repo_sync import main as secure_repo_main
12
+
13
+
14
+ def _resolve_directory(directory: Optional[str]) -> Path:
15
+ if directory is None:
16
+ directory = Path.cwd().as_posix()
17
+ typer.echo(f"📁 Using directory: {directory}")
18
+ return Path(directory).expanduser().absolute().resolve()
19
+
20
+
21
+ def push(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
22
+ """🚀 Push changes across repositories."""
23
+ repos_root = _resolve_directory(directory)
24
+ from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
25
+ from machineconfig.utils.path_extended import PathExtended
26
+ perform_git_operations(repos_root=PathExtended(repos_root), pull=False, commit=False, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
27
+
28
+
29
+ def pull(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
30
+ """⬇️ Pull changes across repositories."""
31
+ repos_root = _resolve_directory(directory)
32
+ from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
33
+ from machineconfig.utils.path_extended import PathExtended
34
+ perform_git_operations(repos_root=PathExtended(repos_root), pull=True, commit=False, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
35
+
36
+
37
+ def commit(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
38
+ """💾 Commit changes across repositories."""
39
+ repos_root = _resolve_directory(directory)
40
+ from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
41
+ from machineconfig.utils.path_extended import PathExtended
42
+ perform_git_operations(repos_root=PathExtended(repos_root), pull=False, commit=True, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
43
+
44
+
45
+ def sync(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
46
+ """🔄 Pull, commit, and push changes across repositories."""
47
+ repos_root = _resolve_directory(directory)
48
+ from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
49
+ from machineconfig.utils.path_extended import PathExtended
50
+ perform_git_operations(repos_root=PathExtended(repos_root), pull=True, commit=True, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
51
+
52
+
53
+ def capture(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
54
+ """📝 Record repositories into a repos.json specification."""
55
+ from machineconfig.scripts.python.helpers.helpers_repos.record import main_record as record_repos
56
+ save_path = record_repos(repos_root_str=directory)
57
+ print(f"\n✅ Saved repository specification to {save_path}")
58
+
59
+
60
+ def clone(directory: Annotated[str, typer.Argument(help="📁 Directory containing repo(s).")] = ".",
61
+ specs_path: Annotated[Optional[str], typer.Option("--specs-path", "-s", help="Path to repos.json specification file.")] = None,
62
+ interactive: Annotated[bool, typer.Option("--interactive/--no-interactive", "-i/-ni", help="Select interactively.")]=False
63
+ ) -> None:
64
+ """📥 Clone repositories described by a repos.json specification."""
65
+ if interactive:
66
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import BACKUP_ROOT_PRIVATE, BACKUP_ROOT_PUBLIC, get_original_path_from_backup_path
67
+ results_public = list(BACKUP_ROOT_PUBLIC.rglob("repos.json"))
68
+ results_private = list(BACKUP_ROOT_PRIVATE.rglob("repos.json"))
69
+ if len(results_public) + len(results_private) == 0:
70
+ print("❌ No repos.json specifications found in backup directories.")
71
+ return
72
+ from machineconfig.utils.options import choose_from_options
73
+ chosen_files: list[str] = choose_from_options(options=[str(p) for p in results_public + results_private], msg="Select a repos.json specification to clone from:", multi=True, tv=True)
74
+ for file in chosen_files:
75
+ if str(file).startswith(str(BACKUP_ROOT_PRIVATE)):
76
+ original_path = get_original_path_from_backup_path(Path(file), sensitivity="private", destination=None, shared=False)
77
+ else:
78
+ original_path = get_original_path_from_backup_path(Path(file), sensitivity="public", destination=None, shared=False)
79
+ typer.echo("\n📥 Cloning or checking out repositories...")
80
+ dir_obj = _resolve_directory(str(original_path))
81
+ spec_path_default = dir_obj.joinpath("repos.json")
82
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
83
+ spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
84
+ from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
85
+ clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=False)
86
+ return
87
+ if specs_path is not None:
88
+ spec_path_self_managed = Path(specs_path).expanduser().absolute()
89
+ else:
90
+ dir_obj = _resolve_directory(directory)
91
+ spec_path_default = dir_obj.joinpath("repos.json")
92
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
93
+ spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
94
+ if not spec_path_self_managed.exists():
95
+ print(f"❌ Specification file not found: {spec_path_self_managed}. Ensure this file exists or provide it explicitly using --specs-path.")
96
+ return
97
+ from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
98
+ clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=False)
99
+
100
+
101
+ def checkout_command(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
102
+ """🔀 Check out specific commits listed in the specification."""
103
+ typer.echo("\n📥 Cloning or checking out repositories...")
104
+ dir_obj = _resolve_directory(directory)
105
+ spec_path_default = dir_obj.joinpath("repos.json")
106
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
107
+ spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
108
+ from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
109
+ clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=True)
110
+
111
+
112
+ def checkout_to_branch_command(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
113
+ """🔀 Check out to the main branch defined in the specification."""
114
+ typer.echo("\n📥 Cloning or checking out repositories...")
115
+ dir_obj = _resolve_directory(directory)
116
+ spec_path_default = dir_obj.joinpath("repos.json")
117
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
118
+ spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
119
+ from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
120
+ clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=True, checkout_commit_flag=False)
121
+
122
+
123
+ def count_lines_in_repo(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
124
+ # def func(repo_path: str):
125
+ # from machineconfig.scripts.python.helpers.helpers_repos import repo_analyzer_1
126
+ # repo_analyzer_1.count_historical_line_edits(repo_path=repo_path)
127
+ # from machineconfig.utils.code import run_lambda_function
128
+ # run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig>=8.61"])
129
+ from machineconfig.scripts.python.helpers.helpers_repos import repo_analyzer_1
130
+ try:
131
+ repo_analyzer_1.count_historical_line_edits(repo_path=repo_path)
132
+ except Exception as e:
133
+ typer.echo(f"❌ Error counting lines in repo {repo_path}: {e}")
134
+
135
+
136
+ def print_python_files_by_size(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
137
+ # def func(repo_path: str):
138
+ # from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import print_python_files_by_size_impl
139
+ # print_python_files_by_size_impl(repo_path=repo_path)
140
+ # from machineconfig.utils.code import run_lambda_function
141
+ # run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.61"])
142
+ from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import print_python_files_by_size_impl
143
+ print_python_files_by_size_impl(repo_path=repo_path)
144
+
145
+
146
+ def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
147
+ # def func(repo_path: str):
148
+ # from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import analyze_over_time
149
+ # analyze_over_time(repo_path=repo_path)
150
+ # from machineconfig.utils.code import run_lambda_function
151
+ # run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.61"])
152
+ from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import analyze_over_time
153
+ analyze_over_time(repo_path=repo_path)
154
+
155
+
156
+ def gource_viz(
157
+ repo: Annotated[str, typer.Option(..., "--repo", "-r", help="Path to git repository to visualize")] = ".",
158
+ 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,
159
+ resolution: Annotated[str, typer.Option(..., "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)")] = "1920x1080",
160
+ seconds_per_day: Annotated[float, typer.Option(..., "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)")] = 0.1,
161
+ auto_skip_seconds: Annotated[float, typer.Option(..., "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds")] = 1.0,
162
+ title: Annotated[Optional[str], typer.Option(..., "--title", "-t", help="Title for the visualization")] = None,
163
+ hide_items: Annotated[list[str], typer.Option(..., "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames")] = [],
164
+ key_items: Annotated[bool, typer.Option(..., "--key", "-k", help="Show file extension key")] = False,
165
+ fullscreen: Annotated[bool, typer.Option(..., "--fullscreen", "-f", help="Run in fullscreen mode")] = False,
166
+ viewport: Annotated[Optional[str], typer.Option(..., "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')")] = None,
167
+ start_date: Annotated[Optional[str], typer.Option(..., "--start-date", help="Start date (YYYY-MM-DD)")] = None,
168
+ stop_date: Annotated[Optional[str], typer.Option(..., "--stop-date", help="Stop date (YYYY-MM-DD)")] = None,
169
+ user_image_dir: Annotated[Optional[Path], typer.Option(..., "--user-image-dir", help="Directory with user avatar images")] = None,
170
+ max_files: Annotated[int, typer.Option(..., "--max-files", help="Maximum number of files to show (0 = no limit)")] = 0,
171
+ max_file_lag: Annotated[float, typer.Option(..., "--max-file-lag", help="Max time files remain on screen after last change")] = 5.0,
172
+ file_idle_time: Annotated[int, typer.Option(..., "--file-idle-time", help="Time in seconds files remain idle before being removed")] = 0,
173
+ framerate: Annotated[int, typer.Option(..., "--framerate", help="Frames per second for video output")] = 60,
174
+ background_color: Annotated[str, typer.Option(..., "--background-color", help="Background color in hex (e.g., 000000 for black)")] = "000000",
175
+ font_size: Annotated[int, typer.Option(..., "--font-size", help="Font size")] = 22,
176
+ camera_mode: Annotated[str, typer.Option(..., "--camera-mode", help="Camera mode: overview or track")] = "overview",
177
+ self: Annotated[bool, typer.Option(..., "--self", help="Clone machineconfig repository and act on it")] = False,
178
+ ) -> None:
179
+ """🎬 Visualize repository activity using Gource."""
180
+ from machineconfig.scripts.python.helpers.helpers_repos.grource import visualize
181
+ if self:
182
+ repo_path = Path.home().joinpath("machineconfig")
183
+ if not repo_path.exists():
184
+ import git
185
+ repo_url = "https://github.com/thisismygitrepo/machineconfig.git"
186
+ git.Repo.clone_from(repo_url, to_path=repo_path.as_posix())
187
+ repo = repo_path.as_posix()
188
+ visualize(repo=repo, output_file=output_file, resolution=resolution, seconds_per_day=seconds_per_day,
189
+ auto_skip_seconds=auto_skip_seconds, title=title, hide_items=hide_items, key_items=key_items,
190
+ fullscreen=fullscreen, viewport=viewport, start_date=start_date, stop_date=stop_date,
191
+ user_image_dir=user_image_dir, max_files=max_files, max_file_lag=max_file_lag,
192
+ file_idle_time=file_idle_time, framerate=framerate, background_color=background_color,
193
+ font_size=font_size, camera_mode=camera_mode)
194
+
195
+
196
+ def cleanup(repo: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False) -> None:
197
+ """🧹 Clean repository directories from cache files."""
198
+ if repo is None:
199
+ repo = Path.cwd().as_posix()
200
+
201
+ arg_path = Path(repo).expanduser().absolute()
202
+ from git import Repo, InvalidGitRepositoryError
203
+ if not recursive:
204
+ # Check if the directory is a git repo
205
+ try:
206
+ Repo(str(arg_path), search_parent_directories=False)
207
+ except InvalidGitRepositoryError:
208
+ typer.echo(f"❌ {arg_path} is not a git repository. Use -r flag for recursive cleanup.")
209
+ return
210
+ # Run cleanup on this repo
211
+ repos_to_clean = [arg_path]
212
+ else:
213
+ # Find all git repos recursively under the directory
214
+ git_dirs = list(arg_path.rglob('.git'))
215
+ repos_to_clean = [git_dir.parent for git_dir in git_dirs if git_dir.is_dir()]
216
+ if not repos_to_clean:
217
+ typer.echo(f"❌ No git repositories found under {arg_path}")
218
+ return
219
+
220
+ for repo_path in repos_to_clean:
221
+ typer.echo(f"🧹 Cleaning {repo_path}")
222
+ script = fr"""
223
+ cd "{repo_path}"
224
+ uv run --with cleanpy cleanpy .
225
+ # mcinit .
226
+ # find "." -type f \( -name "*.py" -o -name "*.md" -o -name "*.json" \) -not -path "*/\.*" -not -path "*/__pycache__/*" -print0 | xargs -0 sed -i 's/[[:space:]]*$//'
227
+ """
228
+ from machineconfig.utils.code import run_shell_script
229
+ run_shell_script(script, display_script=True, clean_env=False)
230
+
231
+
232
+ def get_app():
233
+ repos_apps = typer.Typer(help="📁 [r] Manage development repositories", no_args_is_help=True, add_help_option=True, add_completion=False)
234
+ mirror_app = typer.Typer(help="🔄 [m] Manage repository specifications and syncing", no_args_is_help=True, add_help_option=True, add_completion=False)
235
+ repos_apps.add_typer(mirror_app, name="mirror", help="🔄 [m] mirror repositories using saved specs")
236
+ repos_apps.add_typer(mirror_app, name="m", help="mirror repositories using saved specs", hidden=True)
237
+
238
+ repos_apps.command(name="push", help="🚀 [p] Push changes across repositories")(push)
239
+ repos_apps.command(name="p", help="Push changes across repositories", hidden=True)(push)
240
+ repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
241
+ repos_apps.command(name="P", help="Pull changes across repositories", hidden=True)(pull)
242
+ repos_apps.command(name="commit", help="💾 [c] Commit changes across repositories")(commit)
243
+ repos_apps.command(name="c", help="Commit changes across repositories", hidden=True)(commit)
244
+ repos_apps.command(name="sync", help="🔄 [y] Pull, commit, and push changes across repositories")(sync)
245
+ repos_apps.command(name="y", help="Pull, commit, and push changes across repositories", hidden=True)(sync)
246
+ repos_apps.command(name="analyze", help="📊 [a] Analyze repository development over time")(analyze_repo_development)
247
+ repos_apps.command(name="a", help="Analyze repository development over time", hidden=True)(analyze_repo_development)
248
+
249
+ repos_apps.command(name="secure", help="🔐 [s] Securely sync git repository to/from cloud with encryption")(secure_repo_main)
250
+ repos_apps.command(name="s", help="Securely sync git repository to/from cloud with encryption", hidden=True)(secure_repo_main)
251
+
252
+ repos_apps.command(name="viz", help="🎬 [v] Visualize repository activity using Gource")(gource_viz)
253
+ repos_apps.command(name="v", help="Visualize repository activity using Gource", hidden=True)(gource_viz)
254
+
255
+ repos_apps.command(name="count-lines", help="📄 [l] Count python lines of code in current repo + historical edits.")(count_lines_in_repo)
256
+ repos_apps.command(name="l", help="Count python lines of code in current repo + historical edits.", hidden=True)(count_lines_in_repo)
257
+
258
+ repos_apps.command(name="cleanup", help="🧹 [n] Clean repository directories from cache files")(cleanup)
259
+ repos_apps.command(name="n", help="Clean repository directories from cache files", hidden=True)(cleanup)
260
+
261
+ mirror_app.command(name="capture", help="📝 [cap] Record repositories into a repos.json specification")(capture)
262
+ mirror_app.command(name="cap", help="Record repositories into a repos.json specification", hidden=True)(capture)
263
+
264
+ mirror_app.command(name="clone", help="📥 [clo] Clone repositories described by a repos.json specification")(clone)
265
+ mirror_app.command(name="clo", help="Clone repositories described by a repos.json specification", hidden=True)(clone)
266
+
267
+ mirror_app.command(name="checkout-to-commit", help="🔀 [ctc] Check out specific commits listed in the specification")(checkout_command)
268
+ mirror_app.command(name="ctc", help="Check out specific commits listed in the specification", hidden=True)(checkout_command)
269
+
270
+ mirror_app.command(name="checkout-to-branch", help="🔀 [ctb] Check out to the main branch defined in the specification")(checkout_to_branch_command)
271
+ mirror_app.command(name="ctb", help="Check out to the main branch defined in the specification", hidden=True)(checkout_to_branch_command)
272
+
273
+ return repos_apps
274
+
@@ -1,6 +1,7 @@
1
1
 
2
2
  import typer
3
3
  from typing import Annotated, Literal
4
+ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION
4
5
 
5
6
 
6
7
  def copy_both_assets():
@@ -69,12 +70,12 @@ def update(copy_assets: Annotated[bool, typer.Option("--assets-copy/--no-assets-
69
70
  uv self update
70
71
  cd ~/code/machineconfig
71
72
  git pull
72
- uv tool install --upgrade --editable $HOME/code/machineconfig
73
+ uv tool install --no-cache --upgrade --editable $HOME/code/machineconfig
73
74
  """
74
75
  else:
75
76
  shell_script = """
76
77
  uv self update
77
- uv tool install --upgrade machineconfig
78
+ uv tool install --no-cache --upgrade machineconfig
78
79
  """
79
80
  import platform
80
81
  if platform.system() == "Windows":
@@ -86,38 +87,63 @@ uv tool install --upgrade machineconfig
86
87
  exit_then_run_shell_script(shell_script + "\n" + uv_command, strict=True)
87
88
  else:
88
89
  from machineconfig.utils.code import run_shell_script
89
- run_shell_script(shell_script)
90
+ run_shell_script(shell_script, display_script=True, clean_env=False)
90
91
  if copy_assets:
91
92
  copy_both_assets()
92
93
  if link_public_configs:
93
94
  import machineconfig.profile.create_links_export as create_links_export
94
- create_links_export.main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
95
+ create_links_export.main_from_parser(sensitivity="public", method="copy", on_conflict="overwrite-default-path", which="all")
95
96
 
96
97
 
97
- def install(no_copy_assets: Annotated[bool, typer.Option("--no-assets-copy", "-na", help="Copy (overwrite) assets to the machine after the update")] = False):
98
+ def install(copy_assets: Annotated[bool, typer.Option("--copy-assets/--no-assets-copy", "-a/-na", help="Copy (overwrite) assets to the machine after the update")] = True,
99
+ dev: Annotated[bool, typer.Option("--dev", "-d", help="Install from local development code instead of PyPI")] = False,
100
+
101
+ ):
98
102
  """📋 CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates."""
99
- from machineconfig.utils.code import run_shell_script, get_uv_run_command
103
+ from machineconfig.utils.code import run_shell_script, get_uv_command, get_shell_script_running_lambda_function, exit_then_run_shell_script
100
104
  from pathlib import Path
101
105
  import platform
102
- uv_run_command = get_uv_run_command(platform=platform.system()) # type: ignore
103
- if Path.home().joinpath("code/machineconfig").exists():
104
- run_shell_script(f""" {uv_run_command} tool install --upgrade --editable "{str(Path.home().joinpath("code/machineconfig"))}" """)
106
+ mcfg_path = Path.home().joinpath("code/machineconfig")
107
+ _ = run_shell_script
108
+ if dev and not mcfg_path.exists():
109
+ # clone: https://github.com/thisismygitrepo/machineconfig.git
110
+ import git
111
+ mcfg_path.parent.mkdir(parents=True, exist_ok=True)
112
+ git.Repo.clone_from("https://github.com/thisismygitrepo/machineconfig.git", str(mcfg_path))
113
+ # now we need to run `uv sync` to install dependencies
114
+
115
+ uv_command = get_uv_command(platform=platform.system())
116
+ if copy_assets:
117
+ def func():
118
+ from machineconfig.profile.create_shell_profile import create_default_shell_profile
119
+ create_default_shell_profile() # involves copying assets too
120
+ uv_command2, _script_path = get_shell_script_running_lambda_function(lambda: func(),
121
+ uv_with=["machineconfig"], uv_project_dir=None)
105
122
  else:
106
- run_shell_script(rf""" {uv_run_command} tool install --upgrade "machineconfig>=7.98" """)
107
- from machineconfig.profile.create_shell_profile import create_default_shell_profile
108
- if not no_copy_assets:
109
- create_default_shell_profile() # involves copying assets too
123
+ uv_command2 = ""
124
+ if mcfg_path.exists():
125
+ exit_then_run_shell_script(f"""
126
+ cd {str(mcfg_path)}
127
+ {uv_command} sync
128
+ {uv_command} tool install --upgrade --editable "{str(mcfg_path)}"
129
+ {uv_command2}
130
+ """)
131
+ else:
132
+ exit_then_run_shell_script(rf"""
133
+ {uv_command} tool install --upgrade "{MACHINECONFIG_VERSION}"
134
+ {uv_command2}
135
+ """)
110
136
 
111
137
 
112
138
 
113
139
  def interactive():
114
140
  """🤖 INTERACTIVE configuration of machine."""
115
- from machineconfig.scripts.python.interactive import main
141
+ from machineconfig.scripts.python.helpers.helpers_devops.interactive import main
116
142
  main()
117
143
 
118
144
  def status():
119
145
  """📊 STATUS of machine, shell profile, apps, symlinks, dotfiles, etc."""
120
- import machineconfig.scripts.python.helpers_devops.devops_status as helper
146
+ import machineconfig.scripts.python.helpers.helpers_devops.devops_status as helper
121
147
  helper.main()
122
148
 
123
149
 
@@ -128,7 +154,7 @@ def navigate():
128
154
  path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
129
155
  from machineconfig.utils.code import exit_then_run_shell_script
130
156
  if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
131
- else: executable = """--with "machineconfig>=7.98,textual" """
157
+ else: executable = f"""--with "{MACHINECONFIG_VERSION},textual" """
132
158
  exit_then_run_shell_script(f"""uv run {executable} {path}""")
133
159
 
134
160
  def readme():
@@ -151,22 +177,47 @@ def readme():
151
177
  console.print(md)
152
178
 
153
179
 
180
+ def buid_docker(
181
+ variant: Annotated[Literal["slim", "ai"], typer.Argument(..., help="Variant to build: 'slim' or 'ai'")] = "slim",
182
+ ) -> None:
183
+ """🧱 `buid_docker` — wrapper for `jobs/shell/docker_build_and_publish.sh`"""
184
+ from pathlib import Path
185
+ import machineconfig
186
+ script_path = Path(machineconfig.__file__).resolve().parent.parent.parent.joinpath("jobs", "shell", "docker_build_and_publish.sh")
187
+ if not script_path.exists():
188
+ typer.echo(f"❌ Script not found: {str(script_path)}")
189
+ raise typer.Exit(code=1)
190
+
191
+ # shell_cmd = f'VARIANT="{variant}" && bash "{str(script_path)}"'\
192
+ from machineconfig.utils.source_of_truth import REPO_ROOT
193
+ shell_cmd = f"""
194
+ export VARIANT="{variant}"
195
+ cd "{str(REPO_ROOT)}"
196
+ bash "{str(script_path)}"
197
+ """
198
+ # Use exit_then_run_shell_script for interactive runs (keeps tty), otherwise run shell script non-interactively
199
+ from machineconfig.utils.code import exit_then_run_shell_script
200
+ exit_then_run_shell_script(shell_cmd, strict=True)
201
+
202
+
154
203
  def get_app():
155
- cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
156
- cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
157
- cli_app.command("u", no_args_is_help=False, hidden=True)(update)
158
- cli_app.command("interactive", no_args_is_help=False, help="🤖 [i] INTERACTIVE configuration of machine.")(interactive)
159
- cli_app.command("i", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
160
- cli_app.command(name="init", no_args_is_help=False, help="🦐 [t] Define and manage configurations")(init)
161
- cli_app.command(name="t", no_args_is_help=False, hidden=True)(init)
162
- cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
163
- cli_app.command("s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
164
- 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)
165
- 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)
166
- cli_app.command("navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
167
- cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
168
-
169
- cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
170
- cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
204
+ cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True, add_help_option=True, add_completion=False)
205
+ cli_app.command(name= "update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
206
+ cli_app.command(name= "u", no_args_is_help=False, hidden=True)(update)
207
+ cli_app.command(name= "interactive", no_args_is_help=False, help="🤖 [ia] INTERACTIVE configuration of machine.")(interactive)
208
+ cli_app.command(name= "ia", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
209
+ cli_app.command(name= "init", no_args_is_help=False, help="🦐 [t] Define and manage configurations")(init)
210
+ cli_app.command(name= "t", no_args_is_help=False, hidden=True)(init)
211
+ cli_app.command(name= "status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
212
+ cli_app.command(name= "s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
213
+ cli_app.command(name= "install", no_args_is_help=False, help="📋 [i] CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.")(install)
214
+ cli_app.command(name= "i", no_args_is_help=False, help="CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates.", hidden=True)(install)
215
+ cli_app.command(name= "navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
216
+ cli_app.command(name= "n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
217
+
218
+ cli_app.command(name= "buid_docker", no_args_is_help=False, help="🧱 [d] Build docker images (wraps jobs/shell/docker_build_and_publish.sh)")(buid_docker)
219
+ cli_app.command(name= "d", no_args_is_help=False, help="Build docker images (wraps jobs/shell/docker_build_and_publish.sh)", hidden=True)(buid_docker)
220
+
221
+ cli_app.command(name= "readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
222
+ cli_app.command(name= "r", no_args_is_help=False, hidden=True)(readme)
171
223
  return cli_app
172
-
@@ -1,6 +1,6 @@
1
1
 
2
2
  import typer
3
- from typing import Annotated
3
+ from typing import Annotated, Literal
4
4
 
5
5
 
6
6
  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'")],
@@ -97,41 +97,55 @@ def share_file_send(path: Annotated[str, typer.Argument(help="Path to the file o
97
97
  code: Annotated[str | None, typer.Option("--code", "-c", help="Codephrase used to connect to relay")] = None,
98
98
  text: Annotated[str | None, typer.Option("--text", "-t", help="Send some text")] = None,
99
99
  qrcode: Annotated[bool, typer.Option("--qrcode", "--qr", help="Show receive code as a qrcode")] = False,
100
+ backend: Annotated[Literal["wormhole", "w", "croc", "c"], typer.Option("--backend", "-b", help="Backend to use")] = "croc",
100
101
  ) -> None:
101
102
  """Send a file using croc with relay server."""
102
- from machineconfig.utils.installer_utils.installer_cli import install_if_missing
103
- install_if_missing(which="croc")
104
- # Get relay server IP from environment or use default
105
- import machineconfig.scripts.python.helpers_network.address as helper
106
- res = helper.select_lan_ipv4(prefer_vpn=False)
107
- if res is None:
108
- typer.echo("❌ Error: Could not determine local LAN IPv4 address for relay.", err=True)
109
- raise typer.Exit(code=1)
110
- local_ip_v4 = res
111
103
  import platform
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
104
 
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}"
105
+ match backend:
106
+ case "wormhole" | "w":
107
+ if code is None: code_line = ""
108
+ else: code_line = f"--code {code}"
109
+ if text is not None: text_line = f"--text '{text}'"
110
+ else: text_line = f"'{path}'"
111
+ script = f"""
112
+ uvx magic-wormhole send {code_line} {text_line}
113
+ """
114
+ print(f"🚀 Sending file: {path}. Use: uvx magic-wormhole receive ")
115
+ case "croc" | "c":
116
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
117
+ install_if_missing(which="croc")
118
+
119
+ # Get relay server IP from environment or use default
120
+ import machineconfig.scripts.python.helpers.helpers_network.address as helper
121
+ res = helper.select_lan_ipv4(prefer_vpn=False)
122
+ if res is None:
123
+ typer.echo("❌ Error: Could not determine local LAN IPv4 address for relay.", err=True)
124
+ raise typer.Exit(code=1)
125
+ local_ip_v4 = res
126
+ relay_port = "443"
127
+ is_windows = platform.system() == "Windows"
128
+ # Build command parts
129
+ relay_arg = f"--relay {local_ip_v4}:{relay_port} --ip {local_ip_v4}:{relay_port}"
130
+ zip_arg = "--zip" if zip_folder else ""
131
+ text_arg = f"--text '{text}'" if text else ""
132
+ qrcode_arg = "--qrcode" if qrcode else ""
133
+ path_arg = f"{path}" if not text else ""
134
+
135
+ if is_windows:
136
+ # Windows PowerShell format
137
+ code_arg = f"--code {code}" if code else ""
138
+ script = f"""croc {relay_arg} send {zip_arg} {code_arg} {qrcode_arg} {text_arg} {path_arg}"""
139
+ else:
140
+ # Linux/macOS Bash format
141
+ if code:
142
+ script = f"""
143
+ export CROC_SECRET="{code}"
130
144
  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}"""
145
+ else:
146
+ script = f"""croc {relay_arg} send {zip_arg} {qrcode_arg} {text_arg} {path_arg}"""
133
147
 
134
148
  typer.echo(f"🚀 Sending file: {path}. Use: devops network receive")
135
149
  from machineconfig.utils.code import exit_then_run_shell_script, print_code
136
150
  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)
151
+ exit_then_run_shell_script(script=script, strict=False)