machineconfig 5.15__py3-none-any.whl → 7.66__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of machineconfig might be problematic. Click here for more details.

Files changed (389) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -1,105 +1,81 @@
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, Optional, Callable
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 machineconfig.utils.meta import lambda_to_python_script
5
+ from pathlib import Path
11
6
 
12
7
 
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
8
+ def print_code(code: str, lexer: str, desc: str, subtitle: str = ""):
9
+ import platform
10
+ try:
11
+ from rich.console import Console
12
+ from rich.panel import Panel
13
+ from rich.syntax import Syntax
14
+ if lexer == "shell":
15
+ if platform.system() == "Windows":
16
+ lexer = "powershell"
17
+ elif platform.system() in ["Linux", "Darwin"]:
18
+ lexer = "sh"
19
+ else:
20
+ raise NotImplementedError(f"Platform {platform.system()} not supported for lexer {lexer}")
21
+ console = Console()
22
+ console.print(Panel(Syntax(code=code, lexer=lexer), title=f"📄 {desc}", subtitle=subtitle), style="bold red")
23
+ except ImportError:
24
+ print(f"--- {desc} ---")
25
+ print(code)
26
+ print(f"--- End of {desc} ---")
32
27
 
33
28
 
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")
29
+ def get_uv_command_executing_python_script(python_script: str, uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> tuple[str, Path]:
30
+ python_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", randstr() + ".py")
48
31
  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
53
-
54
-
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"
32
+ if uv_with is not None and len(uv_with) > 0:
33
+ uv_with.append("rich")
34
+ uv_with_arg = "--with " + '"' + ",".join(uv_with) + '"'
60
35
  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
66
-
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
36
+ uv_with_arg = "--with rich"
37
+ if uv_project_dir is not None:
38
+ uv_project_dir_arg = "--project" + f' "{uv_project_dir}"'
39
+ else:
40
+ uv_project_dir_arg = ""
41
+ print_code_string = lambda_to_python_script(lambda: print_code(code=python_script, lexer="python", desc="Temporary Python Script", subtitle="Executing via shell script"),
42
+ in_global=True, import_module=False)
43
+ python_file.write_text(print_code_string + "\n" + python_script, encoding="utf-8")
44
+ shell_script = f"""uv run {uv_with_arg} {uv_project_dir_arg} {str(python_file)} """
45
+ return shell_script, python_file
87
46
 
88
47
 
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")
48
+ def run_lambda_function(lmb: Callable[[], Any], uv_with: Optional[list[str]], uv_project_dir: Optional[str]) -> None:
49
+ code = lambda_to_python_script(lmb,
50
+ in_global=True, import_module=False)
51
+ uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=uv_with, uv_project_dir=uv_project_dir)
52
+ run_shell_script(uv_command)
53
+ def run_python_script_in_marimo(py_script: str, uv_project_with: Optional[str]):
54
+ tmp_dir = Path.home().joinpath("tmp_results", "tmp_scripts", "marimo", randstr())
55
+ tmp_dir.mkdir(parents=True, exist_ok=True)
56
+ pyfile = tmp_dir / "marimo_db_explore.py"
57
+ pyfile.write_text(py_script, encoding="utf-8")
58
+ if uv_project_with is not None:
59
+ requirements = f"""--with "marimo" --project {uv_project_with} """
60
+ else:
61
+ requirements = """--with "marimo" """
62
+ fire_line = f"""
63
+ cd {tmp_dir}
64
+ uv run {requirements} marimo convert {pyfile.name} -o marimo_nb.py
65
+ bat marimo_nb.py
66
+ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
67
+ """
68
+ print_code(code=py_script, desc="Generated Marimo DB Explore Script", lexer="python")
69
+ exit_then_run_shell_script(fire_line)
99
70
 
100
71
 
101
- def run_shell_script(program: str):
72
+ def run_shell_script(script: str, display_script: bool = True, clean_env: bool = False):
102
73
  import tempfile
74
+ import platform
75
+ from rich.console import Console
76
+ from rich.panel import Panel
77
+ from rich.syntax import Syntax
78
+
103
79
  if platform.system() == "Windows":
104
80
  suffix = ".ps1"
105
81
  lexer = "powershell"
@@ -107,25 +83,76 @@ def run_shell_script(program: str):
107
83
  suffix = ".sh"
108
84
  lexer = "bash"
109
85
  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)
86
+ temp_file.write(script)
87
+ temp_shell_script_path = Path(temp_file.name)
112
88
  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")
89
+ if display_script:
90
+ from rich.syntax import Syntax
91
+ console.print(Panel(Syntax(code=script, lexer=lexer), title=f"📄 shell script @ {temp_shell_script_path}", subtitle="shell script being executed"), style="bold red")
92
+ env = {} if clean_env else None
116
93
  if platform.system() == "Windows":
117
94
  import subprocess
118
- subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_script_path}"', check=True, shell=True)
95
+ proc = subprocess.run(f'powershell -ExecutionPolicy Bypass -File "{temp_shell_script_path}"', check=True, shell=True, env=env)
119
96
  elif platform.system() == "Linux" or platform.system() == "Darwin":
120
97
  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
98
+ proc = subprocess.run(f"bash {str(temp_shell_script_path)}", check=True, shell=True, env=env)
99
+ else:
100
+ raise NotImplementedError(f"Platform {platform.system()} not supported.")
101
+ # console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_script_path}[/blue]")
102
+ if proc.returncode != 0:
103
+ console.print(f"❌ [red]Script execution failed with return code {proc.returncode}:[/red] [blue]{temp_shell_script_path}[/blue]")
104
+ elif proc.returncode == 0:
105
+ console.print(f"✅ [green]Script executed successfully:[/green] [blue]{temp_shell_script_path}[/blue]")
106
+ else:
107
+ console.print(f"⚠️ [yellow]Script executed with warnings (return code {proc.returncode}):[/yellow] [blue]{temp_shell_script_path}[/blue]")
108
+ temp_shell_script_path.unlink(missing_ok=True)
109
+ console.print(f"🗑️ [blue]Temporary script deleted:[/blue] [green]{temp_shell_script_path}[/green]")
110
+ return proc
111
+
112
+
113
+ def exit_then_run_shell_script(script: str, strict: bool = False):
114
+ import os
115
+ from rich.console import Console
116
+
117
+ console = Console()
118
+ op_program_path = os.environ.get("OP_PROGRAM_PATH", None)
119
+ if op_program_path is not None:
120
+ exists = Path(op_program_path).exists()
121
+ else:
122
+ exists = False
123
+ # three cases: (op_program_path is None, exists=False), (op_program_path is set, exists=False), (op_program_path is set, exists=True)
124
+
125
+ if strict: # we want to assert op_program_path is set and is not an already existing file
126
+ if (op_program_path is None or exists):
127
+ import platform
128
+ if platform.system() == "Windows":
129
+ suffix = ".ps1"
130
+ lexer = "powershell"
131
+ else:
132
+ suffix = ".sh"
133
+ lexer = "bash"
134
+ op_program_path = Path.home().joinpath("tmp_results", "tmp_scripts", "manual_run", f"manual_script_{randstr()}{suffix}")
135
+ op_program_path.parent.mkdir(parents=True, exist_ok=True)
136
+ op_program_path.write_text(script, encoding="utf-8")
137
+ print_code(code=script, lexer=lexer, desc="script to run manually")
138
+ console.print("[bold yellow]⚠️ STRICT MODE:[/bold yellow] [cyan]Please run the script manually via your shell by executing:[/cyan]")
139
+ console.print(f"[green]{str(op_program_path)}[/green]")
140
+ console.print("[red]❌ OP_PROGRAM_PATH environment variable is not set in strict mode.[/red]")
141
+ import sys
142
+ sys.exit(1)
143
+
144
+ if op_program_path is not None and not exists:
145
+ op_program_path = Path(op_program_path)
146
+ op_program_path.parent.mkdir(parents=True, exist_ok=True)
147
+ op_program_path.write_text(script, encoding="utf-8")
148
+ console.print("[cyan]🚀 Handing over to shell script runner via OP_PROGRAM_PATH:[/cyan]")
149
+ console.print(f"[bold green]{str(op_program_path)}[/bold green]")
150
+ print_code(code=script, lexer="shell", desc="script to run via OP_PROGRAM_PATH")
151
+ else:
152
+ if op_program_path is not None and exists:
153
+ console.print(f"[yellow]⚠️ OP_PROGRAM_PATH @ {str(op_program_path)} already exists.[/yellow] [cyan]Falling back to direct execution.[/cyan]")
154
+ elif op_program_path is None:
155
+ console.print("[cyan]ℹ️ OP_PROGRAM_PATH is not set.[/cyan] [yellow]Falling back to direct execution.[/yellow]")
156
+ run_shell_script(script)
157
+ import sys
158
+ 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
@@ -6,7 +6,6 @@ import random
6
6
  from pathlib import Path
7
7
  from rich import pretty
8
8
  from rich.console import Console
9
- from typing import Optional
10
9
 
11
10
 
12
11
  def print_header():
@@ -26,8 +25,9 @@ def print_header():
26
25
  table.add_row("Virtual Environment", os.getenv('VIRTUAL_ENV', 'None'))
27
26
  table.add_row("Running @", str(Path.cwd()))
28
27
 
28
+ from machineconfig.utils.installer_utils.installer_runner import get_machineconfig_version
29
29
 
30
- console.print(Panel(table, title="[bold blue]✨ 🐊 Crocodile Shell 14.5 ✨ Made with 🐍 | Built with ❤️[/bold blue]", border_style="blue"))
30
+ console.print(Panel(table, title=f"[bold blue]✨ 🐊 Machineconfig Shell {get_machineconfig_version()} ✨ Made with 🐍 | Built with ❤️[/bold blue]", border_style="blue"))
31
31
  def print_logo(logo: str):
32
32
  from machineconfig.utils.files.ascii_art import font_box_color, character_color, character_or_box_color
33
33
  if platform.system() == "Windows":
@@ -38,26 +38,23 @@ def print_logo(logo: str):
38
38
  if random.choice([True, True, False]): font_box_color(logo)
39
39
  else: character_color(logo)
40
40
  else:
41
- print("\n" + "🚫 " + "-" * 70 + " 🚫")
42
- print("🔍 Missing ASCII art dependencies. Install with: iwr bit.ly/cfgasciiartwindows | iex")
43
- print("🚫 " + "-" * 70 + " 🚫\n")
41
+ # print("\n" + "🚫 " + "-" * 70 + " 🚫")
42
+ # print("🔍 Missing ASCII art dependencies. Install with: iwr bit.ly/cfgasciiartwindows | iex")
43
+ # print("🚫 " + "-" * 70 + " 🚫\n")
44
44
  _default_art = Path(random.choice(glob.glob(str(Path(__file__).parent.joinpath("art", "*")))))
45
45
  print(_default_art.read_text())
46
46
  elif platform.system() in ["Linux", "Darwin"]: # Explicitly handle both Linux and macOS
47
- def is_executable_in_path(executable_name: str) -> Optional[str]:
48
- path_dirs = os.environ['PATH'].split(os.pathsep)
49
- for path_dir in path_dirs:
50
- path_to_executable = os.path.join(path_dir, executable_name)
51
- if os.path.isfile(path_to_executable) and os.access(path_to_executable, os.X_OK): return path_to_executable
52
- return None
47
+ from machineconfig.utils.installer_utils.installer_locator_utils import is_executable_in_path
53
48
  avail_cowsay = is_executable_in_path("cowsay")
54
49
  avail_lolcat = is_executable_in_path("lolcat")
55
50
  avail_boxes = is_executable_in_path("boxes")
56
51
  avail_figlet = is_executable_in_path("figlet")
57
52
  if avail_cowsay and avail_lolcat and avail_boxes and avail_figlet:
58
- _dynamic_art = random.choice([True, True, True, True, False])
59
- if _dynamic_art: character_or_box_color(logo=logo)
60
- else: print(Path(random.choice(glob.glob(str(Path(__file__).parent.joinpath("art", "*"))))).read_text())
53
+ # _dynamic_art = random.choice([True, True, True, True, False])
54
+ # if _dynamic_art: character_or_box_color(logo=logo)
55
+ # else:
56
+ # print(Path(random.choice(glob.glob(str(Path(__file__).parent.joinpath("art", "*"))))).read_text())
57
+ character_or_box_color(logo=logo)
61
58
  else:
62
59
  print("\n" + "🚫 " + "-" * 70 + " 🚫")
63
60
  install_cmd = "devops install --group TerminalEyeCandy" if platform.system() == "Linux" else "brew install cowsay lolcat boxes figlet"
File without changes