machineconfig 6.23__py3-none-any.whl → 8.12__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 (402) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  5. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  6. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  7. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  8. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  9. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  10. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  11. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  12. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  13. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  14. machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
  15. machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
  16. machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
  17. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  18. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
  19. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
  20. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
  21. machineconfig/jobs/installer/check_installations.py +0 -1
  22. machineconfig/jobs/installer/installer_data.json +1408 -201
  23. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  24. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  25. machineconfig/jobs/installer/package_groups.py +63 -92
  26. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  27. machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
  28. machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
  29. machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
  30. machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
  31. machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
  32. machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
  33. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
  34. machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
  35. machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
  36. machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
  37. machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
  38. machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
  39. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
  40. machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
  41. machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
  42. machineconfig/jobs/scripts_dynamic/a.py +25 -0
  43. machineconfig/logger.py +0 -1
  44. machineconfig/profile/create_helper.py +56 -18
  45. machineconfig/profile/create_links.py +2 -1
  46. machineconfig/profile/create_links_export.py +64 -18
  47. machineconfig/profile/create_shell_profile.py +90 -132
  48. machineconfig/profile/mapper.toml +18 -8
  49. machineconfig/scripts/__init__.py +0 -4
  50. machineconfig/scripts/linux/wrap_mcfg +46 -0
  51. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  52. machineconfig/scripts/python/agents.py +82 -60
  53. machineconfig/scripts/python/ai/initai.py +1 -19
  54. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  55. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  56. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
  57. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  58. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  59. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  60. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  61. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  62. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  63. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  64. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  65. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  66. machineconfig/scripts/python/cloud.py +14 -9
  67. machineconfig/scripts/python/croshell.py +135 -117
  68. machineconfig/scripts/python/devops.py +48 -25
  69. machineconfig/scripts/python/devops_navigator.py +1 -5
  70. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  71. machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
  72. machineconfig/scripts/python/fire_jobs.py +127 -118
  73. machineconfig/scripts/python/ftpx.py +44 -17
  74. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  75. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  76. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  77. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  78. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  79. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  80. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  81. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  82. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  83. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
  84. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
  85. machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
  86. machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
  87. machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
  88. machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
  89. machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
  90. machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
  91. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  92. machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
  93. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
  94. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
  95. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
  96. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
  97. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  98. machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
  99. machineconfig/scripts/python/helpers_devops/cli_config.py +105 -0
  100. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  101. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  102. machineconfig/scripts/python/helpers_devops/cli_nw.py +221 -0
  103. machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
  104. machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
  105. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  106. machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
  107. machineconfig/scripts/python/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
  108. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
  109. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
  110. machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
  111. machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
  112. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  113. machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
  114. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
  115. machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
  116. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  117. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  118. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  119. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  120. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  121. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
  122. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
  123. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
  124. machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
  125. machineconfig/scripts/python/helpers_network/address.py +176 -0
  126. machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
  127. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  128. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  129. machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
  130. machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
  131. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  132. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  133. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  134. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  135. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  136. machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
  137. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
  138. machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
  139. machineconfig/scripts/python/helpers_repos/grource.py +2 -2
  140. machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
  141. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  142. machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
  143. machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
  144. machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
  145. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  146. machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
  147. machineconfig/scripts/python/helpers_utils/python.py +187 -0
  148. machineconfig/scripts/python/interactive.py +26 -35
  149. machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
  150. machineconfig/scripts/python/msearch.py +72 -0
  151. machineconfig/scripts/python/sessions.py +101 -38
  152. machineconfig/scripts/python/terminal.py +136 -0
  153. machineconfig/scripts/python/utils.py +62 -0
  154. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  155. machineconfig/settings/broot/conf.toml +1 -1
  156. machineconfig/settings/helix/config.toml +16 -0
  157. machineconfig/settings/helix/languages.toml +13 -4
  158. machineconfig/settings/helix/yazi-picker.sh +12 -0
  159. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  160. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  161. machineconfig/settings/lf/linux/lfrc +10 -11
  162. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  163. machineconfig/settings/lf/windows/lfrc +15 -17
  164. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  165. machineconfig/settings/linters/.ruff.toml +1 -1
  166. machineconfig/settings/marimo/marimo.toml +80 -0
  167. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  168. machineconfig/settings/shells/bash/init.sh +57 -10
  169. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  170. machineconfig/settings/shells/nushell/config.nu +2 -35
  171. machineconfig/settings/shells/nushell/env.nu +45 -6
  172. machineconfig/settings/shells/nushell/init.nu +314 -0
  173. machineconfig/settings/shells/pwsh/init.ps1 +59 -23
  174. machineconfig/settings/shells/starship/starship.toml +16 -0
  175. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  176. machineconfig/settings/shells/wt/settings.json +32 -17
  177. machineconfig/settings/shells/zsh/init.sh +89 -0
  178. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  179. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  180. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  181. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  182. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  183. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  184. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  185. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  186. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  187. machineconfig/settings/television/cable_unix/env.toml +17 -0
  188. machineconfig/settings/television/cable_unix/files.toml +11 -0
  189. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  190. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  191. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  192. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  193. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  194. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  195. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  196. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  197. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  198. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  199. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  200. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  201. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  202. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  203. machineconfig/settings/television/cable_unix/text.toml +17 -0
  204. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  205. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  206. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  207. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  208. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  209. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  210. machineconfig/settings/television/cable_windows/env.toml +17 -0
  211. machineconfig/settings/television/cable_windows/files.toml +14 -0
  212. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  213. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  214. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  215. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  216. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  217. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  218. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  219. machineconfig/settings/television/cable_windows/text.toml +17 -0
  220. machineconfig/settings/yazi/init.lua +61 -0
  221. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  222. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  223. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  224. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  225. machineconfig/settings/yazi/theme.toml +4 -0
  226. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  227. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  228. machineconfig/settings/zellij/layouts/st.kdl +39 -8
  229. machineconfig/setup_linux/__init__.py +2 -2
  230. machineconfig/setup_linux/apps_desktop.sh +8 -27
  231. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
  232. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  233. machineconfig/setup_mac/__init__.py +16 -0
  234. machineconfig/setup_mac/apps_gui.sh +248 -0
  235. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  236. machineconfig/setup_mac/uv.sh +36 -0
  237. machineconfig/setup_windows/__init__.py +3 -5
  238. machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
  239. machineconfig/setup_windows/uv.ps1 +8 -1
  240. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -10
  241. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  242. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  243. machineconfig/utils/accessories.py +7 -5
  244. machineconfig/utils/code.py +143 -167
  245. machineconfig/utils/files/art/fat_croco.txt +10 -0
  246. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  247. machineconfig/utils/files/art/happy_croco.txt +22 -0
  248. machineconfig/utils/files/art/water_croco.txt +11 -0
  249. machineconfig/utils/files/ascii_art.py +1 -1
  250. machineconfig/utils/files/headers.py +6 -11
  251. machineconfig/utils/files/read.py +3 -9
  252. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  253. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  254. machineconfig/utils/installer_utils/installer_class.py +44 -101
  255. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  256. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  257. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +39 -87
  258. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
  259. machineconfig/utils/io.py +77 -4
  260. machineconfig/utils/links.py +56 -38
  261. machineconfig/utils/meta.py +235 -145
  262. machineconfig/utils/options.py +46 -18
  263. machineconfig/utils/options_tv.py +119 -0
  264. machineconfig/utils/path_extended.py +46 -97
  265. machineconfig/utils/path_helper.py +76 -23
  266. machineconfig/utils/procs.py +10 -23
  267. machineconfig/utils/scheduler.py +84 -115
  268. machineconfig/utils/scheduling.py +0 -3
  269. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  270. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  271. machineconfig/utils/ssh.py +214 -476
  272. machineconfig/utils/ssh_utils/abc.py +5 -0
  273. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  274. machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
  275. machineconfig/utils/ssh_utils/utils.py +142 -0
  276. machineconfig/utils/ssh_utils/wsl.py +210 -0
  277. machineconfig/utils/terminal.py +3 -113
  278. machineconfig/utils/upgrade_packages.py +114 -28
  279. machineconfig/utils/ve.py +12 -4
  280. machineconfig-8.12.dist-info/METADATA +132 -0
  281. machineconfig-8.12.dist-info/RECORD +504 -0
  282. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
  283. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  284. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  285. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  286. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  287. machineconfig/jobs/python/vscode/api.py +0 -57
  288. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -12
  289. machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
  290. machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
  291. machineconfig/scripts/linux/fzf2g +0 -21
  292. machineconfig/scripts/linux/fzfag +0 -17
  293. machineconfig/scripts/linux/fzffg +0 -25
  294. machineconfig/scripts/linux/fzfrga +0 -21
  295. machineconfig/scripts/linux/other/share_smb +0 -1
  296. machineconfig/scripts/linux/other/switch_ip +0 -20
  297. machineconfig/scripts/linux/skrg +0 -4
  298. machineconfig/scripts/linux/warp-cli.sh +0 -122
  299. machineconfig/scripts/linux/z_ls +0 -104
  300. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  301. machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
  302. machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
  303. machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
  304. machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
  305. machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
  306. machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
  307. machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
  308. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  309. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  310. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  311. machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
  312. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  313. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  314. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  315. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  316. machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
  317. machineconfig/scripts/python/repos_helpers/action.py +0 -378
  318. machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
  319. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  320. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  321. machineconfig/scripts/windows/fzfrga.bat +0 -20
  322. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
  323. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  324. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  325. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  326. machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
  327. machineconfig/settings/yazi/keymap.toml +0 -0
  328. machineconfig/settings/yazi/yazi.toml +0 -4
  329. machineconfig/setup_linux/apps.sh +0 -66
  330. machineconfig/setup_linux/nix/cli_installation.sh +0 -137
  331. machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
  332. machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
  333. machineconfig/setup_windows/apps.ps1 +0 -62
  334. machineconfig/setup_windows/others/obs.ps1 +0 -4
  335. machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
  336. machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
  337. machineconfig/utils/installer_utils/installer.py +0 -225
  338. machineconfig-6.23.dist-info/METADATA +0 -84
  339. machineconfig-6.23.dist-info/RECORD +0 -428
  340. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  341. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
  342. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
  343. machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
  344. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  345. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
  346. machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
  347. machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
  348. machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
  349. machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
  350. machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
  351. machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
  352. machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
  353. machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
  354. machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
  355. machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
  356. machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
  357. machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
  358. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
  359. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
  360. machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
  361. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
  362. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
  363. machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
  364. machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
  365. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
  366. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
  367. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
  368. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
  369. machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
  370. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
  371. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
  372. machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
  373. machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
  374. machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
  375. machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  376. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  377. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  378. machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  379. machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
  380. machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
  381. /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
  382. /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
  383. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
  384. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
  385. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
  386. /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
  387. /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
  388. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
  389. /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
  390. /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  391. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  392. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
  393. /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
  394. /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
  395. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  396. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  397. /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
  398. /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
  399. /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
  400. /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
  401. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
  402. {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
@@ -2,158 +2,171 @@
2
2
 
3
3
  """
4
4
  croshell
5
+
5
6
  """
6
7
 
7
8
  from typing import Annotated, Optional
8
9
  import typer
9
- from machineconfig.utils.path_extended import PathExtended
10
- from machineconfig.utils.accessories import randstr
11
-
12
- from machineconfig.utils.options import choose_from_options
13
- # from machineconfig.utils.ve import get_ve_activate_line
14
- from rich.console import Console
15
- from rich.panel import Panel
16
- # from rich.text import Text
17
-
18
- console = Console()
19
-
20
10
 
21
- def add_print_header_pycode(path: str, title: str):
22
- return f"""
23
11
 
24
- from machineconfig.utils.path_extended import PathExtended
25
- pycode = PathExtended(r'{path}').read_text(encoding="utf-8")
26
- pycode = pycode.split("except Exception: print(pycode)")[2]
12
+ def croshell(
13
+ path: Annotated[Optional[str], typer.Argument(help="path of file to read.")] = None,
14
+ project_path: Annotated[Optional[str], typer.Option("--project", "-p", help="specify uv project to use")] = None,
15
+ uv_with: Annotated[Optional[str], typer.Option("--uv-with", "-w", help="specify uv with packages to use")] = None,
16
+ marimo: Annotated[bool, typer.Option("--marimo", "-m", help="open the notebook using marimo if available")] = False,
17
+ jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="run in jupyter interactive console")] = False,
18
+ vscode: Annotated[bool, typer.Option("--vscode", "-c", help="open the script in vscode")] = False,
19
+ visidata: Annotated[bool, typer.Option("--visidata", "-v", help="open data file in visidata")] = False,
20
+ # streamlit_viewer: Annotated[bool, typer.Option("--streamlit", "-s", help="view in streamlit app")] = False,
21
+ python: Annotated[bool, typer.Option("--python", "-P", help="flag to use python over IPython.")] = False,
22
+ profile: Annotated[Optional[str], typer.Option("--profile", "-r", help="ipython profile to use, defaults to default profile.")] = None,
23
+
24
+ ) -> None:
25
+ if uv_with is not None: user_uv_with_line = f"--with {uv_with} "
26
+ else: user_uv_with_line = ""
27
27
 
28
- try:
29
- from rich.text import Text
30
- from rich.panel import Panel
28
+ if project_path is not None:
29
+ uv_project_line = f'--project {project_path}'
30
+ uv_python_line = ""
31
+ else:
32
+ uv_project_line = ""
33
+ uv_python_line = "--python 3.14"
34
+
35
+ from machineconfig.scripts.python.helpers_croshell.crosh import get_read_python_file_pycode, get_read_data_pycode
36
+ from machineconfig.utils.meta import lambda_to_python_script
37
+ from pathlib import Path
38
+ from machineconfig.utils.accessories import randstr
39
+ from machineconfig.utils.ve import get_ve_path_and_ipython_profile
40
+ import json
31
41
  from rich.console import Console
32
- from rich.syntax import Syntax
42
+ from rich.panel import Panel
33
43
  console = Console()
34
- if pycode.strip() != "":
35
- console.print(Panel(Syntax(pycode, lexer="python"), title='{title}'), style="bold red")
36
- except Exception: print(pycode)
37
- """
38
-
39
-
40
- def get_read_data_pycode(path: str):
41
- return f"""
42
- from rich.panel import Panel
43
- from rich.text import Text
44
- from rich.console import Console
45
- console = Console()
46
- p = PathExtended(r'{path}').absolute()
47
- try:
48
- from machineconfig.utils.files.read import Read
49
- from machineconfig.utils.accessories import pprint
50
- dat = Read.read(p)
51
- if isinstance(dat, dict):
52
- panel_title = f"📄 File Data: {{p.name}}"
53
- console.print(Panel(Text(str(dat), justify="left"), title=panel_title, expand=False))
54
- pprint(dat, PathExtended.name)
55
- else:
56
- panel_title = f"📄 Successfully read the file: {{p.name}}"
57
- console.print(Panel(Text(str(dat), justify="left"), title=panel_title, expand=False))
58
- except Exception as e:
59
- error_message = f'''❌ ERROR READING FILE\nFile: {{p.name}}\nError: {{e}}'''
60
- console.print(Panel(Text(error_message, justify="left"), title="Error", expand=False, border_style="red"))
61
- """
62
-
63
44
 
64
45
 
65
- def croshell(
66
- path: Annotated[Optional[str], typer.Argument(help="read a file.")] = "",
67
- python: Annotated[bool, typer.Option("--python", "-p", help="flag to use python over IPython.")] = False,
68
- profile: Annotated[Optional[str], typer.Option("--profile", "-P", help="ipython profile to use, defaults to default profile.")] = None,
69
- jupyter: Annotated[bool, typer.Option("--jupyter", "-j", help="run in jupyter interactive console")] = False,
70
- streamlit_viewer: Annotated[bool, typer.Option("--stViewer", "-s", help="view in streamlit app")] = False,
71
- visidata: Annotated[bool, typer.Option("--visidata", "-V", help="open data file in visidata")] = False,
72
- local: Annotated[bool, typer.Option("--local", "-l", help="run in local mode, not in virtual env.")]= False,
73
- ) -> None:
74
46
  # ==================================================================================
75
47
  # flags processing
76
48
  interactivity = "-i"
77
49
  interpreter = "python" if python else "ipython"
78
50
  ipython_profile: Optional[str] = profile
79
- file_obj = PathExtended.cwd() # initialization value, could be modified according to args.
80
-
81
- if path == ".":
82
- text = "🔍 Searching for Python files..."
83
- console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
84
- options = [str(item) for item in PathExtended.cwd().search("*.py", r=True)]
85
- file_selected = choose_from_options(msg="Choose a python file to run", options=options, fzf=True, multi=False)
86
- assert isinstance(file_selected, str)
87
- program = PathExtended(file_selected).read_text(encoding="utf-8")
88
- text = f"📄 Selected file: {PathExtended(file_selected).name}"
89
- console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
90
-
91
- elif path != "" and path is not None:
92
- if streamlit_viewer:
93
- # text = "📊 STARTING STREAMLIT VIEWER"
94
- # console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
95
- # from machineconfig.scripts.python.viewer import run
96
- # py_file_path = run(data_path=args.read, data=None, get_figure=None)
97
- # final_program = f"""
98
- # #!/bin/bash
99
- # streamlit run {py_file_path}
100
- # """
101
- # PROGRAM_PATH.write_text(data=final_program, encoding="utf-8")
102
- return None
103
- file_obj = PathExtended(str(path).lstrip()).expanduser().absolute()
104
- program = get_read_data_pycode(str(file_obj))
105
- text = f"📄 Reading data from: {file_obj.name}"
106
- console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
107
-
51
+ file_obj = Path.cwd() # initialization value, could be modified according to args.
52
+ if path is not None:
53
+ from machineconfig.utils.path_helper import get_choice_file
54
+ choice_file = get_choice_file(path=path, suffixes={".*"})
55
+ if project_path is None:
56
+ ve_path, _ = get_ve_path_and_ipython_profile(choice_file)
57
+ if ve_path is not None:
58
+ ve_path_obj = Path(ve_path)
59
+ uv_project_line = f'--project {ve_path_obj.parent}'
60
+ uv_python_line = ""
61
+ if choice_file.suffix == ".py":
62
+ program = choice_file.read_text(encoding="utf-8")
63
+ text = f"📄 Selected file: {choice_file.name}"
64
+ console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
65
+ else:
66
+ program = lambda_to_python_script(lambda: get_read_data_pycode(path=str(choice_file)),
67
+ in_global=True, import_module=False)
68
+ text = f"📄 Reading data from: {file_obj.name}"
69
+ console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
108
70
  else: # if nothing is specified, then run in interactive mode.
109
- text = "⌨️ Entering interactive mode"
110
- console.print(Panel(text, title="[bold blue]Info[/bold blue]"))
111
- # from machineconfig.scripts.python.croshell import InteractiveShell
112
- # InteractiveShell().run()
113
- # return None
114
71
  program = ""
115
72
 
116
- preprogram = """
73
+ if Path.home().joinpath("code/machineconfig").exists() and uv_project_line == "":
74
+ uv_project_line = f'--project "{str(Path.home().joinpath("code/machineconfig"))}"'
117
75
 
76
+ preprogram = """
118
77
  #%%
119
-
120
- from machineconfig.utils.files.headers import print_header, print_logo
121
- print_header()
122
- print_logo("CROCODILE")
123
- from pathlib import Path
124
-
125
78
  """
126
-
127
- pyfile = PathExtended.tmp().joinpath(f"tmp_scripts/python/croshell/{randstr()}.py")
79
+ def preprogram_func():
80
+ from machineconfig.utils.files.headers import print_header, print_logo
81
+ print_header()
82
+ print_logo("Machineconfig")
83
+ from pathlib import Path
84
+ from machineconfig.utils.path_extended import PathExtended
85
+ _ = Path, PathExtended # avoid unused import warnings
86
+ import inspect
87
+ import textwrap
88
+ from types import FunctionType
89
+ def get_body_simple_function_no_args(f: FunctionType):
90
+ return textwrap.dedent("\n".join(inspect.getsource(f).splitlines()[1:]))
91
+ preprogram += get_body_simple_function_no_args(preprogram_func)
92
+
93
+ from pathlib import Path
94
+ pyfile = Path.home().joinpath(f"tmp_results/tmp_scripts/python/croshell/{randstr()}/script.py")
128
95
  pyfile.parent.mkdir(parents=True, exist_ok=True)
129
-
130
96
  title = "Reading Data"
131
- python_program = preprogram + add_print_header_pycode(str(pyfile), title=title) + program
97
+ def_code = lambda_to_python_script(lambda: get_read_python_file_pycode(path=str(pyfile), title=title),
98
+ in_global=False, import_module=False)
99
+ # print(def_code)
100
+ python_program = preprogram + "\n\n" + def_code + program
132
101
  pyfile.write_text(python_program, encoding="utf-8")
133
102
  # ve_root_from_file, ipython_profile = get_ve_path_and_ipython_profile(PathExtended(file))
134
103
  ipython_profile = ipython_profile if ipython_profile is not None else "default"
135
104
  # ve_activateion_line = get_ve_activate_line(ve_name=args.ve or ve_profile_suggested, a_path=str(PathExtended.cwd()))
136
105
 
106
+ # prepare notebook target path (avoid relying on locals())
107
+ nb_target = pyfile.with_suffix(".ipynb")
108
+ if jupyter:
109
+ try:
110
+ nb_path = pyfile.with_suffix(".ipynb")
111
+ nb_content = {
112
+ "cells": [
113
+ {
114
+ "cell_type": "code",
115
+ "metadata": {"language": "python"},
116
+ "source": [python_program],
117
+ "outputs": [],
118
+ "execution_count": None,
119
+ }
120
+ ],
121
+ "metadata": {},
122
+ "nbformat": 4,
123
+ "nbformat_minor": 5,
124
+ }
125
+ nb_path.write_text(json.dumps(nb_content), encoding="utf-8")
126
+ nb_target = nb_path
127
+ except Exception:
128
+ # if writing fails, fall back to the default nb_target already set
129
+ pass
137
130
  if visidata:
138
- fire_line = f"uv run --with visidata,pyarrow vd {str(file_obj)}"
131
+ if file_obj.suffix == ".json":
132
+ fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata vd {str(file_obj)}"
133
+ else:
134
+ fire_line = f"uv run {uv_python_line} {user_uv_with_line} {uv_project_line} --with visidata,pyarrow vd {str(file_obj)}"
135
+ elif marimo:
136
+ if Path.home().joinpath("code/machineconfig").exists():
137
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with marimo """
138
+ else: requirements = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "marimo,cowsay,machineconfig[plot]>=8.12" """
139
+ fire_line = f"""
140
+ cd {str(pyfile.parent)}
141
+ uv run {uv_python_line} --with "marimo" marimo convert {pyfile.name} -o marimo_nb.py
142
+ uv run {requirements} marimo edit --host 0.0.0.0 marimo_nb.py
143
+ """
139
144
  elif jupyter:
140
- fire_line = f"code --new-window {str(pyfile)}"
145
+ if Path.home().joinpath("code/machineconfig").exists():
146
+ requirements = f"""{user_uv_with_line} {uv_project_line} --with jupyterlab """
147
+ else: requirements = f"""{user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.12" """
148
+ fire_line = f"uv run {requirements} {uv_project_line} jupyter-lab {str(nb_target)}"
149
+ elif vscode:
150
+ user_uv_add = f"uv add {uv_with}" if uv_with is not None else ""
151
+ fire_line = f"""
152
+ cd {str(pyfile.parent)}
153
+ uv init {uv_python_line}
154
+ uv venv
155
+ uv add "cowsay,machineconfig[plot]>=8.12"
156
+ uv add {user_uv_add}
157
+ # code serve-web
158
+ code --new-window {str(pyfile)}
159
+ """
141
160
  else:
142
161
  if interpreter == "ipython": profile = f" --profile {ipython_profile} --no-banner"
143
162
  else: profile = ""
144
- if local:
145
- from machineconfig.utils.source_of_truth import LIBRARY_ROOT
146
- repo_root = LIBRARY_ROOT.parent.parent
147
- if repo_root.parent.name == "code" and repo_root.name == "machineconfig" and repo_root.exists() and repo_root.is_dir():
148
- ve_line = f"--project {str(repo_root)}"
149
- else:
150
- console.print(Panel("❌ Could not determine the local machineconfig repo root. Please ensure the `REPO_ROOT` in `source_of_truth.py` is correctly set to the local path of the machineconfig repo, or do not use the `--local` flag.", title="Error", border_style="red"))
151
- return
152
- else: ve_line = """--with "machineconfig[plot]>=5.87" """
153
- fire_line = f"uv run --python 3.14 {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
163
+ if Path.home().joinpath("code/machineconfig").exists():
164
+ ve_line = f"""{user_uv_with_line} {uv_project_line} """
165
+ else: ve_line = f"""{uv_python_line} {user_uv_with_line} {uv_project_line} --with "cowsay,machineconfig[plot]>=8.12" """
166
+ fire_line = f"uv run {ve_line} {interpreter} {interactivity} {profile} {str(pyfile)}"
154
167
 
155
- from machineconfig.utils.code import run_shell_script
156
- run_shell_script(fire_line, clean_env=False)
168
+ from machineconfig.utils.code import exit_then_run_shell_script
169
+ exit_then_run_shell_script(fire_line, strict=False)
157
170
 
158
171
 
159
172
  def main() -> None:
@@ -161,4 +174,9 @@ def main() -> None:
161
174
 
162
175
 
163
176
  if __name__ == "__main__":
177
+ # def func(flag: Annotated[bool, typer.Option("--flag/-nf", help="dummy flag for debugging", flag_value=False, is_flag=True)]=True):
178
+ # console.print(f"flag: {flag}")
179
+ # app = typer.Typer()
180
+ # app.command()(func)
181
+ # app()
164
182
  main()
@@ -3,42 +3,65 @@
3
3
  import typer
4
4
  from typing import Optional, Annotated
5
5
 
6
- import machineconfig.scripts.python.devops_helpers.cli_repos as cli_repos
7
- import machineconfig.scripts.python.devops_helpers.cli_config as cli_config
8
- import machineconfig.scripts.python.devops_helpers.cli_self as cli_self
9
- import machineconfig.scripts.python.devops_helpers.cli_data as cli_data
10
- import machineconfig.scripts.python.devops_helpers.cli_nw as cli_network
11
-
6
+ import machineconfig.scripts.python.helpers_devops.cli_repos as cli_repos
7
+ import machineconfig.scripts.python.helpers_devops.cli_config as cli_config
8
+ import machineconfig.scripts.python.helpers_devops.cli_self as cli_self
9
+ import machineconfig.scripts.python.helpers_devops.cli_data as cli_data
10
+ import machineconfig.scripts.python.helpers_devops.cli_nw as cli_network
11
+ import machineconfig.scripts.python.helpers_devops.run_script as run_py_script_module
12
12
 
13
13
  def install(which: Annotated[Optional[str], typer.Argument(..., help="Comma-separated list of program names to install, or group name if --group flag is set.")] = None,
14
14
  group: Annotated[bool, typer.Option(..., "--group", "-g", help="Treat 'which' as a group name. A group is bundle of apps.")] = False,
15
- interactive: Annotated[bool, typer.Option(..., "--interactive", "-ia", help="Interactive selection of programs to install.")] = False,
15
+ interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of programs to install.")] = False,
16
16
  ) -> None:
17
- """📦 Install essential packages"""
18
- import machineconfig.utils.installer_utils.installer as installer_entry_point
19
- installer_entry_point.main(which=which, group=group, interactive=interactive)
17
+ """📦 Install packages"""
18
+ import machineconfig.utils.installer_utils.installer_cli as installer_entry_point
19
+ installer_entry_point.main_installer_cli(which=which, group=group, interactive=interactive)
20
+
21
+
22
+
23
+ # def get_app():
24
+ # app = typer.Typer(add_completion=False, no_args_is_help=True)
25
+ # app.command(name="scripts", help="define all scripts", no_args_is_help=False)(define_scripts)
26
+ # return app
27
+
28
+ # def main():
29
+ # # return app
30
+ # app = get_app()
31
+ # app()
32
+
33
+ # define_app = get_define_app()
20
34
 
21
35
 
22
36
  def get_app():
23
- app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_completion=True)
24
- _ = install
25
- app.command("install", no_args_is_help=True, help="🛠️ [i] Install essential packages")(install)
26
- app.command("i", no_args_is_help=True, help="Install essential packages", hidden=True)(install)
37
+
38
+ cli_app = typer.Typer(help="🛠️ DevOps operations", no_args_is_help=True, add_help_option=False, add_completion=False)
39
+ cli_app.command("install", no_args_is_help=True, help=install.__doc__, short_help="🛠️ [i] Install essential packages")(install)
40
+ cli_app.command("i", no_args_is_help=True, help=install.__doc__, hidden=True)(install)
41
+
27
42
  app_repos = cli_repos.get_app()
28
- app.add_typer(app_repos, name="repos")
29
- app.add_typer(app_repos, name="r", hidden=True)
43
+ cli_app.add_typer(app_repos, name="repos")
44
+ cli_app.add_typer(app_repos, name="r", hidden=True)
30
45
  app_config = cli_config.get_app()
31
- app.add_typer(app_config, name="config")
32
- app.add_typer(app_config, name="c", hidden=True)
33
- app.add_typer(cli_data.app_data, name="data")
34
- app.add_typer(cli_data.app_data, name="d", hidden=True)
46
+ cli_app.add_typer(app_config, name="config")
47
+ cli_app.add_typer(app_config, name="c", hidden=True)
48
+ app_data = cli_data.get_app()
49
+ cli_app.add_typer(app_data, name="data")
50
+ cli_app.add_typer(app_data, name="d", hidden=True)
35
51
  app_self = cli_self.get_app()
36
- app.add_typer(app_self, name="self")
37
- app.add_typer(app_self, name="s", hidden=True)
52
+ cli_app.add_typer(app_self, name="self")
53
+ cli_app.add_typer(app_self, name="s", hidden=True)
38
54
  app_nw = cli_network.get_app()
39
- app.add_typer(app_nw, name="network")
40
- app.add_typer(app_nw, name="n", hidden=True)
41
- return app
55
+ cli_app.add_typer(app_nw, name="network")
56
+ cli_app.add_typer(app_nw, name="n", hidden=True)
57
+
58
+ cli_app.command("execute", no_args_is_help=True, help=run_py_script_module.__doc__,
59
+ short_help="▶️ [e] Execute python/shell scripts from pre-defined directories or as command",
60
+ context_settings={"show_help_on_error": True})(run_py_script_module.run_py_script)
61
+ cli_app.command("e", no_args_is_help=True, help=run_py_script_module.__doc__, hidden=True)(run_py_script_module.run_py_script)
62
+
63
+ return cli_app
64
+
42
65
 
43
66
  def main():
44
67
  app = get_app()
@@ -1,8 +1,4 @@
1
- """
2
- TUI for navigating through machineconfig command structure using Textual.
3
- """
4
-
5
- from machineconfig.scripts.python.helper_navigator import CommandNavigatorApp
1
+ from machineconfig.scripts.python.helpers_navigator import CommandNavigatorApp
6
2
 
7
3
 
8
4
  if __name__ == "__main__":
@@ -0,0 +1,204 @@
1
+ #!/usr/bin/env -S uv run --script
2
+ # /// script
3
+ # requires-python = ">=3.13"
4
+ # dependencies = [
5
+ # "machineconfig>=8.12",
6
+ # "textual",
7
+ # "pyperclip",
8
+ # ]
9
+ # ///
10
+
11
+
12
+
13
+ import os
14
+ import platform
15
+ from collections.abc import Mapping
16
+ from typing import Final
17
+
18
+ from rich.text import Text
19
+ from textual import on
20
+ from textual.app import App, ComposeResult
21
+ from textual.binding import Binding
22
+ from textual.containers import Horizontal, Vertical
23
+ from textual.widgets import Footer, Header, Label, ListItem, ListView, Static
24
+
25
+
26
+ VALUE_PREVIEW_LIMIT: Final[int] = 4096
27
+ SUMMARY_LIMIT: Final[int] = 96
28
+
29
+
30
+ def truncate_text(text: str, limit: int) -> tuple[str, int]:
31
+ length = len(text)
32
+ if length <= limit:
33
+ return text, 0
34
+ return text[:limit], length - limit
35
+
36
+
37
+ def format_summary(env_key: str, env_value: str, limit: int) -> str:
38
+ sanitized = env_value.replace("\n", "\\n").replace("\t", "\\t")
39
+ preview, remainder = truncate_text(sanitized, limit)
40
+ if preview == "":
41
+ base = f"{env_key} = <empty>"
42
+ else:
43
+ base = f"{env_key} = {preview}"
44
+ if remainder == 0:
45
+ return base
46
+ return f"{base}... (+{remainder} chars)"
47
+
48
+
49
+ def collect_environment(env: Mapping[str, str]) -> list[tuple[str, str]]:
50
+ return sorted(env.items(), key=lambda pair: pair[0].lower())
51
+
52
+
53
+ class EnvListItem(ListItem):
54
+ def __init__(self, env_key: str, summary: str) -> None:
55
+ super().__init__(Label(summary))
56
+ self._env_key = env_key
57
+
58
+ def env_key(self) -> str:
59
+ return self._env_key
60
+
61
+
62
+ class EnvValuePreview(Static):
63
+ def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
64
+ super().__init__(*args, **kwargs)
65
+ self.border_title = "Environment Value"
66
+
67
+ def show_value(self, env_key: str, env_value: str) -> None:
68
+ preview, remainder = truncate_text(env_value, VALUE_PREVIEW_LIMIT)
69
+ text = Text()
70
+ text.append(f"{env_key}\n\n", style="bold cyan")
71
+ if preview == "":
72
+ text.append("<empty>", style="dim")
73
+ else:
74
+ text.append(preview)
75
+ if remainder > 0:
76
+ text.append(f"\n... truncated {remainder} characters", style="yellow")
77
+ self.update(text)
78
+
79
+
80
+ class StatusBar(Static):
81
+ def __init__(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def]
82
+ super().__init__(*args, **kwargs)
83
+ self.border_title = "Status"
84
+
85
+ def show_message(self, message: str, level: str) -> None:
86
+ palette = {
87
+ "info": "cyan",
88
+ "success": "green",
89
+ "warning": "yellow",
90
+ "error": "red",
91
+ }
92
+ color = palette.get(level, "white")
93
+ self.update(f"[{color}]{message}[/{color}]")
94
+
95
+
96
+ class EnvExplorerApp(App[None]):
97
+ CSS = """
98
+ Screen { background: $surface; }
99
+ Header { background: $primary; color: $text; }
100
+ Footer { background: $panel; }
101
+ #main-container { height: 100%; }
102
+ #left-panel { width: 50%; height: 100%; border: solid $primary; padding: 1; }
103
+ #right-panel { width: 50%; height: 100%; border: solid $accent; padding: 1; }
104
+ ListView { height: 1fr; border: solid $accent; background: $surface; }
105
+ ListView > ListItem { padding: 0 1; }
106
+ EnvValuePreview { height: 1fr; border: solid $primary; background: $surface; padding: 1; overflow-y: auto; }
107
+ StatusBar { height: 3; border: solid $success; background: $surface; padding: 1; }
108
+ Label { padding: 0 1; height: auto; }
109
+ """
110
+
111
+ BINDINGS = [
112
+ Binding("q", "quit", "Quit", show=True),
113
+ Binding("r", "refresh", "Refresh", show=True),
114
+ Binding("c", "copy_entry", "Copy", show=True),
115
+ ]
116
+
117
+ def __init__(self) -> None:
118
+ super().__init__()
119
+ self._env_pairs: list[tuple[str, str]] = []
120
+ self._env_lookup: dict[str, str] = {}
121
+ self._selected_key: str = ""
122
+
123
+ def compose(self) -> ComposeResult:
124
+ platform_name = platform.system()
125
+ yield Header(show_clock=True)
126
+ with Horizontal(id="main-container"):
127
+ with Vertical(id="left-panel"):
128
+ yield Label(f"🌐 Environment Variables ({platform_name})")
129
+ yield ListView(id="env-list")
130
+ with Vertical(id="right-panel"):
131
+ yield EnvValuePreview(id="preview")
132
+ yield StatusBar(id="status")
133
+ yield Footer()
134
+
135
+ def on_mount(self) -> None:
136
+ self.title = "Environment Explorer"
137
+ self.sub_title = f"Platform: {platform.system()}"
138
+ self._reload_environment()
139
+ self._status().show_message("Ready. Select a variable to preview its value.", "info")
140
+
141
+ def _reload_environment(self) -> None:
142
+ self._env_pairs = collect_environment(os.environ)
143
+ self._env_lookup = dict(self._env_pairs)
144
+ self._populate_list()
145
+
146
+ def _populate_list(self) -> None:
147
+ list_view = self.query_one("#env-list", ListView)
148
+ list_view.clear()
149
+ for env_key, env_value in self._env_pairs:
150
+ summary = format_summary(env_key, env_value, SUMMARY_LIMIT)
151
+ list_view.append(EnvListItem(env_key, summary))
152
+ self._status().show_message(f"Loaded {len(self._env_pairs)} environment variables.", "success")
153
+
154
+ def _status(self) -> StatusBar:
155
+ return self.query_one("#status", StatusBar)
156
+
157
+ def _preview(self) -> EnvValuePreview:
158
+ return self.query_one("#preview", EnvValuePreview)
159
+
160
+ @on(ListView.Highlighted)
161
+ def handle_highlight(self, event: ListView.Highlighted) -> None:
162
+ if not isinstance(event.item, EnvListItem):
163
+ return
164
+ env_key = event.item.env_key()
165
+ env_value = self._env_lookup.get(env_key, "")
166
+ self._preview().show_value(env_key, env_value)
167
+ self._status().show_message(f"Previewing {env_key}", "info")
168
+
169
+ @on(ListView.Selected)
170
+ def handle_selection(self, event: ListView.Selected) -> None:
171
+ if not isinstance(event.item, EnvListItem):
172
+ return
173
+ env_key = event.item.env_key()
174
+ self._selected_key = env_key
175
+ env_value = self._env_lookup.get(env_key, "")
176
+ self._preview().show_value(env_key, env_value)
177
+ self._status().show_message(f"Selected {env_key}", "success")
178
+
179
+ def action_refresh(self) -> None:
180
+ self._reload_environment()
181
+ self._status().show_message("Environment reloaded.", "success")
182
+
183
+ def action_copy_entry(self) -> None:
184
+ if self._selected_key == "":
185
+ self._status().show_message("No variable selected.", "warning")
186
+ return
187
+ env_value = self._env_lookup.get(self._selected_key, "")
188
+ payload = f"{self._selected_key}={env_value}"
189
+ try:
190
+ import pyperclip # type: ignore[import]
191
+
192
+ pyperclip.copy(payload)
193
+ self._status().show_message(f"Copied {self._selected_key} to clipboard.", "success")
194
+ except ImportError:
195
+ self._status().show_message("pyperclip unavailable. Install it for clipboard support.", "warning")
196
+
197
+
198
+ def main() -> None:
199
+ app = EnvExplorerApp()
200
+ app.run()
201
+
202
+
203
+ if __name__ == "__main__":
204
+ main()
@@ -1,3 +1,13 @@
1
+ #!/usr/bin/env -S uv run --script
2
+ # /// script
3
+ # requires-python = ">=3.13"
4
+ # dependencies = [
5
+ # "machineconfig>=8.12",
6
+ # "textual",
7
+ # "pyperclip",
8
+ # ]
9
+ # ///
10
+
1
11
  """Cross-platform PATH explorer with Textual TUI."""
2
12
 
3
13
  from pathlib import Path
@@ -198,15 +208,14 @@ class PathExplorerApp(App[None]):
198
208
  """Copy selected path to clipboard."""
199
209
  if not self.selected_path:
200
210
  self.query_one("#status", StatusBar).show_message("No PATH entry selected", "warning")
201
- return
202
-
203
- # Try to copy to clipboard
204
- try:
205
- import pyperclip
206
- pyperclip.copy(self.selected_path)
207
- self.query_one("#status", StatusBar).show_message(f"Copied to clipboard: {self.selected_path}", "success")
208
- except ImportError:
209
- self.query_one("#status", StatusBar).show_message("pyperclip not available. Install it to enable clipboard support.", "warning")
211
+ return
212
+ # # Try to copy to clipboard
213
+ # try:
214
+ # import pyperclip
215
+ # pyperclip.copy(self.selected_path)
216
+ # self.query_one("#status", StatusBar).show_message(f"Copied to clipboard: {self.selected_path}", "success")
217
+ # except ImportError:
218
+ # self.query_one("#status", StatusBar).show_message("pyperclip not available. Install it to enable clipboard support.", "warning")
210
219
 
211
220
 
212
221
  def main() -> None: