machineconfig 6.82__py3-none-any.whl → 8.51__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 (461) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/run_cluster.py +1 -1
  3. machineconfig/cluster/remote/run_remote.py +1 -1
  4. machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
  5. machineconfig/cluster/sessions_managers/wt_local.py +17 -222
  6. machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
  7. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  8. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  10. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  12. machineconfig/cluster/sessions_managers/zellij_local.py +1 -1
  13. machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
  14. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  15. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  16. machineconfig/jobs/installer/checks/check_installations.py +133 -0
  17. machineconfig/jobs/installer/checks/install_utils.py +132 -0
  18. machineconfig/jobs/installer/checks/report_utils.py +39 -0
  19. machineconfig/jobs/installer/checks/vt_utils.py +89 -0
  20. machineconfig/jobs/installer/installer_data.json +1500 -310
  21. machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
  22. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  23. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  24. machineconfig/jobs/installer/package_groups.py +62 -91
  25. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  26. machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
  27. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  28. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  29. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  31. machineconfig/jobs/installer/python_scripts/hx.py +214 -0
  32. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
  34. machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
  35. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  37. machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
  38. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  39. machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +428 -0
  43. machineconfig/logger.py +1 -2
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +79 -21
  46. machineconfig/profile/create_links_export.py +87 -36
  47. machineconfig/profile/create_shell_profile.py +92 -127
  48. machineconfig/profile/mapper_data.toml +45 -0
  49. machineconfig/profile/mapper_dotfiles.toml +249 -0
  50. machineconfig/scripts/__init__.py +0 -4
  51. machineconfig/scripts/linux/wrap_mcfg +46 -0
  52. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  53. machineconfig/scripts/python/agents.py +85 -165
  54. machineconfig/scripts/python/ai/initai.py +4 -2
  55. machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
  56. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  57. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  58. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +2 -0
  59. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
  60. machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
  61. machineconfig/scripts/python/ai/solutions/cline/cline.py +1 -1
  62. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  63. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  64. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  65. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +6 -6
  66. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
  67. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  68. machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
  69. machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
  70. machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
  71. machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
  72. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  73. machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
  74. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
  75. machineconfig/scripts/python/cloud.py +58 -11
  76. machineconfig/scripts/python/croshell.py +10 -162
  77. machineconfig/scripts/python/devops.py +73 -36
  78. machineconfig/scripts/python/devops_navigator.py +16 -6
  79. machineconfig/scripts/python/fire_jobs.py +8 -222
  80. machineconfig/scripts/python/ftpx.py +7 -200
  81. machineconfig/scripts/python/graph/cli_graph.json +8743 -0
  82. machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
  83. machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
  84. machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
  85. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  86. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  87. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  88. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  89. machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  90. machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
  91. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
  92. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
  93. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  94. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  95. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  96. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
  97. machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  98. machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
  99. machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
  100. machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
  101. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
  102. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
  103. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
  104. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
  106. machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
  107. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
  108. machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
  109. machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
  110. machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
  111. machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
  112. machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
  113. machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
  114. machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
  115. machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
  116. machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
  117. machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
  118. machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
  119. machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
  120. machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
  121. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
  122. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
  123. machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
  124. machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
  125. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
  126. machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
  127. machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
  128. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
  129. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
  130. machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
  131. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
  132. machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
  133. machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
  134. machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
  135. machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
  136. machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  137. machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
  138. machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
  139. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
  140. machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
  141. machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
  142. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
  143. machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
  144. machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
  145. machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
  146. machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
  147. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
  148. machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
  149. machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
  150. machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
  151. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
  152. machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
  153. machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
  154. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
  155. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
  156. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
  157. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
  158. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
  159. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
  160. machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
  161. machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
  162. machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
  163. machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
  164. machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
  165. machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
  166. machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
  167. machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
  168. machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
  169. machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
  170. machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
  171. machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
  172. machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
  173. machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
  174. machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
  175. machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
  176. machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
  177. machineconfig/scripts/python/mcfg_entry.py +143 -0
  178. machineconfig/scripts/python/msearch.py +26 -0
  179. machineconfig/scripts/python/sessions.py +69 -135
  180. machineconfig/scripts/python/terminal.py +58 -0
  181. machineconfig/scripts/python/utils.py +115 -38
  182. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  183. machineconfig/settings/atuin/config.toml +294 -0
  184. machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -0
  185. machineconfig/settings/broot/conf.toml +1 -1
  186. machineconfig/settings/helix/config.toml +16 -0
  187. machineconfig/settings/helix/languages.toml +13 -4
  188. machineconfig/settings/helix/yazi-picker.sh +12 -0
  189. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  190. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  191. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  192. machineconfig/settings/lf/windows/lfrc +14 -16
  193. machineconfig/settings/linters/.ruff.toml +2 -1
  194. machineconfig/settings/marimo/marimo.toml +1 -1
  195. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  196. machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
  197. machineconfig/settings/shells/bash/init.sh +47 -12
  198. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  199. machineconfig/settings/shells/nushell/config.nu +25 -33
  200. machineconfig/settings/shells/nushell/env.nu +21 -8
  201. machineconfig/settings/shells/nushell/init.nu +138 -0
  202. machineconfig/settings/shells/pwsh/init.ps1 +111 -17
  203. machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
  204. machineconfig/settings/shells/starship/starship.toml +16 -0
  205. machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
  206. machineconfig/settings/shells/wt/settings.json +27 -18
  207. machineconfig/settings/shells/zsh/init.sh +42 -23
  208. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  209. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  210. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  211. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  212. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  213. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  214. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  215. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  216. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  217. machineconfig/settings/television/cable_unix/env.toml +17 -0
  218. machineconfig/settings/television/cable_unix/files.toml +11 -0
  219. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  220. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  221. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  222. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  223. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  224. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  225. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  226. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  227. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  228. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  229. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  230. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  231. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  232. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  233. machineconfig/settings/television/cable_unix/text.toml +17 -0
  234. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  235. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  236. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  237. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  238. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  239. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  240. machineconfig/settings/television/cable_windows/env.toml +17 -0
  241. machineconfig/settings/television/cable_windows/files.toml +14 -0
  242. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  243. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  244. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  245. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  246. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  247. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  248. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  249. machineconfig/settings/television/cable_windows/text.toml +17 -0
  250. machineconfig/settings/tv/config.toml +234 -0
  251. machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
  252. machineconfig/settings/wsl/.wslconfig +5 -30
  253. machineconfig/settings/wt/__init__.py +0 -0
  254. machineconfig/settings/yazi/init.lua +61 -0
  255. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  256. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  257. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  258. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  259. machineconfig/settings/yazi/theme.toml +4 -0
  260. machineconfig/settings/yazi/yazi_linux.toml +94 -0
  261. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  262. machineconfig/settings/zellij/layouts/st.kdl +40 -9
  263. machineconfig/settings/zellij/layouts/st2.kdl +1 -1
  264. machineconfig/setup_linux/__init__.py +2 -2
  265. machineconfig/setup_linux/apps_desktop.sh +8 -27
  266. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  267. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
  268. machineconfig/setup_mac/__init__.py +1 -4
  269. machineconfig/setup_mac/apps_gui.sh +248 -0
  270. machineconfig/setup_windows/__init__.py +2 -5
  271. machineconfig/setup_windows/uv.ps1 +8 -1
  272. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
  273. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
  274. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  275. machineconfig/type_hinting/sql/__init__.py +1 -0
  276. machineconfig/type_hinting/sql/base.py +216 -0
  277. machineconfig/type_hinting/sql/core_schema.py +64 -0
  278. machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
  279. machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
  280. machineconfig/type_hinting/typedict/__init__.py +1 -0
  281. machineconfig/type_hinting/typedict/ast_utils.py +130 -0
  282. machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
  283. machineconfig/type_hinting/typedict/generators.py +231 -0
  284. machineconfig/type_hinting/typedict/polars_schema.py +24 -0
  285. machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
  286. machineconfig/utils/accessories.py +31 -4
  287. machineconfig/utils/code.py +163 -51
  288. machineconfig/utils/files/ascii_art.py +11 -15
  289. machineconfig/utils/files/headers.py +6 -7
  290. machineconfig/utils/files/read.py +8 -1
  291. machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
  292. machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
  293. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  294. machineconfig/utils/installer_utils/installer_class.py +53 -102
  295. machineconfig/utils/installer_utils/installer_cli.py +161 -0
  296. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  297. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
  298. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
  299. machineconfig/utils/io.py +94 -9
  300. machineconfig/utils/links.py +56 -38
  301. machineconfig/utils/meta.py +38 -21
  302. machineconfig/utils/options.py +81 -23
  303. machineconfig/utils/options_utils/__init__.py +0 -0
  304. machineconfig/utils/options_utils/options_tv_linux.py +211 -0
  305. machineconfig/utils/options_utils/options_tv_windows.py +88 -0
  306. machineconfig/utils/options_utils/tv_options.py +37 -0
  307. machineconfig/utils/path_extended.py +52 -102
  308. machineconfig/utils/path_helper.py +76 -23
  309. machineconfig/utils/procs.py +1 -1
  310. machineconfig/utils/scheduler.py +26 -53
  311. machineconfig/utils/scheduling.py +0 -2
  312. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  313. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  314. machineconfig/utils/source_of_truth.py +6 -1
  315. machineconfig/utils/ssh.py +216 -419
  316. machineconfig/utils/ssh_utils/abc.py +5 -0
  317. machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
  318. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  319. machineconfig/utils/ssh_utils/utils.py +158 -0
  320. machineconfig/utils/ssh_utils/wsl.py +147 -0
  321. machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
  322. machineconfig/utils/terminal.py +1 -0
  323. machineconfig/utils/upgrade_packages.py +107 -35
  324. machineconfig/utils/ve.py +12 -4
  325. machineconfig-8.51.dist-info/METADATA +140 -0
  326. machineconfig-8.51.dist-info/RECORD +543 -0
  327. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
  328. machineconfig/jobs/installer/check_installations.py +0 -248
  329. machineconfig/jobs/installer/custom/hx.py +0 -140
  330. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  331. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  332. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  333. machineconfig/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
  334. machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
  335. machineconfig/profile/backup.toml +0 -49
  336. machineconfig/profile/mapper.toml +0 -256
  337. machineconfig/scripts/linux/fzf2g +0 -21
  338. machineconfig/scripts/linux/fzfag +0 -17
  339. machineconfig/scripts/linux/fzffg +0 -25
  340. machineconfig/scripts/linux/fzfrga +0 -21
  341. machineconfig/scripts/linux/mcfgs +0 -38
  342. machineconfig/scripts/linux/other/share_smb +0 -1
  343. machineconfig/scripts/linux/other/switch_ip +0 -20
  344. machineconfig/scripts/linux/skrg +0 -4
  345. machineconfig/scripts/linux/warp-cli.sh +0 -122
  346. machineconfig/scripts/linux/z_ls +0 -104
  347. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  348. machineconfig/scripts/python/helpers_devops/cli_config.py +0 -120
  349. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
  350. machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
  351. machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
  352. machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
  353. machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
  354. machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
  355. machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
  356. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
  357. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
  358. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  359. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  360. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  361. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  362. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  363. machineconfig/scripts/python/helpers_navigator/__init__.py +0 -20
  364. machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
  365. machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
  366. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  367. machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
  368. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  369. machineconfig/scripts/python/mcfg.py +0 -48
  370. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  371. machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
  372. machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
  373. machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
  374. machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
  375. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  376. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  377. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  378. machineconfig/scripts/windows/fzfrga.bat +0 -20
  379. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  380. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  381. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  382. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  383. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  384. machineconfig/settings/yazi/yazi.toml +0 -4
  385. machineconfig/setup_linux/apps.sh +0 -66
  386. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  387. machineconfig/setup_linux/others/mint_keyboard_shortcuts.sh +0 -30
  388. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  389. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  390. machineconfig/setup_mac/apps.sh +0 -73
  391. machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
  392. machineconfig/setup_windows/apps.ps1 +0 -62
  393. machineconfig/setup_windows/others/obs.ps1 +0 -4
  394. machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
  395. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  396. machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
  397. machineconfig/utils/installer_utils/installer.py +0 -225
  398. machineconfig/utils/tst.py +0 -20
  399. machineconfig-6.82.dist-info/METADATA +0 -82
  400. machineconfig-6.82.dist-info/RECORD +0 -441
  401. machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
  402. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  403. machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
  404. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  405. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  406. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  407. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  408. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  409. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  410. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  411. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  412. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
  413. machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
  414. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  415. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  416. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  417. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  418. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  419. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  420. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  421. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  422. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  423. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  424. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  425. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  426. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  427. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  428. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  429. machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
  430. machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
  431. machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
  432. machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
  433. machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
  434. machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
  435. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
  436. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
  437. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
  438. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
  439. machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
  440. machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
  441. machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
  442. /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
  443. /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
  444. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
  445. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
  446. /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
  447. /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
  448. /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
  449. /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  450. /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
  451. /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
  452. /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
  453. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
  454. /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
  455. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
  456. /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
  457. /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
  458. /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
  459. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  460. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
  461. {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,197 @@
1
+
2
+ import typer
3
+ from typing import Annotated, Literal
4
+ from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION
5
+
6
+
7
+ def copy_both_assets():
8
+ import machineconfig.profile.create_helper as create_helper
9
+ create_helper.copy_assets_to_machine(which="scripts")
10
+ create_helper.copy_assets_to_machine(which="settings")
11
+
12
+
13
+ def init(which: Annotated[Literal["init", "ia", "live", "wrap"], typer.Argument(..., help="Comma-separated list of script names to run all initialization scripts.")] = "init",
14
+ run: Annotated[bool, typer.Option("--run/--no-run", "-r/-nr", help="Run the script after displaying it.")] = False,
15
+ ) -> None:
16
+ import platform
17
+ if platform.system() == "Linux" or platform.system() == "Darwin":
18
+ match which:
19
+ case "init":
20
+ import machineconfig.settings as module
21
+ from pathlib import Path
22
+ if platform.system() == "Darwin":
23
+ init_path = Path(module.__file__).parent.joinpath("shells", "zsh", "init.sh")
24
+ else: init_path = Path(module.__file__).parent.joinpath("shells", "bash", "init.sh")
25
+ script = init_path.read_text(encoding="utf-8")
26
+ case "ia":
27
+ from machineconfig.setup_linux import INTERACTIVE as script_path
28
+ script = script_path.read_text(encoding="utf-8")
29
+ case "live":
30
+ from machineconfig.setup_linux import LIVE as script_path
31
+ script = script_path.read_text(encoding="utf-8")
32
+ case _:
33
+ typer.echo("Unsupported shell script for Linux.")
34
+ raise typer.Exit(code=1)
35
+
36
+ elif platform.system() == "Windows":
37
+ match which:
38
+ case "init":
39
+ import machineconfig.settings as module
40
+ from pathlib import Path
41
+ init_path = Path(module.__file__).parent.joinpath("shells", "powershell", "init.ps1")
42
+ script = init_path.read_text(encoding="utf-8")
43
+ case "ia":
44
+ from machineconfig.setup_windows import INTERACTIVE as script_path
45
+ script = script_path.read_text(encoding="utf-8")
46
+ case "live":
47
+ from machineconfig.setup_windows import LIVE as script_path
48
+ script = script_path.read_text(encoding="utf-8")
49
+ case _:
50
+ typer.echo("Unsupported shell script for Windows.")
51
+ raise typer.Exit(code=1)
52
+ else:
53
+ # raise NotImplementedError("Unsupported platform")
54
+ typer.echo("Unsupported platform for init scripts.")
55
+ raise typer.Exit(code=1)
56
+ if run:
57
+ from machineconfig.utils.code import exit_then_run_shell_script
58
+ exit_then_run_shell_script(script, strict=True)
59
+ else:
60
+ print(script)
61
+
62
+
63
+ 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,
64
+ 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,
65
+ ):
66
+ """🔄 UPDATE uv and machineconfig"""
67
+ from pathlib import Path
68
+ if Path.home().joinpath("code", "machineconfig").exists():
69
+ shell_script = """
70
+ uv self update
71
+ cd ~/code/machineconfig
72
+ git pull
73
+ uv tool install --no-cache --upgrade --editable $HOME/code/machineconfig
74
+ """
75
+ else:
76
+ shell_script = """
77
+ uv self update
78
+ uv tool install --no-cache --upgrade machineconfig
79
+ """
80
+ import platform
81
+ if platform.system() == "Windows":
82
+ from machineconfig.utils.code import exit_then_run_shell_script, get_uv_command_executing_python_script
83
+ from machineconfig.utils.meta import lambda_to_python_script
84
+ python_script = lambda_to_python_script(lambda: copy_both_assets(),
85
+ in_global=True, import_module=False)
86
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=python_script, uv_with=["machineconfig"], uv_project_dir=None)
87
+ exit_then_run_shell_script(shell_script + "\n" + uv_command, strict=True)
88
+ else:
89
+ from machineconfig.utils.code import run_shell_script
90
+ run_shell_script(shell_script, display_script=True, clean_env=False)
91
+ if copy_assets:
92
+ copy_both_assets()
93
+ if link_public_configs:
94
+ import machineconfig.profile.create_links_export as create_links_export
95
+ create_links_export.main_from_parser(sensitivity="public", method="copy", on_conflict="overwrite-default-path", which="all")
96
+
97
+
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
+ ):
102
+ """📋 CLONE machienconfig locally and incorporate to shell profile for faster execution and nightly updates."""
103
+ from machineconfig.utils.code import run_shell_script, get_uv_command, get_shell_script_running_lambda_function, exit_then_run_shell_script
104
+ from pathlib import Path
105
+ import platform
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)
122
+ else:
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
+ """)
136
+
137
+
138
+
139
+ def interactive():
140
+ """🤖 INTERACTIVE configuration of machine."""
141
+ from machineconfig.scripts.python.helpers.helpers_devops.interactive import main
142
+ main()
143
+
144
+ def status():
145
+ """📊 STATUS of machine, shell profile, apps, symlinks, dotfiles, etc."""
146
+ import machineconfig.scripts.python.helpers.helpers_devops.devops_status as helper
147
+ helper.main()
148
+
149
+
150
+ def navigate():
151
+ """📚 NAVIGATE command structure with TUI"""
152
+ import machineconfig.scripts.python as navigator
153
+ from pathlib import Path
154
+ path = Path(navigator.__file__).resolve().parent.joinpath("devops_navigator.py")
155
+ from machineconfig.utils.code import exit_then_run_shell_script
156
+ if Path.home().joinpath("code/machineconfig").exists(): executable = f"""--project "{str(Path.home().joinpath("code/machineconfig"))}" --with textual"""
157
+ else: executable = f"""--with "{MACHINECONFIG_VERSION},textual" """
158
+ exit_then_run_shell_script(f"""uv run {executable} {path}""")
159
+
160
+ def readme():
161
+ from rich.console import Console
162
+ from rich.markdown import Markdown
163
+ import requests
164
+
165
+ # URL of the raw README.md file
166
+ url_readme = "https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/README.md"
167
+
168
+ # Fetch the content
169
+ response = requests.get(url_readme)
170
+ response.raise_for_status() # Raise an error for bad responses
171
+
172
+ # Parse markdown
173
+ md = Markdown(response.text)
174
+
175
+ # Render in terminal
176
+ console = Console()
177
+ console.print(md)
178
+
179
+
180
+ def get_app():
181
+ cli_app = typer.Typer(help="🔄 [s] self operations subcommands", no_args_is_help=True, add_help_option=True, add_completion=False)
182
+ cli_app.command("update", no_args_is_help=False, help="🔄 [u] UPDATE machineconfig")(update)
183
+ cli_app.command("u", no_args_is_help=False, hidden=True)(update)
184
+ cli_app.command("interactive", no_args_is_help=False, help="🤖 [ia] INTERACTIVE configuration of machine.")(interactive)
185
+ cli_app.command("ia", no_args_is_help=False, help="INTERACTIVE configuration of machine.", hidden=True)(interactive)
186
+ cli_app.command(name="init", no_args_is_help=False, help="🦐 [t] Define and manage configurations")(init)
187
+ cli_app.command(name="t", no_args_is_help=False, hidden=True)(init)
188
+ cli_app.command("status", no_args_is_help=False, help="📊 [s] STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.")(status)
189
+ cli_app.command("s", no_args_is_help=False, help="STATUS of machine, shell profile, apps, symlinks, dotfiles, etc.", hidden=True)(status)
190
+ 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)
191
+ 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)
192
+ cli_app.command("navigate", no_args_is_help=False, help="📚 [n] NAVIGATE command structure with TUI")(navigate)
193
+ cli_app.command("n", no_args_is_help=False, help="NAVIGATE command structure with TUI", hidden=True)(navigate)
194
+
195
+ cli_app.command("readme", no_args_is_help=False, help="📚 [r] render readme markdown in terminal.")(readme)
196
+ cli_app.command("r", no_args_is_help=False, hidden=True)(readme)
197
+ return cli_app
@@ -0,0 +1,151 @@
1
+
2
+ import typer
3
+ from typing import Annotated, Literal
4
+
5
+
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'")],
7
+ ) -> None:
8
+ """Receive a file using croc with relay server.
9
+ Usage examples:
10
+ devops network receive 7121-donor-olympic-bicycle
11
+ devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle
12
+ devops network receive -- croc --relay 10.17.62.206:443 7121-donor-olympic-bicycle
13
+ """
14
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
15
+ install_if_missing(which="croc")
16
+ import platform
17
+ import sys
18
+
19
+ is_windows = platform.system() == "Windows"
20
+
21
+ # If no args passed via typer, try to get them from sys.argv directly
22
+ # This handles the case where -- was used and arguments weren't parsed by typer
23
+ if not code_args or (len(code_args) == 1 and code_args[0] in ['--relay', 'croc']):
24
+ # Find the index of 'rx' or 'receive' in sys.argv and get everything after it
25
+ try:
26
+ for i, arg in enumerate(sys.argv):
27
+ if arg in ['rx', 'receive', 'r'] and i + 1 < len(sys.argv):
28
+ code_args = sys.argv[i + 1:]
29
+ break
30
+ except Exception:
31
+ pass
32
+
33
+ # Join all arguments
34
+ input_str = " ".join(code_args)
35
+ tokens = input_str.split()
36
+
37
+ # Parse input to extract relay server and secret code
38
+ relay_server: str | None = None
39
+ secret_code: str | None = None
40
+
41
+ # Remove 'croc' and 'export' from tokens if present
42
+ tokens = [t for t in tokens if t not in ['croc', 'export']]
43
+
44
+ # Look for --relay flag and capture next token
45
+ relay_idx = -1
46
+ for i, token in enumerate(tokens):
47
+ if token == '--relay' and i + 1 < len(tokens):
48
+ relay_server = tokens[i + 1]
49
+ relay_idx = i
50
+ break
51
+
52
+ # Look for CROC_SECRET= prefix in any token
53
+ for token in tokens:
54
+ if token.startswith('CROC_SECRET='):
55
+ secret_code = token.split('=', 1)[1].strip('"').strip("'")
56
+ break
57
+
58
+ # If no secret code found yet, look for tokens with dashes (typical pattern: number-word-word-word)
59
+ # Skip relay server and relay flag
60
+ if not secret_code:
61
+ for i, token in enumerate(tokens):
62
+ if '-' in token and not token.startswith('-') and token != relay_server:
63
+ if relay_idx >= 0 and (i == relay_idx or i == relay_idx + 1):
64
+ continue # Skip relay server parts
65
+ secret_code = token
66
+ break
67
+
68
+ if not secret_code and not relay_server:
69
+ typer.echo(f"❌ Error: Could not parse croc receive code from input: {input_str}", err=True)
70
+ typer.echo("Usage:", err=True)
71
+ typer.echo(" devops network receive 7121-donor-olympic-bicycle", err=True)
72
+ typer.echo(" devops network receive -- --relay 10.17.62.206:443 7121-donor-olympic-bicycle", err=True)
73
+ raise typer.Exit(code=1)
74
+
75
+ # Build the appropriate script for current OS
76
+ if is_windows:
77
+ # Windows PowerShell format: croc --relay server:port secret-code --yes
78
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
79
+ code_arg = f"{secret_code}" if secret_code else ""
80
+ script = f"""croc {relay_arg} {code_arg} --yes""".strip()
81
+ else:
82
+ # Linux/macOS Bash format: CROC_SECRET="secret-code" croc --relay server:port --yes
83
+ relay_arg = f"--relay {relay_server}" if relay_server else ""
84
+ if secret_code:
85
+ script = f"""export CROC_SECRET="{secret_code}"
86
+ croc {relay_arg} --yes""".strip()
87
+ else:
88
+ script = f"""croc {relay_arg} --yes""".strip()
89
+
90
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
91
+ print_code(code=script, desc="🚀 Receiving file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
92
+ exit_then_run_shell_script(script=script, strict=False)
93
+
94
+
95
+ def share_file_send(path: Annotated[str, typer.Argument(help="Path to the file or directory to send")],
96
+ zip_folder: Annotated[bool, typer.Option("--zip", help="Zip folder before sending")] = False,
97
+ code: Annotated[str | None, typer.Option("--code", "-c", help="Codephrase used to connect to relay")] = None,
98
+ text: Annotated[str | None, typer.Option("--text", "-t", help="Send some text")] = None,
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",
101
+ ) -> None:
102
+ """Send a file using croc with relay server."""
103
+ import platform
104
+
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}"
144
+ 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}"""
147
+
148
+ typer.echo(f"🚀 Sending file: {path}. Use: devops network receive")
149
+ from machineconfig.utils.code import exit_then_run_shell_script, print_code
150
+ print_code(code=script, desc="🚀 sending file with croc", lexer="bash" if platform.system() != "Windows" else "powershell")
151
+ exit_then_run_shell_script(script=script, strict=False)
@@ -0,0 +1,125 @@
1
+ from pathlib import Path
2
+ from typing import Optional, Annotated
3
+ from machineconfig.scripts.python.helpers.helpers_devops.cli_share_file import share_file_receive, share_file_send
4
+ from machineconfig.utils.accessories import display_with_flashy_style
5
+ import typer
6
+
7
+
8
+ def web_file_explorer(
9
+ path: Annotated[str, typer.Argument(help="Path to the file or directory to share")],
10
+ port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the share server on (default: 8080)")] = None,
11
+ username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for share access (default: current user)")] = None,
12
+ no_auth: Annotated[bool, typer.Option("--no-auth", "-na", help="Disable authentication for share access")] = False,
13
+ password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for share access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
14
+ bind_address: Annotated[str, typer.Option("--bind", "-a", help="Address to bind the server to")] = "0.0.0.0",
15
+ over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the share server over the internet using ngrok")] = False,
16
+ backend: Annotated[str, typer.Option("--backend", "-b", help="Backend to use: filebrowser (default), miniserve, qrcp, or easy-sharing")] = "miniserve",
17
+ ) -> None:
18
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
19
+
20
+ if backend not in ["filebrowser", "miniserve", "qrcp", "easy-sharing"]:
21
+ typer.echo(f"❌ ERROR: Invalid backend '{backend}'. Must be one of: filebrowser, miniserve, qrcp, easy-sharing", err=True)
22
+ raise typer.Exit(code=1)
23
+ install_if_missing(which=backend)
24
+ if over_internet:
25
+ install_if_missing(which="ngrok")
26
+ if password is None and not no_auth:
27
+ pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
28
+ if pwd_path.exists():
29
+ password = pwd_path.read_text(encoding="utf-8").strip()
30
+ if username is None:
31
+ import getpass
32
+ username = getpass.getuser()
33
+ # else:
34
+ # 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)
35
+ # raise typer.Exit(code=1)
36
+
37
+
38
+ if port is None:
39
+ port = 8080
40
+
41
+ import machineconfig.scripts.python.helpers.helpers_network.address as helper
42
+ res = helper.select_lan_ipv4(prefer_vpn=False)
43
+ if res is None:
44
+ typer.echo("❌ ERROR: Could not determine local LAN IPv4 address for share server.", err=True)
45
+ raise typer.Exit(code=1)
46
+ local_ip_v4 = res
47
+
48
+ protocol = "http"
49
+ display_with_flashy_style(msg=f"{protocol}://{local_ip_v4}:{port}/", title="Local Network Share URL")
50
+
51
+ path_obj = Path(path).resolve()
52
+ if not path_obj.exists():
53
+ typer.echo(f"❌ ERROR: Path does not exist: {path}", err=True)
54
+ raise typer.Exit(code=1)
55
+
56
+ if backend == "filebrowser":
57
+ db_path = Path.home().joinpath(".config/filebrowser/filebrowser.db")
58
+ db_path.parent.mkdir(parents=True, exist_ok=True)
59
+ command = f"""
60
+ filebrowser users add {username} "{password}" --database {db_path}
61
+ filebrowser --address {bind_address} --port {port} --root "{path_obj}" --database {db_path}
62
+ """
63
+ elif backend == "miniserve":
64
+ if username and password:
65
+ auth_line = f"""--auth "{username}:{password}" """
66
+ else:
67
+ auth_line = ""
68
+ command = f"""miniserve --port {port} --interfaces {bind_address} {auth_line} --upload-files --mkdir --enable-tar --enable-tar-gz --enable-zip --qrcode "{path_obj}" """
69
+ elif backend == "easy-sharing":
70
+ if username is None and password is None:
71
+ auth_line = ""
72
+ else:
73
+ auth_line = f'--username "{username}" --password "{password}"'
74
+ command = f"""easy-sharing --port {port} {auth_line} "{path_obj}" """
75
+ elif backend == "qrcp":
76
+ command = f"""qrcp --port {port} --bind {bind_address} "{path_obj}" """
77
+ else:
78
+ typer.echo(f"❌ ERROR: Unknown backend '{backend}'", err=True)
79
+ raise typer.Exit(code=1)
80
+
81
+ from machineconfig.utils.code import exit_then_run_shell_script
82
+ exit_then_run_shell_script(script=command, strict=False)
83
+ # import subprocess
84
+ # import time
85
+ # server_process: subprocess.Popen[bytes]
86
+ # server_process = subprocess.Popen(command, shell=True)
87
+ # processes = [server_process]
88
+ # if over_internet:
89
+ # ngrok_process = subprocess.Popen(f"ngrok http {port}", shell=True)
90
+ # processes.append(ngrok_process)
91
+ # time.sleep(3)
92
+ # try:
93
+ # import requests
94
+ # response = requests.get("http://localhost:4040/api/tunnels")
95
+ # data = response.json()
96
+ # public_url = data['tunnels'][0]['public_url']
97
+ # print(f"🌐 Ngrok tunnel ready: {public_url}")
98
+ # except Exception as e:
99
+ # print(f"Could not retrieve ngrok URL: {e}")
100
+
101
+ # try:
102
+ # while True:
103
+ # print(f"Share server ({backend}) is running. Press Ctrl+C to stop.")
104
+ # time.sleep(2)
105
+ # except KeyboardInterrupt:
106
+ # print("\nTerminating processes...")
107
+ # for p in processes:
108
+ # p.terminate()
109
+ # p.wait()
110
+
111
+
112
+ def get_share_file_app():
113
+ app = typer.Typer(name="share-file", help="Send or receive files using croc with relay server.")
114
+ app.command(name="send", no_args_is_help=True, hidden=False, help="[s] send files from here.")(share_file_send)
115
+ app.command(name="s", no_args_is_help=True, hidden=True, help="[s] send files from here.")(share_file_send)
116
+ app.command(name="receive", no_args_is_help=True, hidden=False, help="[r] receive files to here.")(share_file_receive)
117
+ app.command(name="r", no_args_is_help=True, hidden=True, help="[r] receive files to here.")(share_file_receive)
118
+ return app
119
+
120
+ def main_with_parser():
121
+ typer.run(web_file_explorer)
122
+
123
+
124
+ if __name__ == "__main__":
125
+ pass
@@ -1,10 +1,6 @@
1
- from pathlib import Path
1
+
2
2
  from typing import Optional, Annotated
3
3
  import typer
4
- import subprocess
5
- import time
6
-
7
-
8
4
 
9
5
  """
10
6
  reference:
@@ -17,13 +13,11 @@ reference:
17
13
 
18
14
  def display_terminal_url(local_ip_v4: str, port: int, protocol: str = "http") -> None:
19
15
  """Display a flashy, unmissable terminal URL announcement."""
20
-
21
16
  from rich.console import Console
22
17
  from rich.panel import Panel
23
18
  from rich.text import Text
24
19
  from rich.align import Align
25
20
  console = Console()
26
-
27
21
  # Create the main message with styling
28
22
  url_text = Text(f"{protocol}://{local_ip_v4}:{port}", style="bold bright_cyan underline")
29
23
  message = Text.assemble(
@@ -42,17 +36,17 @@ def display_terminal_url(local_ip_v4: str, port: int, protocol: str = "http") ->
42
36
  padding=(1, 2),
43
37
  expand=False
44
38
  )
45
-
46
39
  # Print with extra spacing and attention-grabbing elements
47
40
  # console.print("\n" + "🔥" * 60 + "\n", style="bright_red bold")
48
41
  console.print(panel)
49
42
  # console.print("🔥" * 60 + "\n", style="bright_red bold")
50
43
 
51
44
 
52
- def main(
45
+ def share_terminal(
53
46
  port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the terminal server on (default: 7681)")] = None,
54
47
  username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for terminal access (default: current user)")] = None,
55
48
  password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for terminal access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None,
49
+ no_auth: Annotated[bool, typer.Option("--no-auth", "-n", help="Disable authentication (not recommended)")] = False,
56
50
  start_command: Annotated[Optional[str], typer.Option("--start-command", "-s", help="Command to run on terminal start (default: bash/powershell)")] = None,
57
51
  ssl: Annotated[bool, typer.Option("--ssl", "-S", help="Enable SSL")] = False,
58
52
  ssl_cert: Annotated[Optional[str], typer.Option("--ssl-cert", "-C", help="SSL certificate file path")] = None,
@@ -60,19 +54,22 @@ def main(
60
54
  ssl_ca: Annotated[Optional[str], typer.Option("--ssl-ca", "-A", help="SSL CA file path for client certificate verification")] = None,
61
55
  over_internet: Annotated[bool, typer.Option("--over-internet", "-i", help="Expose the terminal over the internet using ngrok")] = False
62
56
  ) -> None:
63
- from machineconfig.utils.installer_utils.installer import install_if_missing
57
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
64
58
  install_if_missing("ttyd")
65
59
  if over_internet: install_if_missing("ngrok")
66
60
 
61
+ from pathlib import Path
67
62
  if username is None:
68
63
  import getpass
69
64
  username = getpass.getuser()
70
- if password is None:
65
+ if password is None and not no_auth:
71
66
  pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
72
67
  if pwd_path.exists():
73
68
  password = pwd_path.read_text(encoding="utf-8").strip()
74
69
  else:
75
- raise ValueError("Password not provided and default password file does not exist.")
70
+ # raise ValueError("Password not provided and default password file does not exist.")
71
+ print("❌ Error: Password not provided and default password file does not exist.")
72
+ raise typer.Exit(code=1)
76
73
 
77
74
  if port is None:
78
75
  port = 7681 # Default port for ttyd
@@ -89,18 +86,22 @@ def main(
89
86
  key_path = Path(ssl_key)
90
87
 
91
88
  if not cert_path.exists():
92
- raise FileNotFoundError(f"SSL certificate file not found: {ssl_cert}")
89
+ print(f"❌ Error: SSL certificate file not found: {ssl_cert}")
90
+ raise typer.Exit(code=1)
93
91
  if not key_path.exists():
94
- raise FileNotFoundError(f"SSL key file not found: {ssl_key}")
92
+ print(f"❌ Error: SSL key file not found: {ssl_key}")
93
+ raise typer.Exit(code=1)
95
94
 
96
95
  if ssl_ca and not Path(ssl_ca).exists():
97
- raise FileNotFoundError(f"SSL CA file not found: {ssl_ca}")
96
+ print(f"❌ Error: SSL CA file not found: {ssl_ca}")
97
+ raise typer.Exit(code=1)
98
98
 
99
- import socket
100
- s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
101
- s.connect(('8.8.8.8',80))
102
- local_ip_v4 = s.getsockname()[0]
103
- s.close()
99
+ import machineconfig.scripts.python.helpers.helpers_network.address as helper
100
+ res = helper.select_lan_ipv4(prefer_vpn=False)
101
+ if res is None:
102
+ print("❌ Error: Could not determine local LAN IPv4 address for terminal.")
103
+ raise typer.Exit(code=1)
104
+ local_ip_v4 = res
104
105
 
105
106
  # Display the flashy terminal announcement
106
107
  protocol = "https" if ssl else "http"
@@ -119,7 +120,10 @@ def main(
119
120
  start_command = "powershell"
120
121
  else:
121
122
  start_command = "bash"
122
-
123
+
124
+ import subprocess
125
+ import time
126
+
123
127
  ttyd_cmd = f"ttyd --writable -t enableSixel=true {ssl_args} --port {port} --credential \"{username}:{password}\" -t 'theme={{\"background\": \"black\"}}' {start_command}"
124
128
  ttyd_process = subprocess.Popen(ttyd_cmd, shell=True)
125
129
  processes = [ttyd_process]
@@ -149,7 +153,7 @@ def main(
149
153
 
150
154
 
151
155
  def main_with_parser():
152
- typer.run(main)
156
+ typer.run(share_terminal)
153
157
 
154
158
 
155
159
  if __name__ == "__main__":