machineconfig 5.15__py3-none-any.whl → 7.98__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 (472) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/cloud_manager.py +1 -1
  3. machineconfig/cluster/remote/distribute.py +0 -1
  4. machineconfig/cluster/remote/file_manager.py +0 -2
  5. machineconfig/cluster/remote/script_execution.py +0 -1
  6. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  7. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  8. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  9. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  10. machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
  11. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  12. machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
  13. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  14. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  17. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  18. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  19. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  20. machineconfig/cluster/sessions_managers/zellij_local_manager.py +25 -170
  21. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  22. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
  23. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  24. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  25. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  26. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  31. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  32. machineconfig/jobs/installer/custom/boxes.py +61 -0
  33. machineconfig/jobs/installer/custom/hx.py +76 -19
  34. machineconfig/jobs/installer/custom/yazi.py +119 -0
  35. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  36. machineconfig/jobs/installer/custom_dev/brave.py +5 -9
  37. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  38. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  39. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  40. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  41. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
  42. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  43. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  44. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  45. machineconfig/jobs/installer/installer_data.json +1487 -229
  46. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  47. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  48. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  49. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  50. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  51. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  52. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  53. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  54. machineconfig/jobs/installer/linux_scripts/q.sh +10 -6
  55. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  56. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  57. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  58. machineconfig/jobs/installer/package_groups.py +106 -177
  59. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  60. machineconfig/logger.py +0 -1
  61. machineconfig/profile/backup.toml +49 -0
  62. machineconfig/profile/bash_shell_profiles.md +11 -0
  63. machineconfig/profile/create_helper.py +62 -0
  64. machineconfig/profile/create_links.py +288 -0
  65. machineconfig/profile/create_links_export.py +100 -0
  66. machineconfig/profile/create_shell_profile.py +147 -0
  67. machineconfig/profile/mapper.toml +263 -0
  68. machineconfig/scripts/__init__.py +0 -4
  69. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  70. machineconfig/scripts/linux/wrap_mcfg +46 -0
  71. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  72. machineconfig/scripts/python/agents.py +123 -117
  73. machineconfig/scripts/python/ai/initai.py +3 -28
  74. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  75. machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
  76. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  77. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  78. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  79. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  80. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  81. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  82. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  83. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
  84. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  85. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  86. machineconfig/scripts/python/ai/solutions/generic.py +28 -5
  87. machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
  88. machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
  89. machineconfig/scripts/python/cloud.py +29 -0
  90. machineconfig/scripts/python/croshell.py +137 -113
  91. machineconfig/scripts/python/devops.py +61 -101
  92. machineconfig/scripts/python/devops_navigator.py +6 -0
  93. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  94. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  95. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  96. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  97. machineconfig/scripts/python/fire_jobs.py +110 -150
  98. machineconfig/scripts/python/ftpx.py +51 -24
  99. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  100. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  101. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  102. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  103. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  104. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  105. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  106. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  107. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  108. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  109. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  110. machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
  111. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  112. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  113. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  114. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  115. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  116. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +29 -35
  117. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  118. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  119. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  120. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
  121. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  122. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  123. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  124. machineconfig/scripts/python/helpers_devops/cli_nw.py +214 -0
  125. machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
  126. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  127. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  128. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  129. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
  130. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  131. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  132. machineconfig/scripts/python/helpers_devops/devops_status.py +499 -0
  133. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  134. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  135. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  136. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +3 -3
  137. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  138. machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
  139. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  140. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  141. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -0
  142. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  143. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  144. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  145. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  146. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  147. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  148. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  149. machineconfig/scripts/python/helpers_navigator/command_tree.py +620 -0
  150. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  151. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  152. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  153. machineconfig/scripts/python/helpers_network/__init__.py +0 -0
  154. machineconfig/scripts/python/helpers_network/address.py +132 -0
  155. machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
  156. machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
  157. machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
  158. machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
  159. machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
  160. machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
  161. machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
  162. machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
  163. machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
  164. machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
  165. machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
  166. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  167. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  168. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  169. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  170. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  171. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  172. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  173. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  174. machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  175. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  176. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  177. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  178. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +65 -0
  179. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  180. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  181. machineconfig/scripts/python/interactive.py +64 -84
  182. machineconfig/scripts/python/mcfg_entry.py +58 -0
  183. machineconfig/scripts/python/msearch.py +71 -0
  184. machineconfig/scripts/python/sessions.py +119 -45
  185. machineconfig/scripts/python/terminal.py +133 -0
  186. machineconfig/scripts/python/utils.py +64 -0
  187. machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -0
  188. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  189. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  190. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  191. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  192. machineconfig/settings/broot/br.sh +0 -4
  193. machineconfig/settings/broot/conf.toml +1 -1
  194. machineconfig/settings/helix/config.toml +16 -0
  195. machineconfig/settings/helix/languages.toml +13 -4
  196. machineconfig/settings/helix/yazi-picker.sh +12 -0
  197. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  198. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  199. machineconfig/settings/lf/linux/lfrc +10 -12
  200. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  201. machineconfig/settings/lf/windows/lfrc +18 -38
  202. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  203. machineconfig/settings/linters/.ruff.toml +1 -1
  204. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  205. machineconfig/settings/marimo/marimo.toml +80 -0
  206. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  207. machineconfig/settings/pistol/pistol.conf +1 -1
  208. machineconfig/settings/shells/bash/init.sh +82 -31
  209. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  210. machineconfig/settings/shells/nushell/config.nu +2 -35
  211. machineconfig/settings/shells/nushell/env.nu +45 -6
  212. machineconfig/settings/shells/nushell/init.nu +314 -0
  213. machineconfig/settings/shells/pwsh/init.ps1 +61 -43
  214. machineconfig/settings/shells/starship/starship.toml +16 -0
  215. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  216. machineconfig/settings/shells/wt/settings.json +32 -17
  217. machineconfig/settings/shells/zsh/init.sh +89 -0
  218. machineconfig/settings/svim/linux/init.toml +0 -4
  219. machineconfig/settings/svim/windows/init.toml +0 -3
  220. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  221. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  222. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  223. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  224. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  225. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  226. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  227. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  228. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  229. machineconfig/settings/television/cable_unix/env.toml +17 -0
  230. machineconfig/settings/television/cable_unix/files.toml +11 -0
  231. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  232. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  233. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  234. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  235. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  236. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  237. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  238. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  239. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  240. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  241. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  242. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  243. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  244. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  245. machineconfig/settings/television/cable_unix/text.toml +17 -0
  246. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  247. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  248. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  249. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  250. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  251. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  252. machineconfig/settings/television/cable_windows/env.toml +17 -0
  253. machineconfig/settings/television/cable_windows/files.toml +14 -0
  254. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  255. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  256. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  257. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  258. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  259. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  260. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  261. machineconfig/settings/television/cable_windows/text.toml +17 -0
  262. machineconfig/settings/yazi/init.lua +61 -0
  263. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  264. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  265. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  266. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  267. machineconfig/settings/yazi/theme.toml +4 -0
  268. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  269. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  270. machineconfig/setup_linux/__init__.py +11 -0
  271. machineconfig/setup_linux/apps_desktop.sh +89 -0
  272. machineconfig/setup_linux/apps_gui.sh +64 -0
  273. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  274. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  275. machineconfig/setup_linux/uv.sh +15 -0
  276. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  277. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  278. machineconfig/setup_mac/__init__.py +16 -0
  279. machineconfig/setup_mac/apps_gui.sh +248 -0
  280. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  281. machineconfig/setup_mac/uv.sh +36 -0
  282. machineconfig/setup_windows/__init__.py +11 -0
  283. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  284. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  285. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  286. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  287. machineconfig/setup_windows/uv.ps1 +17 -0
  288. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  289. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  290. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  291. machineconfig/utils/accessories.py +7 -5
  292. machineconfig/utils/cloud/onedrive/README.md +139 -0
  293. machineconfig/utils/code.py +155 -105
  294. machineconfig/utils/files/art/fat_croco.txt +10 -0
  295. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  296. machineconfig/utils/files/art/happy_croco.txt +22 -0
  297. machineconfig/utils/files/art/water_croco.txt +11 -0
  298. machineconfig/utils/files/ascii_art.py +1 -1
  299. machineconfig/utils/files/dbms.py +257 -0
  300. machineconfig/utils/files/headers.py +11 -14
  301. machineconfig/utils/files/ouch/__init__.py +0 -0
  302. machineconfig/utils/files/ouch/decompress.py +45 -0
  303. machineconfig/utils/files/read.py +10 -18
  304. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  305. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  306. machineconfig/utils/installer_utils/installer_class.py +64 -181
  307. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  308. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  309. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
  310. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
  311. machineconfig/utils/io.py +77 -23
  312. machineconfig/utils/links.py +254 -162
  313. machineconfig/utils/meta.py +256 -0
  314. machineconfig/utils/notifications.py +1 -1
  315. machineconfig/utils/options.py +46 -18
  316. machineconfig/utils/options_tv.py +119 -0
  317. machineconfig/utils/path_extended.py +48 -101
  318. machineconfig/utils/path_helper.py +76 -23
  319. machineconfig/utils/procs.py +50 -70
  320. machineconfig/utils/scheduler.py +88 -124
  321. machineconfig/utils/scheduling.py +0 -3
  322. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  323. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  324. machineconfig/utils/source_of_truth.py +3 -6
  325. machineconfig/utils/ssh.py +263 -274
  326. machineconfig/utils/ssh_utils/abc.py +5 -0
  327. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  328. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  329. machineconfig/utils/ssh_utils/utils.py +142 -0
  330. machineconfig/utils/ssh_utils/wsl.py +210 -0
  331. machineconfig/utils/terminal.py +3 -113
  332. machineconfig/utils/tst.py +20 -0
  333. machineconfig/utils/upgrade_packages.py +114 -28
  334. machineconfig/utils/ve.py +12 -4
  335. machineconfig-7.98.dist-info/METADATA +132 -0
  336. machineconfig-7.98.dist-info/RECORD +504 -0
  337. machineconfig-7.98.dist-info/entry_points.txt +13 -0
  338. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  339. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  340. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  341. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  342. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  343. machineconfig/jobs/python/vscode/api.py +0 -57
  344. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  345. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  346. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  347. machineconfig/jobs/windows/startup_file.cmd +0 -2
  348. machineconfig/profile/create.py +0 -303
  349. machineconfig/profile/shell.py +0 -176
  350. machineconfig/scripts/cloud/init.sh +0 -119
  351. machineconfig/scripts/linux/agents +0 -2
  352. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  353. machineconfig/scripts/linux/cloud_copy +0 -2
  354. machineconfig/scripts/linux/cloud_mount +0 -2
  355. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  356. machineconfig/scripts/linux/cloud_sync +0 -2
  357. machineconfig/scripts/linux/croshell +0 -3
  358. machineconfig/scripts/linux/devops +0 -2
  359. machineconfig/scripts/linux/fire +0 -2
  360. machineconfig/scripts/linux/ftpx +0 -2
  361. machineconfig/scripts/linux/fzf2g +0 -21
  362. machineconfig/scripts/linux/fzfag +0 -17
  363. machineconfig/scripts/linux/fzffg +0 -25
  364. machineconfig/scripts/linux/fzfrga +0 -21
  365. machineconfig/scripts/linux/gh_models +0 -2
  366. machineconfig/scripts/linux/initai +0 -2
  367. machineconfig/scripts/linux/kill_process +0 -2
  368. machineconfig/scripts/linux/scheduler +0 -2
  369. machineconfig/scripts/linux/sessions +0 -2
  370. machineconfig/scripts/linux/share_smb +0 -1
  371. machineconfig/scripts/linux/skrg +0 -4
  372. machineconfig/scripts/linux/start_slidev +0 -2
  373. machineconfig/scripts/linux/start_terminals +0 -3
  374. machineconfig/scripts/linux/warp-cli.sh +0 -122
  375. machineconfig/scripts/linux/wifi_conn +0 -2
  376. machineconfig/scripts/linux/z_ls +0 -104
  377. machineconfig/scripts/python/ai/generate_files.py +0 -83
  378. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  379. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  380. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  381. machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
  382. machineconfig/scripts/python/dotfile.py +0 -78
  383. machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
  384. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  385. machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
  386. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  387. machineconfig/scripts/python/gh_models.py +0 -104
  388. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  389. machineconfig/scripts/python/repos.py +0 -132
  390. machineconfig/scripts/python/repos_helper_action.py +0 -378
  391. machineconfig/scripts/python/snapshot.py +0 -25
  392. machineconfig/scripts/python/start_terminals.py +0 -121
  393. machineconfig/scripts/python/t4.py +0 -17
  394. machineconfig/scripts/windows/agents.ps1 +0 -1
  395. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  396. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  397. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  398. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  399. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  400. machineconfig/scripts/windows/croshell.ps1 +0 -1
  401. machineconfig/scripts/windows/devops.ps1 +0 -1
  402. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  403. machineconfig/scripts/windows/fire.ps1 +0 -1
  404. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  405. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  406. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  407. machineconfig/scripts/windows/fzfrga.bat +0 -20
  408. machineconfig/scripts/windows/gpt.ps1 +0 -1
  409. machineconfig/scripts/windows/grep.ps1 +0 -2
  410. machineconfig/scripts/windows/initai.ps1 +0 -1
  411. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  412. machineconfig/scripts/windows/nano.ps1 +0 -3
  413. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  414. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  415. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  416. machineconfig/scripts/windows/sessions.ps1 +0 -1
  417. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  418. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  419. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  420. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  421. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  422. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  423. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  424. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  425. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  426. machineconfig/settings/yazi/yazi.toml +0 -4
  427. machineconfig/setup_linux/nix/cli_installation.sh +0 -157
  428. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  429. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  430. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  431. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  432. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  433. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  434. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  435. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  436. machineconfig/utils/installer_utils/installer.py +0 -189
  437. machineconfig-5.15.dist-info/METADATA +0 -188
  438. machineconfig-5.15.dist-info/RECORD +0 -415
  439. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  440. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  441. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  442. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  443. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  444. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  445. machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
  446. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_agents/agentic_frameworks/__init__.py} +0 -0
  447. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  448. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  449. machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_cloud/__init__.py} +0 -0
  450. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  451. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  452. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_croshell/__init__.py} +0 -0
  453. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  454. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  455. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  456. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  457. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
  458. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_devops/themes/__init__.py} +0 -0
  459. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  460. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  461. /machineconfig/scripts/{linux → python/helpers_network}/mount_drive +0 -0
  462. /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
  463. /machineconfig/scripts/{linux → python/helpers_network}/mount_smb +0 -0
  464. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  465. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  466. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  467. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  468. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  469. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  470. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  471. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  472. {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -1,105 +1,104 @@
1
- import platform
2
- from typing import Optional
3
- import subprocess
4
- from rich.console import Console
5
- from rich.panel import Panel
6
- from rich.syntax import Syntax
7
1
 
2
+ from typing import Any, Literal, Optional, Callable, cast
8
3
  from machineconfig.utils.accessories import randstr
9
- from machineconfig.utils.ve import get_ve_activate_line
10
- from machineconfig.utils.path_extended import PathExtended
4
+ from pathlib import Path
11
5
 
12
6
 
13
- def get_shell_script_executing_python_file(python_file: str, func: Optional[str], ve_path: str, strict_execution: bool = True):
14
- if func is None:
15
- exec_line = f"""python {python_file}"""
16
- else:
17
- exec_line = f"""python -m fire {python_file} {func}"""
18
- shell_script = f"""
19
- echo "Executing `{exec_line}`"
20
- {get_ve_activate_line(ve_path)}
21
- {exec_line}
22
- deactivate || true
23
- """
24
- if strict_execution:
25
- if platform.system() == "Windows":
26
- shell_script = """$ErrorActionPreference = "Stop" """ + "\n" + shell_script
27
- if platform.system() in ["Linux", "Darwin"]:
28
- shell_script = "set -e" + "\n" + shell_script
29
- if platform.system() in ["Linux", "Darwin"]:
30
- shell_script = "#!/bin/bash" + "\n" + shell_script # vs #!/usr/bin/env bash
31
- return shell_script
32
-
33
-
34
- def get_shell_file_executing_python_script(python_script: str, ve_path: str, verbose: bool = True):
35
- if verbose:
36
- python_script = f"""
37
- code = r'''{python_script}'''
38
- try:
39
- from machineconfig.utils.utils import print_code
40
- print_code(code=code, lexer="python", desc="Python Script")
41
- except ImportError:
42
- from rich.console import Console
43
- from rich.panel import Panel
44
- console = Console()
45
- console.print(Panel(f'''📜 PYTHON SCRIPT:\n\n{{code}}''', title="Python Script", expand=False))
46
- """ + python_script
47
- python_file = PathExtended.tmp().joinpath("tmp_scripts", "python", randstr() + ".py")
48
- python_file.parent.mkdir(parents=True, exist_ok=True)
49
- python_file.write_text(python_script, encoding="utf-8")
50
- shell_script = get_shell_script_executing_python_file(python_file=str(python_file), func=None, ve_path=ve_path)
51
- shell_file = write_shell_script_to_file(shell_script)
52
- return shell_file
7
+ def get_uv_run_command(platform: str) -> str:
8
+ res = cast(Literal["Windows", "windows", "nt", "Linux", "linux", "Darwin", "darwin", "macos"], platform)
9
+ match res:
10
+ case "Windows" | "windows" | "nt":
11
+ return """& "$env:USERPROFILE/.local/bin/uv" run"""
12
+ case "Linux" | "linux" | "Darwin" | "darwin" | "macos":
13
+ return """$HOME/.local/bin/uv run"""
14
+ case _:
15
+ return """$HOME/.local/bin/uv run"""
53
16
 
17
+ def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
18
+ import platform
19
+ try:
20
+ from rich.console import Console
21
+ from rich.panel import Panel
22
+ from rich.syntax import Syntax
23
+ if lexer == "shell":
24
+ if platform.system() == "Windows":
25
+ lexer = "powershell"
26
+ elif platform.system() in ["Linux", "Darwin"]:
27
+ lexer = "sh"
28
+ else:
29
+ raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
30
+ console = Console()
31
+ console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
32
+ except ImportError:
33
+ print(f"--- {desc} ---")
34
+ print(code)
35
+ print(f"--- End of {desc} ---")
54
36
 
55
- def write_shell_script_to_file(shell_script: str):
56
- if platform.system() in ["Linux", "Darwin"]:
57
- suffix = ".sh"
58
- elif platform.system() == "Windows":
59
- suffix = ".ps1"
37
+
38
+ def get_uv_command_executing_python_script(python_script: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str],
39
+ prepend_print: bool = True) -> tuple[str, Path]:
40
+ python_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", randstr() + ".py")
41
+ python_file.parent.mkdir(parents=True, exist_ok=True)
42
+ if uv_with is not None and len(uv_with) > 0:
43
+ if prepend_print: uv_with.append("rich")
44
+ uv_with_arg = "--with " + '"' + ",".join(uv_with) + '"'
45
+ else:
46
+ if prepend_print:
47
+ uv_with_arg = "--with rich"
48
+ else:
49
+ uv_with_arg = ""
50
+ if uv_project_dir is not None:
51
+ uv_project_dir_arg = "--project" + f' "{uv_project_dir}"'
52
+ else:
53
+ uv_project_dir_arg = ""
54
+
55
+ if prepend_print:
56
+ from machineconfig.utils.meta import lambda_to_python_script
57
+ print_code_string = lambda_to_python_script(lambda: print_code(code=python_script, lexer="python", desc="Temporary Python Script", subtitle="Executing via shell script"),
58
+ in_global=True, import_module=False)
59
+ python_file.write_text(print_code_string + "\n" + python_script, encoding="utf-8")
60
60
  else:
61
- raise NotImplementedError(f"Platform {platform.system()} not implemented.")
62
- shell_file = PathExtended.tmp().joinpath("tmp_scripts", "shell", randstr() + suffix)
63
- shell_file.parent.mkdir(parents=True, exist_ok=True)
64
- shell_file.write_text(shell_script, encoding="utf-8")
65
- return shell_file
61
+ python_file.write_text(python_script, encoding="utf-8")
62
+ import platform
63
+ uv_run = get_uv_run_command(platform=platform.system())
64
+ shell_script = f"""{uv_run} {uv_with_arg} {uv_project_dir_arg} {str(python_file)} """
65
+ return shell_script, python_file
66
66
 
67
67
 
68
- def write_shell_script_to_default_program_path(program: str, desc: str, preserve_cwd: bool, display: bool, execute: bool):
69
- if preserve_cwd:
70
- if platform.system() == "Windows":
71
- program = "$orig_path = $pwd\n" + program + "\ncd $orig_path"
72
- else:
73
- program = 'orig_path=$(cd -- "." && pwd)\n' + program + '\ncd "$orig_path" || exit'
74
- if display:
75
- print_code(code=program, lexer="shell", desc=desc, subtitle="PROGRAM")
76
- if execute:
77
- result = subprocess.run(program, shell=True, capture_output=True, text=True)
78
- success = result.returncode == 0 and result.stderr == ""
79
- if not success:
80
- print("❌ 🛠️ EXECUTION | Shell script running failed")
81
- if result.stdout:
82
- print(f"STDOUT: {result.stdout}")
83
- if result.stderr:
84
- print(f"STDERR: {result.stderr}")
85
- print(f"Return code: {result.returncode}")
86
- return None
68
+ def run_lambda_function(lmb: Callable[[], Any], uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> None:
69
+ from machineconfig.utils.meta import lambda_to_python_script
70
+ code = lambda_to_python_script(lmb,
71
+ in_global=True, import_module=False)
72
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=uv_with, uv_project_dir=uv_project_dir)
73
+ run_shell_script(uv_command)
87
74
 
88
75
 
89
- def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
90
- if lexer == "shell":
91
- if platform.system() == "Windows":
92
- lexer = "powershell"
93
- elif platform.system() in ["Linux", "Darwin"]:
94
- lexer = "sh"
95
- else:
96
- raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
97
- console = Console()
98
- console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
76
+ def run_python_script_in_marimo(py_script: str, uv_project_with: Optional[str]):
77
+ tmp_dir = Path.home().joinpath("tmp_results", "tmp_scripts", "marimo", randstr())
78
+ tmp_dir.mkdir(parents=True, exist_ok=True)
79
+ pyfile = tmp_dir / "marimo_db_explore.py"
80
+ pyfile.write_text(py_script, encoding="utf-8")
81
+ if uv_project_with is not None:
82
+ requirements = f"""--with "marimo" --project {uv_project_with} """
83
+ else:
84
+ requirements = """--with "marimo" """
85
+ fire_line = f"""
86
+ cd {tmp_dir}
87
+ uv run {requirements} marimo convert {pyfile.name} -o marimo_nb.py
88
+ bat marimo_nb.py
89
+ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
90
+ """
91
+ print_code(code=py_script, desc="Generated Marimo DB Explore Script", lexer="python")
92
+ exit_then_run_shell_script(fire_line)
99
93
 
100
94
 
101
- def run_shell_script(program: str):
95
+ def run_shell_script(script: str, display_script: bool = True, clean_env: bool = False):
102
96
  import tempfile
97
+ import platform
98
+ from rich.console import Console
99
+ from rich.panel import Panel
100
+ from rich.syntax import Syntax
101
+
103
102
  if platform.system() == "Windows":
104
103
  suffix = ".ps1"
105
104
  lexer = "powershell"
@@ -107,25 +106,76 @@ def run_shell_script(program: str):
107
106
  suffix = ".sh"
108
107
  lexer = "bash"
109
108
  with tempfile.NamedTemporaryFile(mode='w', suffix=suffix, delete=False, encoding='utf-8') as temp_file:
110
- temp_file.write(program)
111
- temp_script_path = PathExtended(temp_file.name)
109
+ temp_file.write(script)
110
+ temp_shell_script_path = Path(temp_file.name)
112
111
  console = Console()
113
- # console.print(f"📝 [blue]Temporary script written to:[/blue] [green]{temp_script_path}[/green]")
114
- from rich.syntax import Syntax
115
- console.print(Panel(Syntax(code=program, lexer=lexer), title=f"📄script @ {temp_script_path}", subtitle="shell code"), style="bold red")
112
+ if display_script:
113
+ from rich.syntax import Syntax
114
+ console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 shell script @ {temp_shell_script_path}", subtitle="shell script being executed"), style="bold red")
115
+ env = {} if clean_env else None
116
116
  if platform.system() == "Windows":
117
117
  import subprocess
118
- subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_script_path}"', check=True, shell=True)
118
+ proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_shell_script_path}"', check=True, shell=True, env=env)
119
119
  elif platform.system() == "Linux" or platform.system() == "Darwin":
120
120
  import subprocess
121
- subprocess.run(f"bash {str(temp_script_path)}", check=True, shell=True)
122
- temp_script_path.unlink(missing_ok=True)
123
- # def run_command(command: str, description: str) -> bool:
124
- # """Execute a shell command and return success status."""
125
- # console.print(f"\n🔧 {description}", style="bold cyan")
126
- # try:
127
- # result = subprocess.run(command, shell=True, check=True, capture_output=False)
128
- # return result.returncode == 0
129
- # except subprocess.CalledProcessError as e:
130
- # console.print(f" Error executing command: {e}", style="bold red")
131
- # return False
121
+ proc = subprocess.run(f"bash {str(temp_shell_script_path)}", check=True, shell=True, env=env)
122
+ else:
123
+ raise NotImplementedError(f"Platform {platform.system()} not supported.")
124
+ # console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_script_path}[/blue]")
125
+ if proc.returncode != 0:
126
+ console.print(f"❌ [red]Script execution failed with return code {proc.returncode}:[/red] [blue]{temp_shell_script_path}[/blue]")
127
+ elif proc.returncode == 0:
128
+ console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_shell_script_path}[/blue]")
129
+ else:
130
+ console.print(f"⚠️ [yellow]Script executed with warnings (return code {proc.returncode}):[/yellow] [blue]{temp_shell_script_path}[/blue]")
131
+ temp_shell_script_path.unlink(missing_ok=True)
132
+ console.print(f"🗑️ [blue]Temporary script deleted:[/blue] [green]{temp_shell_script_path}[/green]")
133
+ return proc
134
+
135
+
136
+ def exit_then_run_shell_script(script: str, strict: bool = False):
137
+ import os
138
+ from rich.console import Console
139
+
140
+ console = Console()
141
+ op_program_path = os.environ.get("OP_PROGRAM_PATH", None)
142
+ if op_program_path is not None:
143
+ exists = Path(op_program_path).exists()
144
+ else:
145
+ exists = False
146
+ # three cases: (op_program_path is None, exists=False), (op_program_path is set, exists=False), (op_program_path is set, exists=True)
147
+
148
+ if strict: # we want to assert op_program_path is set and is not an already existing file
149
+ if (op_program_path is None or exists):
150
+ import platform
151
+ if platform.system() == "Windows":
152
+ suffix = ".ps1"
153
+ lexer = "powershell"
154
+ else:
155
+ suffix = ".sh"
156
+ lexer = "bash"
157
+ op_program_path = Path.home().joinpath("tmp_results", "tmp_scripts", "manual_run", f"manual_script_{randstr()}{suffix}")
158
+ op_program_path.parent.mkdir(parents=True, exist_ok=True)
159
+ op_program_path.write_text(script, encoding="utf-8")
160
+ print_code(code=script, lexer=lexer, desc="script to run manually")
161
+ console.print("[bold yellow]⚠️ STRICT MODE:[/bold yellow] [cyan]Please run the script manually via your shell by executing:[/cyan]")
162
+ console.print(f"[green]{str(op_program_path)}[/green]")
163
+ console.print("[red]❌ OP_PROGRAM_PATH environment variable is not set in strict mode.[/red]")
164
+ import sys
165
+ sys.exit(1)
166
+
167
+ if op_program_path is not None and not exists:
168
+ op_program_path = Path(op_program_path)
169
+ op_program_path.parent.mkdir(parents=True, exist_ok=True)
170
+ op_program_path.write_text(script, encoding="utf-8")
171
+ console.print("[cyan]🚀 Handing over to shell script runner via OP_PROGRAM_PATH:[/cyan]")
172
+ console.print(f"[bold green]{str(op_program_path)}[/bold green]")
173
+ print_code(code=script, lexer="shell", desc="script to run via OP_PROGRAM_PATH")
174
+ else:
175
+ if op_program_path is not None and exists:
176
+ console.print(f"[yellow]⚠️ OP_PROGRAM_PATH @ {str(op_program_path)} already exists.[/yellow] [cyan]Falling back to direct execution.[/cyan]")
177
+ elif op_program_path is None:
178
+ console.print("[cyan]ℹ️ OP_PROGRAM_PATH is not set.[/cyan] [yellow]Falling back to direct execution.[/yellow]")
179
+ run_shell_script(script)
180
+ import sys
181
+ sys.exit(0)
@@ -0,0 +1,10 @@
1
+ _ ___ /^^\ /^\ /^^\_
2
+ _ _@)@) \ ,,/ '` ~ `'~~ ', `\.
3
+ _/o\_ _ _ _/~`.`...'~\ ./~~..,'`','',.,' ' ~:
4
+ / `,'.~,~.~ . , . , ~|, ,/ .,' , ,. .. ,,. `, ~\_
5
+ ( ' _' _ '_` _ ' . , `\_/ .' ..' ' ` ` `.. `, \_
6
+ ~V~ V~ V~ V~ ~\ ` ' . ' , ' .,.,''`.,.''`.,.``. ', \_
7
+ _/\ /\ /\ /\_/, . ' , `_/~\_ .' .,. ,, , _/~\_ `. `. '., \_
8
+ < ~ ~ '~`'~'`, ., . `_: ::: \_ ' `_/ ::: \_ `.,' . ', \_
9
+ \ ' `_ '`_ _ ',/ _::_::_ \ _ _/ _::_::_ \ `.,'.,`., \-,-,-,_,_,
10
+ `'~~ `'~~ `'~~ `'~~ \(_)(_)(_)/ `~~' \(_)(_)(_)/ ~'`\_.._,._,'_;_;_;_;_;
@@ -0,0 +1,9 @@
1
+ .-._ _ _ _ _ _ _ _ _
2
+ .-''-.__.-'00 '-' ' ' ' ' ' ' ' '-.
3
+ '.___ ' . .--_'-' '-' '-' _'-' '._
4
+ V: V 'vv-' '_ '. .' _..' '.'.
5
+ '=.____.=_.--' :_.__.__:_ '. : :
6
+ (((____.-' '-. / : :
7
+ (((-'\ .' /
8
+ _____..' .'
9
+ '-._____.-'
@@ -0,0 +1,22 @@
1
+ .--. .--.
2
+ / \/ \
3
+ | .-. .-. \
4
+ |/_ |/_ | \
5
+ || `\|| `\| `----.
6
+ |\0_/ \0_/ --, \_
7
+ .--"""""-. / (` \ `-.
8
+ / \-----'-. \ \
9
+ \ () () /`\ \
10
+ | .___.-' | \
11
+ \ /` \| / ;
12
+ `-.___ ___.' .-.`.---.| \
13
+ \| ``-..___,.-'`\| / / / | `\
14
+ ` \| ,`/ / / , /
15
+ ` |\ / / |\/
16
+ , .'`-; ' \/
17
+ , |\-' .' , .-'`
18
+ .-|\--;`` .-' |\.'
19
+ ( `"'-.|\ (___,.--'`'
20
+ `-. `"` _.--'
21
+ `. _.-'`-.
22
+ `''---''`` `."
@@ -0,0 +1,11 @@
1
+ _.---._ .---.
2
+ __...---' .---. `---'-. `.
3
+ ~ -~ -.-''__.--' _.'( | )`. `. `._ :
4
+ -.~~ .'__-'_ .--'' ._`---'_.-. `. `-`.
5
+ ~ ~_~-~-~_ ~ -._ -._``---. -. `-._ `.
6
+ ~- ~ ~ -_ -~ ~ -.._ _ _ _ ..-_ `. `-._``--.._
7
+ ~~-~ ~-_ _~ ~-~ ~ -~ _~~_-~ -._ `-. -. `-._``--.._.--''. ~ -~_
8
+ ~~ -~_-~ _~- _~~ _~-_~ ~-_~~ ~-.___ -._ `-.__ `. `. ~ -_~
9
+ ~~ _~- ~~- -_~ ~- ~ - _~~- _~~ ~---...__ _ ._ .` `. ~-_~
10
+ ~ ~- _~~- _-_~ ~-_ ~-~ ~_-~ _~- ~_~-_~ ~--.....--~ -~_ ~
11
+ ~ ~ - ~ ~ ~~ - ~~- ~~- ~- ~ -~ ~ ~ -~~- ~- ~-~
@@ -62,7 +62,7 @@ def get_art(comment: Optional[str] = None, artlib: Optional[BOX_OR_CHAR] = None,
62
62
  try:
63
63
  comment = subprocess.run("fortune", shell=True, capture_output=True, text=True, check=True).stdout
64
64
  except Exception:
65
- comment = "crocodile"
65
+ comment = "machineconfig"
66
66
  if artlib is None: artlib = random.choice(['boxes', 'cowsay'])
67
67
  to_file = '' if not file else f'> {file}'
68
68
  if artlib == 'boxes':
@@ -0,0 +1,257 @@
1
+ import time
2
+ from typing import Optional, Any, Callable
3
+
4
+ import polars as pl
5
+
6
+ from sqlalchemy.orm import sessionmaker
7
+ from sqlalchemy import create_engine, text, inspect as inspect__
8
+ from sqlalchemy.engine import Engine
9
+ from sqlalchemy.sql.schema import MetaData
10
+ from pathlib import Path as P
11
+
12
+ OPLike = Optional[P] | str | None
13
+
14
+
15
+ class DBMS:
16
+ def __init__(self, engine: Engine):
17
+ self.eng: Engine = engine
18
+
19
+ @staticmethod
20
+ def from_local_db(path: OPLike = None, echo: bool = False, share_across_threads: bool = False, pool_size: int = 5, **kwargs: Any):
21
+ return DBMS(engine=DBMS.make_sql_engine(path=path, echo=echo, share_across_threads=share_across_threads, pool_size=pool_size, **kwargs))
22
+
23
+ def __repr__(self): return f"DataBase @ {self.eng}"
24
+ def close(self, sleep: int = 2):
25
+ self.eng.pool.dispose()
26
+ self.eng.dispose()
27
+ time.sleep(sleep)
28
+ @staticmethod
29
+ def _get_table_identifier(engine: Engine, table: str, sch: Optional[str]):
30
+ if sch is not None:
31
+ # Handle DuckDB schema names that contain dots (e.g., "klines.main")
32
+ if engine.url.drivername == 'duckdb' and '.' in sch and sch.endswith('.main'):
33
+ # For DuckDB schemas like "klines.main", just use the table name without schema
34
+ return f'"{table}"'
35
+ else:
36
+ return f'"{sch}"."{table}"'
37
+ else:
38
+ return f'"{table}"'
39
+
40
+ # ==================== QUERIES =====================================
41
+ def execute_as_you_go(self, *commands: str, res_func: Callable[[Any], Any] = lambda x: x.all(), df: bool = False):
42
+ with self.eng.begin() as conn:
43
+ result = None
44
+ for command in commands:
45
+ result = conn.execute(text(command))
46
+ # conn.commit() # if driver is sqlite3, the connection is autocommitting. # this commit is only needed in case of DBAPI driver.
47
+ return res_func(result) if not df else pl.DataFrame(res_func(result))
48
+
49
+ def execute_begin_once(self, command: str, res_func: Callable[[Any], Any] = lambda x: x.all(), df: bool = False):
50
+ with self.eng.begin() as conn:
51
+ result = conn.execute(text(command)) # no need for commit regardless of driver
52
+ result = res_func(result)
53
+ return result if not df else pl.DataFrame(result)
54
+
55
+ def execute(self, command: str):
56
+ with self.eng.begin() as conn:
57
+ result = conn.execute(text(command))
58
+ # conn.commit()
59
+ return result
60
+
61
+ # def execute_script(self, command: str, df: bool = False):
62
+ # with self.eng.begin() as conn: result = conn.executescript(text(command))
63
+ # return result if not df else pl.DataFrame(result)
64
+
65
+ # ========================== TABLES =====================================
66
+ def insert_dicts(self, table: str, *mydicts: dict[str, Any]) -> None:
67
+ cmd = f"""INSERT INTO {table} VALUES """
68
+ for mydict in mydicts: cmd += f"""({tuple(mydict)}), """
69
+ self.execute_begin_once(cmd)
70
+
71
+ def refresh(self, sch: Optional[str] = None) -> dict[str, Any]:
72
+ con = self.eng.connect()
73
+ ses = sessionmaker()(bind=self.eng)
74
+ meta = MetaData()
75
+ meta.reflect(bind=self.eng, schema=sch)
76
+ insp = inspect__(subject=self.eng)
77
+ schema = insp.get_schema_names()
78
+ sch_tab = {k: v for k, v in zip(schema, [insp.get_table_names(schema=x) for x in schema])}
79
+ sch_vws = {k: v for k, v in zip(schema, [insp.get_view_names(schema=x) for x in schema])}
80
+ return {'con': con, 'ses': ses, 'meta': meta, 'insp': insp, 'schema': schema, 'sch_tab': sch_tab, 'sch_vws': sch_vws}
81
+
82
+ def get_columns(self, table: str, sch: Optional[str] = None) -> list[str]:
83
+ meta = MetaData()
84
+ meta.reflect(bind=self.eng, schema=sch)
85
+ return list(meta.tables[self._get_table_identifier(self.eng, table, sch)].exported_columns.keys())
86
+
87
+ def read_table(self, table: Optional[str] = None, sch: Optional[str] = None, size: int = 5) -> pl.DataFrame:
88
+ insp = inspect__(self.eng)
89
+ schema = insp.get_schema_names()
90
+ sch_tab = {k: v for k, v in zip(schema, [insp.get_table_names(schema=x) for x in schema])}
91
+ if sch is None:
92
+ # First try to find schemas that have tables (excluding system schemas)
93
+ schemas_with_tables = []
94
+ for schema_name in schema:
95
+ if schema_name not in ["information_schema", "pg_catalog", "system"]:
96
+ if schema_name in sch_tab and len(sch_tab[schema_name]) > 0:
97
+ schemas_with_tables.append(schema_name)
98
+
99
+ if len(schemas_with_tables) == 0:
100
+ raise ValueError(f"No schemas with tables found. Available schemas: {schema}")
101
+
102
+ # Prefer non-"main" schemas if available, otherwise use main
103
+ if len(schemas_with_tables) > 1 and "main" in schemas_with_tables:
104
+ sch = [s for s in schemas_with_tables if s != "main"][0]
105
+ else:
106
+ sch = schemas_with_tables[0]
107
+ print(f"Auto-selected schema: `{sch}` from available schemas: {schemas_with_tables}")
108
+
109
+ if table is None:
110
+ if sch not in sch_tab:
111
+ raise ValueError(f"Schema `{sch}` not found. Available schemas: {list(sch_tab.keys())}")
112
+ tables = sch_tab[sch]
113
+ assert len(tables) > 0, f"No tables found in schema `{sch}`"
114
+ import random
115
+ table = random.choice(tables)
116
+ print(f"Reading table `{table}` from schema `{sch}`")
117
+ with self.eng.connect() as conn:
118
+ try:
119
+ res = conn.execute(text(f'''SELECT * FROM {self._get_table_identifier(self.eng, table, sch)} '''))
120
+ return pl.DataFrame(res.fetchmany(size))
121
+ except Exception:
122
+ print(f"Error executing query for table `{table}` in schema `{sch}`")
123
+ print(f"Available schemas and tables: {sch_tab}")
124
+ raise
125
+
126
+ def describe_db(self, sch: Optional[str] = None) -> pl.DataFrame:
127
+ meta = MetaData()
128
+ meta.reflect(bind=self.eng, schema=sch)
129
+ ses = sessionmaker()(bind=self.eng)
130
+ res_all = []
131
+ from rich.progress import Progress
132
+ with Progress() as progress:
133
+ task = progress.add_task("Inspecting tables", total=len(meta.sorted_tables))
134
+ for tbl in meta.sorted_tables:
135
+ table = tbl.name
136
+ if sch is not None:
137
+ table = f"{sch}.{table}"
138
+ count = ses.query(tbl).count()
139
+ res = dict(table=table, count=count, size_mb=count * len(tbl.exported_columns) * 10 / 1e6,
140
+ columns=len(tbl.exported_columns), schema=sch)
141
+ res_all.append(res)
142
+ progress.update(task, advance=1)
143
+ return pl.DataFrame(res_all)
144
+
145
+ def describe_table(self, table: str, sch: Optional[str] = None, dtype: bool = True) -> None:
146
+ print(table.center(100, "="))
147
+ meta = MetaData()
148
+ meta.reflect(bind=self.eng, schema=sch)
149
+ tbl = meta.tables[self._get_table_identifier(self.eng, table, sch)]
150
+ ses = sessionmaker()(bind=self.eng)
151
+ count = ses.query(tbl).count()
152
+ res = dict(name=table, count=count, size_mb=count * len(tbl.exported_columns) * 10 / 1e6)
153
+ from machineconfig.utils.accessories import pprint
154
+ pprint(res, title="TABLE DETAILS")
155
+ dat = self.read_table(table=table, sch=sch, size=2)
156
+ df = dat
157
+ print("SAMPLE:\n", df)
158
+ insp = inspect__(self.eng)
159
+ if dtype: print("\nDETAILED COLUMNS:\n", pl.DataFrame(insp.get_columns(self._get_table_identifier(self.eng, table, sch))))
160
+ print("\n" * 3)
161
+
162
+ @staticmethod
163
+ def make_sql_engine(path: OPLike = None, echo: bool = False, share_across_threads: bool = False, pool_size: int = 5, **kwargs: Any) -> Engine:
164
+ if path is None:
165
+ url = 'sqlite:///:memory:'
166
+ elif isinstance(path, str) and path.startswith(('sqlite://', 'postgresql://', 'mysql://', 'duckdb://')):
167
+ url = path
168
+ else:
169
+ path_str = str(P(path))
170
+ if path_str.endswith('.duckdb'):
171
+ url = f'duckdb:///{path_str}'
172
+ else:
173
+ url = f'sqlite:///{path_str}'
174
+ connect_args = {}
175
+ if share_across_threads and 'sqlite' in url:
176
+ connect_args['check_same_thread'] = False
177
+ return create_engine(url, echo=echo, pool_size=pool_size, connect_args=connect_args, **kwargs)
178
+
179
+ DB_TMP_PATH = P.home().joinpath(".tmp").joinpath("tmp_dbs").joinpath("results").joinpath("data.sqlite")
180
+
181
+
182
+ def to_db(table: str, idx: int, idx_max: int, data: Any):
183
+ import pickle
184
+ DB_TMP_PATH.parent.mkdir(parents=True, exist_ok=True)
185
+ db = DBMS.from_local_db(DB_TMP_PATH)
186
+ time_now = time.time_ns()
187
+ data_blob = pickle.dumps(data)
188
+ create_table = f"""CREATE TABLE IF NOT EXISTS "{table}" (time INT PRIMARY KEY, idx INT, idx_max INT, data BLOB)"""
189
+ insert_row = f"""INSERT INTO "{table}" (time, idx, idx_max, data) VALUES (:time, :idx, :idx_max, :data)"""
190
+ with db.eng.begin() as conn:
191
+ conn.execute(text(create_table))
192
+ conn.execute(
193
+ text(insert_row),
194
+ {'time': time_now, 'idx': idx, 'idx_max': idx_max, 'data': data_blob}
195
+ )
196
+ db.close()
197
+
198
+
199
+ def from_db(table: str):
200
+ import pickle
201
+ DB_TMP_PATH.parent.mkdir(parents=True, exist_ok=True)
202
+ db = DBMS.from_local_db(DB_TMP_PATH)
203
+ with db.eng.connect() as conn:
204
+ res = conn.execute(text(f"""SELECT * FROM "{table}" """))
205
+ records = res.fetchall()
206
+ df = pl.DataFrame(records, schema=['time', 'idx', 'idx_max', 'data'])
207
+ df = df.with_columns(pl.col('data').map_elements(pickle.loads))
208
+ return df
209
+
210
+
211
+ def get_table_specs(engine: Engine, table_name: str) -> pl.DataFrame:
212
+ inspector = inspect__(engine)
213
+ # Collect table information
214
+ columns_info = [{
215
+ 'name': col['name'],
216
+ 'type': str(col['type']),
217
+ 'nullable': col['nullable'],
218
+ 'default': col['default'],
219
+ 'autoincrement': col.get('autoincrement'),
220
+ 'category': 'column'
221
+ } for col in inspector.get_columns(table_name)]
222
+ # Primary keys
223
+ pk_info = [{
224
+ 'name': pk,
225
+ 'type': None,
226
+ 'nullable': False,
227
+ 'default': None,
228
+ 'autoincrement': None,
229
+ 'category': 'primary_key'
230
+ } for pk in inspector.get_pk_constraint(table_name)['constrained_columns']]
231
+ # Foreign keys
232
+ fk_info = [{
233
+ 'name': fk['constrained_columns'][0],
234
+ 'type': f"FK -> {fk['referred_table']}.{fk['referred_columns'][0]}",
235
+ 'nullable': None,
236
+ 'default': None,
237
+ 'autoincrement': None,
238
+ 'category': 'foreign_key'
239
+ } for fk in inspector.get_foreign_keys(table_name)]
240
+ # Indexe
241
+ index_info = [{
242
+ 'name': idx['name'],
243
+ 'type': f"Index on {', '.join(col for col in idx['column_names'] if col)}",
244
+ 'nullable': None,
245
+ 'default': None,
246
+ 'autoincrement': None,
247
+ 'category': 'index',
248
+ 'unique': idx['unique']
249
+ } for idx in inspector.get_indexes(table_name)]
250
+ # Combine all information
251
+ all_info = columns_info + pk_info + fk_info + index_info
252
+ # Convert to DataFrame
253
+ df = pl.DataFrame(all_info)
254
+ return df
255
+
256
+ if __name__ == '__main__':
257
+ pass