machineconfig 6.82__py3-none-any.whl → 7.98__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. machineconfig/cluster/remote/cloud_manager.py +1 -1
  2. machineconfig/cluster/sessions_managers/utils/maker.py +25 -13
  3. machineconfig/cluster/sessions_managers/wt_local.py +16 -221
  4. machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
  5. machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
  6. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  7. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  8. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  9. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  10. machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
  11. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
  12. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
  13. machineconfig/jobs/installer/custom/boxes.py +2 -2
  14. machineconfig/jobs/installer/custom/hx.py +75 -18
  15. machineconfig/jobs/installer/custom/yazi.py +119 -0
  16. machineconfig/jobs/installer/custom_dev/brave.py +5 -3
  17. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  18. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  19. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +1 -1
  20. machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
  21. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +27 -22
  22. machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
  23. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  24. machineconfig/jobs/installer/custom_dev/winget.py +10 -14
  25. machineconfig/jobs/installer/installer_data.json +1287 -216
  26. machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
  27. machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
  28. machineconfig/jobs/installer/package_groups.py +58 -89
  29. machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
  30. machineconfig/logger.py +0 -1
  31. machineconfig/profile/create_helper.py +43 -16
  32. machineconfig/profile/create_links.py +2 -1
  33. machineconfig/profile/create_links_export.py +64 -18
  34. machineconfig/profile/create_shell_profile.py +78 -127
  35. machineconfig/profile/mapper.toml +15 -8
  36. machineconfig/scripts/__init__.py +0 -4
  37. machineconfig/scripts/linux/wrap_mcfg +46 -0
  38. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  39. machineconfig/scripts/python/agents.py +52 -37
  40. machineconfig/scripts/python/ai/initai.py +1 -1
  41. machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
  42. machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
  43. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
  44. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
  45. machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
  46. machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
  47. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
  48. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
  49. machineconfig/scripts/python/ai/solutions/generic.py +1 -1
  50. machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
  51. machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
  52. machineconfig/scripts/python/croshell.py +77 -78
  53. machineconfig/scripts/python/devops.py +39 -21
  54. machineconfig/scripts/python/devops_navigator.py +0 -4
  55. machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
  56. machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
  57. machineconfig/scripts/python/fire_jobs.py +84 -115
  58. machineconfig/scripts/python/ftpx.py +42 -16
  59. machineconfig/scripts/python/helpers/ast_search.py +74 -0
  60. machineconfig/scripts/python/helpers/qr_code.py +166 -0
  61. machineconfig/scripts/python/helpers/repo_rag.py +325 -0
  62. machineconfig/scripts/python/helpers/run_py_script.py +79 -0
  63. machineconfig/scripts/python/helpers/symantic_search.py +25 -0
  64. machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
  65. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
  66. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
  67. machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
  68. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
  69. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  70. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_launch.py +32 -13
  71. machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_helper_types.py +11 -14
  72. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
  73. machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
  74. machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
  75. machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
  76. machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
  77. machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
  78. machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
  79. machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
  80. machineconfig/scripts/python/helpers_devops/cli_config.py +46 -61
  81. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +67 -55
  82. machineconfig/scripts/python/helpers_devops/cli_nw.py +157 -16
  83. machineconfig/scripts/python/helpers_devops/cli_repos.py +55 -21
  84. machineconfig/scripts/python/helpers_devops/cli_self.py +98 -48
  85. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  86. machineconfig/scripts/python/helpers_devops/cli_share_server.py +80 -42
  87. machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
  88. machineconfig/scripts/python/helpers_devops/cli_utils.py +3 -128
  89. machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +4 -4
  90. machineconfig/scripts/python/helpers_devops/devops_status.py +7 -19
  91. machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +1 -1
  92. machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  93. machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
  94. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  95. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +3 -3
  96. machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
  97. machineconfig/scripts/python/helpers_navigator/command_tree.py +50 -18
  98. machineconfig/scripts/python/helpers_network/address.py +132 -0
  99. machineconfig/scripts/python/{nw → helpers_network}/devops_add_ssh_key.py +24 -5
  100. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs +0 -1
  101. machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
  102. machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
  103. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
  104. machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
  105. machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
  106. machineconfig/scripts/python/{nw → helpers_network}/wsl_windows_transfer.py +3 -2
  107. machineconfig/scripts/python/helpers_repos/clone.py +0 -1
  108. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +46 -19
  109. machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
  110. machineconfig/scripts/python/helpers_repos/grource.py +1 -1
  111. machineconfig/scripts/python/helpers_repos/record.py +2 -1
  112. machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
  113. machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
  114. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +20 -13
  115. machineconfig/scripts/python/helpers_utils/download.py +150 -0
  116. machineconfig/scripts/python/helpers_utils/path.py +185 -0
  117. machineconfig/scripts/python/interactive.py +19 -26
  118. machineconfig/scripts/python/{mcfg.py → mcfg_entry.py} +10 -0
  119. machineconfig/scripts/python/msearch.py +71 -0
  120. machineconfig/scripts/python/sessions.py +94 -25
  121. machineconfig/scripts/python/terminal.py +133 -0
  122. machineconfig/scripts/python/utils.py +28 -30
  123. machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
  124. machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
  125. machineconfig/settings/broot/conf.toml +1 -1
  126. machineconfig/settings/helix/config.toml +16 -0
  127. machineconfig/settings/helix/languages.toml +13 -4
  128. machineconfig/settings/helix/yazi-picker.sh +12 -0
  129. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  130. machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
  131. machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
  132. machineconfig/settings/lf/windows/lfrc +14 -16
  133. machineconfig/settings/marimo/marimo.toml +1 -1
  134. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  135. machineconfig/settings/shells/bash/init.sh +43 -11
  136. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
  137. machineconfig/settings/shells/nushell/config.nu +2 -32
  138. machineconfig/settings/shells/nushell/env.nu +45 -6
  139. machineconfig/settings/shells/nushell/init.nu +314 -0
  140. machineconfig/settings/shells/pwsh/init.ps1 +40 -14
  141. machineconfig/settings/shells/starship/starship.toml +16 -0
  142. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  143. machineconfig/settings/shells/wt/settings.json +14 -5
  144. machineconfig/settings/shells/zsh/init.sh +17 -19
  145. machineconfig/settings/television/cable_unix/alias.toml +8 -0
  146. machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
  147. machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
  148. machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
  149. machineconfig/settings/television/cable_unix/channels.toml +19 -0
  150. machineconfig/settings/television/cable_unix/dirs.toml +13 -0
  151. machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
  152. machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
  153. machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
  154. machineconfig/settings/television/cable_unix/env.toml +17 -0
  155. machineconfig/settings/television/cable_unix/files.toml +11 -0
  156. machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
  157. machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
  158. machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
  159. machineconfig/settings/television/cable_unix/git-log.toml +12 -0
  160. machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
  161. machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
  162. machineconfig/settings/television/cable_unix/guix.toml +20 -0
  163. machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
  164. machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
  165. machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
  166. machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
  167. machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
  168. machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
  169. machineconfig/settings/television/cable_unix/procs.toml +20 -0
  170. machineconfig/settings/television/cable_unix/text.toml +17 -0
  171. machineconfig/settings/television/cable_unix/tldr.toml +18 -0
  172. machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
  173. machineconfig/settings/television/cable_windows/alias.toml +7 -0
  174. machineconfig/settings/television/cable_windows/dirs.toml +13 -0
  175. machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
  176. machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
  177. machineconfig/settings/television/cable_windows/env.toml +17 -0
  178. machineconfig/settings/television/cable_windows/files.toml +14 -0
  179. machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
  180. machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
  181. machineconfig/settings/television/cable_windows/git-log.toml +11 -0
  182. machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
  183. machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
  184. machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
  185. machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
  186. machineconfig/settings/television/cable_windows/text.toml +17 -0
  187. machineconfig/settings/yazi/init.lua +61 -0
  188. machineconfig/settings/yazi/keymap_linux.toml +94 -0
  189. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  190. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  191. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  192. machineconfig/settings/yazi/theme.toml +4 -0
  193. machineconfig/settings/yazi/yazi_linux.toml +84 -0
  194. machineconfig/settings/yazi/yazi_windows.toml +58 -0
  195. machineconfig/setup_linux/__init__.py +2 -1
  196. machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
  197. machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
  198. machineconfig/setup_mac/__init__.py +2 -3
  199. machineconfig/setup_mac/apps_gui.sh +248 -0
  200. machineconfig/setup_windows/__init__.py +3 -3
  201. machineconfig/setup_windows/uv.ps1 +8 -1
  202. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -11
  203. machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
  204. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
  205. machineconfig/utils/accessories.py +7 -4
  206. machineconfig/utils/code.py +99 -32
  207. machineconfig/utils/files/ascii_art.py +1 -1
  208. machineconfig/utils/files/headers.py +3 -2
  209. machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
  210. machineconfig/utils/installer_utils/install_from_url.py +183 -0
  211. machineconfig/utils/installer_utils/installer_class.py +42 -99
  212. machineconfig/utils/installer_utils/installer_cli.py +175 -0
  213. machineconfig/utils/installer_utils/installer_helper.py +129 -0
  214. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +36 -85
  215. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -61
  216. machineconfig/utils/io.py +69 -1
  217. machineconfig/utils/links.py +56 -38
  218. machineconfig/utils/meta.py +33 -18
  219. machineconfig/utils/options.py +46 -18
  220. machineconfig/utils/options_tv.py +119 -0
  221. machineconfig/utils/path_extended.py +44 -95
  222. machineconfig/utils/path_helper.py +76 -23
  223. machineconfig/utils/procs.py +1 -1
  224. machineconfig/utils/scheduler.py +20 -53
  225. machineconfig/utils/scheduling.py +0 -2
  226. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  227. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  228. machineconfig/utils/ssh.py +159 -412
  229. machineconfig/utils/ssh_utils/abc.py +5 -0
  230. machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
  231. machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
  232. machineconfig/utils/ssh_utils/utils.py +142 -0
  233. machineconfig/utils/ssh_utils/wsl.py +210 -0
  234. machineconfig/utils/terminal.py +1 -0
  235. machineconfig/utils/upgrade_packages.py +104 -28
  236. machineconfig/utils/ve.py +12 -4
  237. machineconfig-7.98.dist-info/METADATA +132 -0
  238. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/RECORD +259 -196
  239. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/entry_points.txt +4 -1
  240. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
  241. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
  242. machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
  243. machineconfig/scripts/linux/fzf2g +0 -21
  244. machineconfig/scripts/linux/fzfag +0 -17
  245. machineconfig/scripts/linux/fzffg +0 -25
  246. machineconfig/scripts/linux/fzfrga +0 -21
  247. machineconfig/scripts/linux/mcfgs +0 -38
  248. machineconfig/scripts/linux/other/share_smb +0 -1
  249. machineconfig/scripts/linux/skrg +0 -4
  250. machineconfig/scripts/linux/warp-cli.sh +0 -122
  251. machineconfig/scripts/linux/z_ls +0 -104
  252. machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
  253. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
  254. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
  255. machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
  256. machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
  257. machineconfig/scripts/python/helpers_fire/template.sh +0 -15
  258. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
  259. machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
  260. machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
  261. machineconfig/scripts/windows/fzfb.ps1 +0 -3
  262. machineconfig/scripts/windows/fzfg.ps1 +0 -2
  263. machineconfig/scripts/windows/fzfrga.bat +0 -20
  264. machineconfig/scripts/windows/mcfgs.ps1 +0 -17
  265. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  266. machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
  267. machineconfig/settings/lf/windows/tst.ps1 +0 -1
  268. machineconfig/settings/yazi/yazi.toml +0 -4
  269. machineconfig/setup_linux/apps.sh +0 -66
  270. machineconfig/setup_linux/others/cli_installation.sh +0 -137
  271. machineconfig/setup_mac/apps.sh +0 -73
  272. machineconfig/setup_windows/apps.ps1 +0 -62
  273. machineconfig/utils/installer_utils/installer.py +0 -225
  274. machineconfig-6.82.dist-info/METADATA +0 -82
  275. /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
  276. /machineconfig/scripts/python/{helpers_fire → ai/utils}/__init__.py +0 -0
  277. /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_agents}/__init__.py +0 -0
  278. /machineconfig/scripts/python/{nw → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  279. /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
  280. /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
  281. /machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
  282. /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
  283. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_network/__init__.py} +0 -0
  284. /machineconfig/scripts/python/{nw → helpers_network}/devops_add_identity.py +0 -0
  285. /machineconfig/scripts/python/{nw → helpers_network}/mount_drive +0 -0
  286. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive +0 -0
  287. /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
  288. /machineconfig/scripts/python/{nw → helpers_network}/mount_smb +0 -0
  289. /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
  290. /machineconfig/scripts/{Restore-ThunderbirdProfile.ps1 → windows/mounts/Restore-ThunderbirdProfile.ps1} +0 -0
  291. /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  292. /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  293. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
  294. {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,150 @@
1
+
2
+
3
+ from typing import Annotated, Optional
4
+ import typer
5
+ from pathlib import Path
6
+
7
+
8
+ def download(
9
+ url: Annotated[Optional[str], typer.Argument(..., help="The URL to download the file from.")] = None,
10
+ decompress: Annotated[bool, typer.Option(..., "--decompress", "-d", help="Decompress the file if it's an archive.")] = False,
11
+ output: Annotated[Optional[str], typer.Option("--output", "-o", help="The output file path.")] = None,
12
+ output_dir: Annotated[Optional[str], typer.Option("--output-dir", help="Directory to place the downloaded file in.")] = None,
13
+ ) -> Optional["Path"]:
14
+ import subprocess
15
+ from urllib.parse import parse_qs, unquote, urlparse
16
+ from requests import Response
17
+ import requests
18
+ from pathlib import Path
19
+ if url is None:
20
+ typer.echo("❌ Error: URL is required.", err=True)
21
+ return None
22
+ if output is not None and output_dir is not None:
23
+ typer.echo("❌ Error: --output and --output-dir cannot be used together.", err=True)
24
+ return None
25
+ typer.echo(f"📥 Downloading from: {url}")
26
+
27
+ def _sanitize_candidate_filename(name: str) -> Optional[str]:
28
+ candidate = Path(name).name.strip()
29
+ if not candidate or candidate in {".", ".."}:
30
+ return None
31
+ return candidate
32
+
33
+ def _filename_from_content_disposition(header_value: Optional[str]) -> Optional[str]:
34
+ if header_value is None:
35
+ return None
36
+ parts = [segment.strip() for segment in header_value.split(";")]
37
+ for part in parts:
38
+ lower = part.lower()
39
+ if lower.startswith("filename*="):
40
+ value = part.split("=", 1)[1]
41
+ value = value.strip().strip('"')
42
+ if "''" in value:
43
+ value = value.split("''", 1)[1]
44
+ decoded = unquote(value)
45
+ sanitized = _sanitize_candidate_filename(decoded)
46
+ if sanitized is not None:
47
+ return sanitized
48
+ if lower.startswith("filename="):
49
+ value = part.split("=", 1)[1].strip().strip('"')
50
+ decoded = unquote(value)
51
+ sanitized = _sanitize_candidate_filename(decoded)
52
+ if sanitized is not None:
53
+ return sanitized
54
+ return None
55
+
56
+ def _filename_from_url(source_url: str) -> Optional[str]:
57
+ parsed = urlparse(source_url)
58
+ url_candidate = _sanitize_candidate_filename(unquote(Path(parsed.path).name))
59
+ if url_candidate is not None:
60
+ return url_candidate
61
+ query_params = parse_qs(parsed.query, keep_blank_values=True)
62
+ for key, values in query_params.items():
63
+ lower_key = key.lower()
64
+ if "name" in lower_key or "file" in lower_key:
65
+ for value in values:
66
+ sanitized = _sanitize_candidate_filename(unquote(value))
67
+ if sanitized is not None:
68
+ return sanitized
69
+ return None
70
+
71
+ def _resolve_download_path(request_url: str, response: Response, requested_output: Optional[str], requested_output_dir: Optional[str]) -> Path:
72
+ if requested_output is not None:
73
+ return Path(requested_output)
74
+ header_candidate = _filename_from_content_disposition(response.headers.get("content-disposition"))
75
+ if header_candidate is None:
76
+ header_candidate = _filename_from_url(response.url)
77
+ if header_candidate is None:
78
+ header_candidate = _filename_from_url(request_url)
79
+ if header_candidate is None:
80
+ header_candidate = "downloaded_file"
81
+ if requested_output_dir is not None:
82
+ return Path(requested_output_dir) / header_candidate
83
+ return Path(header_candidate)
84
+
85
+ try:
86
+ with requests.get(url, allow_redirects=True, stream=True, timeout=60) as response:
87
+ response.raise_for_status()
88
+ download_path = _resolve_download_path(url, response, output, output_dir)
89
+ download_path.parent.mkdir(parents=True, exist_ok=True)
90
+ total_size_header = response.headers.get("content-length", "0")
91
+ try:
92
+ total_size = int(total_size_header)
93
+ except (TypeError, ValueError):
94
+ total_size = 0
95
+ if total_size <= 0:
96
+ with open(download_path, "wb") as file_handle:
97
+ file_handle.write(response.content)
98
+ else:
99
+ downloaded = 0
100
+ chunk_size = 8192 * 40
101
+ with open(download_path, "wb") as file_handle:
102
+ for chunk in response.iter_content(chunk_size=chunk_size):
103
+ if not chunk:
104
+ continue
105
+ file_handle.write(chunk)
106
+ downloaded += len(chunk)
107
+ progress = (downloaded / total_size) * 100
108
+ typer.echo(f"\r⏬ Progress: {progress:.1f}% ({downloaded}/{total_size} bytes)", nl=False)
109
+ typer.echo()
110
+ except requests.exceptions.RequestException as exception:
111
+ typer.echo(f"❌ Download failed: {exception}", err=True)
112
+ return None
113
+ except OSError as exception:
114
+ typer.echo(f"❌ File write error: {exception}", err=True)
115
+ return None
116
+
117
+ typer.echo(f"✅ Downloaded to: {download_path}")
118
+ result_path: Path = download_path
119
+ if decompress:
120
+ typer.echo(f"📦 Decompressing: {download_path}")
121
+ base_name = download_path.name.split(".", maxsplit=1)[0] # ouch decompresses all (e.g. .tar.gz) in one go.
122
+ if base_name in {"", ".", ".."}:
123
+ base_name = "extracted"
124
+ extract_dir = download_path.parent / base_name
125
+ extract_dir.mkdir(parents=True, exist_ok=True)
126
+ try:
127
+ subprocess.run(
128
+ ["ouch", "decompress", str(download_path), "--dir", str(extract_dir)],
129
+ check=True,
130
+ capture_output=True,
131
+ text=True,
132
+ )
133
+ typer.echo(f"✅ Decompressed to: {extract_dir}")
134
+ if download_path.exists():
135
+ download_path.unlink()
136
+ typer.echo(f"🗑️ Removed archive: {download_path}")
137
+ result_path = extract_dir
138
+ except subprocess.CalledProcessError as exception:
139
+ typer.echo(f"❌ Decompression failed: {exception.stderr}", err=True)
140
+ return None
141
+ except FileNotFoundError:
142
+ typer.echo("❌ Error: ouch command not found. Please install ouch.", err=True)
143
+ typer.echo("💡 Install with: cargo install ouch", err=True)
144
+ return None
145
+
146
+ return result_path.resolve()
147
+
148
+
149
+ if __name__ == "__main__":
150
+ pass
@@ -0,0 +1,185 @@
1
+ import typer
2
+ from typing import Optional, Annotated, Literal, TypedDict, cast
3
+
4
+
5
+ def tui_env(which: Annotated[Literal["PATH", "p", "ENV", "e"], typer.Argument(help="Which environment variable to display.")] = "ENV") -> None:
6
+ """📚 NAVIGATE PATH variable with TUI"""
7
+ from machineconfig.scripts.python import env_manager as navigator
8
+ from pathlib import Path
9
+
10
+ match which:
11
+ case "PATH" | "p":
12
+ path = Path(navigator.__file__).resolve().parent.joinpath("path_manager_tui.py")
13
+ case "ENV" | "e":
14
+ path = Path(navigator.__file__).resolve().parent.joinpath("env_manager_tui.py")
15
+ from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
16
+
17
+ uv_with = ["textual"]
18
+ uv_project_dir = None
19
+ if not Path.home().joinpath("code/machineconfig").exists():
20
+ uv_with.append("machineconfig>=7.98")
21
+ else:
22
+ uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
23
+ run_shell_script(
24
+ get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0]
25
+ )
26
+
27
+
28
+ def init_project(
29
+ name: Annotated[Optional[str], typer.Option("--name", "-n", help="Name of the project.")] = None,
30
+ tmp_dir: Annotated[
31
+ bool, typer.Option("--tmp-dir", "-t", help="Use a temporary directory for the project initialization.")
32
+ ] = False,
33
+ python: Annotated[Literal["3.13", "3.14"], typer.Option("--python", "-p", help="Python version for the uv virtual environment.")] = "3.13",
34
+ libraries: Annotated[Optional[str], typer.Option("--libraries", "-l", help="Additional packages to include in the uv virtual environment.")] = None,
35
+ group: Annotated[Optional[str], typer.Option("--group", "-g", help="group of packages names (no separation) p:plot, t:types, l:linting, i:interactive, d:data")] = "ptlid",
36
+ # types_packages: Annotated[
37
+ # bool, typer.Option("--types-packages/--no-types-packages", "-T/-NT", help="Include types packages for better type hinting.")
38
+ # ] = True,
39
+ # linting_debug_packages: Annotated[
40
+ # bool, typer.Option("--linting-debug-packages/--no-linting-debug-packages", "-L/-NL", help="Include linting and debugging packages.")
41
+ # ] = True,
42
+ # ia_packages: Annotated[bool, typer.Option("--ia-packages/--no-ia-packages", "-I/-NI", help="Include interactive and IA packages.")] = True,
43
+ # plot_packages: Annotated[bool, typer.Option("--plot-packages/--no-plot-packages", "-P/-NP", help="Include plotting packages.")] = True,
44
+ # data_packages: Annotated[bool, typer.Option("--data-packages/--no-data-packages", "-D/-ND", help="Include data manipulation packages.")] = True,
45
+
46
+ ) -> None:
47
+ if libraries is not None:
48
+ packages_add_line = f"uv add {libraries}"
49
+ else:
50
+ packages_add_line = ""
51
+ from pathlib import Path
52
+ if not tmp_dir:
53
+ repo_root = Path.cwd()
54
+ if not (repo_root / "pyproject.toml").exists():
55
+ typer.echo(f"❌ Error: pyproject.toml not found in {repo_root}", err=True)
56
+ raise typer.Exit(code=1)
57
+ starting_code = ""
58
+ else:
59
+ if name is not None:
60
+ from machineconfig.utils.accessories import randstr
61
+ repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{name}")
62
+ else:
63
+ from machineconfig.utils.accessories import randstr
64
+ repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{randstr(6)}")
65
+ repo_root.mkdir(parents=True, exist_ok=True)
66
+ print(f"Using temporary directory for project initialization: {repo_root}")
67
+ starting_code = f"""
68
+ cd {repo_root}
69
+ uv init --python {python}
70
+ uv venv
71
+ """
72
+ print(f"Adding group `{group}` with common data science and plotting packages...")
73
+ total_packages: list[str] = []
74
+ if group is not None:
75
+ if "t" in group:
76
+ total_packages.append(
77
+ "types-python-dateutil types-pyyaml types-requests types-tqdm types-mysqlclient types-paramiko types-pytz types-sqlalchemy types-toml types-urllib3"
78
+ )
79
+ if "l" in group:
80
+ total_packages.append("mypy pyright ruff pylint pyrefly cleanpy ipdb pudb")
81
+ if "i" in group:
82
+ total_packages.append("ipython ipykernel jupyterlab nbformat marimo")
83
+ if "p" in group:
84
+ total_packages.append("python-magic matplotlib plotly kaleido")
85
+ if "d" in group:
86
+ total_packages.append("numpy pandas polars duckdb-engine sqlalchemy psycopg2-binary pyarrow tqdm openpyxl")
87
+ from machineconfig.utils.ve import get_ve_activate_line
88
+
89
+ script = f"""
90
+ {starting_code}
91
+ {packages_add_line}
92
+ uv add --group {group} {" ".join(total_packages)}
93
+ {get_ve_activate_line(ve_root=str(repo_root.joinpath(".venv")))}
94
+ ls
95
+ """
96
+ from machineconfig.utils.code import exit_then_run_shell_script
97
+
98
+ exit_then_run_shell_script(script)
99
+
100
+
101
+ def edit_file_with_hx(
102
+ path: Annotated[Optional[str], typer.Argument(..., help="The root directory of the project to edit, or a file path.")] = None,
103
+ ) -> None:
104
+ from pathlib import Path
105
+
106
+ if path is None:
107
+ root_path = Path.cwd()
108
+ print(f"No path provided. Using current working directory: {root_path}")
109
+ else:
110
+ root_path = Path(path).expanduser().resolve()
111
+ print(f"Using provided path: {root_path}")
112
+ from machineconfig.utils.accessories import get_repo_root
113
+
114
+ repo_root = get_repo_root(root_path)
115
+ if repo_root is not None and repo_root.joinpath("pyproject.toml").exists():
116
+ code = f"""
117
+ cd {repo_root}
118
+ uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp # for helix editor.
119
+ source ./.venv/bin/activate
120
+ """
121
+ else:
122
+ code = ""
123
+ if root_path.is_file():
124
+ code += f"hx {root_path}"
125
+ else:
126
+ code += "hx"
127
+ from machineconfig.utils.code import exit_then_run_shell_script
128
+
129
+ exit_then_run_shell_script(code)
130
+
131
+
132
+ class MachineSpecs(TypedDict):
133
+ system: Literal["Windows", "Linux", "Darwin"]
134
+ distro: str
135
+ home_dir: str
136
+ hostname: str
137
+ release: str
138
+ version: str
139
+ machine: str
140
+ processor: str
141
+ python_version: str
142
+ user: str
143
+
144
+
145
+ def get_machine_specs() -> MachineSpecs:
146
+ """Write print and return the local machine specs."""
147
+ import platform
148
+ from machineconfig.utils.code import get_uv_run_command
149
+
150
+ uv_run_cmd = get_uv_run_command(platform=platform.system()) # type: ignore
151
+ command = f"""{uv_run_cmd} --with distro python -c "import distro; print(distro.name(pretty=True))" """
152
+ import subprocess
153
+ from pathlib import Path
154
+ import socket
155
+ import os
156
+
157
+ distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
158
+ system = platform.system()
159
+ if system not in {"Windows", "Linux", "Darwin"}:
160
+ system = "Linux"
161
+ specs: MachineSpecs = {
162
+ "system": cast(Literal["Windows", "Linux", "Darwin"], system),
163
+ "distro": distro,
164
+ "home_dir": str(Path.home()),
165
+ "hostname": socket.gethostname(),
166
+ "release": platform.release(),
167
+ "version": platform.version(),
168
+ "machine": platform.machine(),
169
+ "processor": platform.processor() or "Unknown",
170
+ "python_version": platform.python_version(),
171
+ "user": os.getenv("USER") or os.getenv("USERNAME") or "Unknown",
172
+ }
173
+ print(specs)
174
+ from machineconfig.utils.source_of_truth import CONFIG_ROOT
175
+
176
+ path = CONFIG_ROOT.joinpath("machine_specs.json")
177
+ CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
178
+ import json
179
+
180
+ path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
181
+ return specs
182
+
183
+
184
+ if __name__ == "__main__":
185
+ get_machine_specs()
@@ -19,9 +19,7 @@ for better user experience with checkbox selections.
19
19
 
20
20
  import sys
21
21
  from pathlib import Path
22
- # from typing import cast
23
22
  import platform
24
-
25
23
  import questionary
26
24
  from questionary import Choice
27
25
  from rich.console import Console
@@ -29,12 +27,11 @@ from rich.panel import Panel
29
27
  from rich.text import Text
30
28
  from machineconfig.utils.code import run_shell_script
31
29
 
32
- # _ = cast
33
30
  console = Console()
34
31
 
35
32
 
36
33
  def display_header() -> None:
37
- from machineconfig.utils.installer import get_machineconfig_version
34
+ from machineconfig.utils.installer_utils.installer_runner import get_machineconfig_version
38
35
  from rich.align import Align
39
36
 
40
37
  # Fancy ASCII art header
@@ -96,35 +93,31 @@ def display_dotfiles_instructions() -> None:
96
93
  def get_installation_choices() -> list[str]:
97
94
  """Get user choices for installation options."""
98
95
  choices = [
99
- Choice(value="install_machineconfig", title="🐍 Install machineconfig.", checked=False),
100
- Choice(value="ESSENTIAL_SYSTEM", title="📥 Install Essential System Packages.", checked=False),
101
- Choice(value="ESSENTIAL", title="⚡ Install CLI apps essentials", checked=False),
102
- Choice(value="DEV_SYSTEM", title="🛠️ Install CLI apps development.", checked=False),
103
- Choice(value="TerminalEyeCandy", title="🎨 Install CLI apps terminal eye candy.", checked=False),
104
- Choice(value="install_ssh_server", title="🔒 Install SSH Server", checked=False),
105
- Choice(value="install_shell_profile", title="🐚 Configure Shell Profile.", checked=False),
106
- Choice(value="retrieve_repositories", title="📚 Retrieve Repositories", checked=False),
107
- Choice(value="retrieve_data", title="💾 Retrieve Data.", checked=False),
96
+ Choice(value="install_machineconfig", title="🐍 Install machineconfig cli.", checked=False),
97
+ Choice(value="sysabc", title="📥 Install System Package Manager (Needed for other apps to be installed).", checked=False),
98
+ Choice(value="termabc", title="⚡ Install Terminal CLI apps essentials (group `termabc`)", checked=False),
99
+ Choice(value="install_shell_profile", title="🐚 Configure Shell Profile And Map Other Configs.", checked=False),
100
+ Choice(value="install_ssh_server", title="🔒 [ADVANCED] Configure SSH Server", checked=False),
101
+ Choice(value="retrieve_repositories", title="📚 [ADVANCED] Retrieve Repositories", checked=False),
102
+ Choice(value="retrieve_data", title="💾 [ADVANCED] Retrieve Data.", checked=False),
108
103
  ]
109
- # Add Windows-specific options
110
- if platform.system() == "Windows":
111
- choices.append(Choice(value="install_windows_desktop", title="💻 Install Windows Desktop Apps - Install nerd fonts and set WT config.", checked=False))
112
104
  selected = questionary.checkbox("Select the installation options you want to execute:", choices=choices, show_description=True).ask()
113
105
  return selected or []
114
106
 
115
107
 
116
108
  def execute_installations(selected_options: list[str]) -> None:
117
109
  for maybe_a_group in selected_options:
118
- if maybe_a_group in ("ESSENTIAL", "DEV", "ESSENTIAL_SYSTEM", "DEV_SYSTEM", "TerminalEyeCandy"):
110
+ if maybe_a_group in ("termabc", "sysabc"):
119
111
  console.print(Panel("⚡ [bold bright_yellow]CLI APPLICATIONS[/bold bright_yellow]\n[italic]Command-line tools installation[/italic]", border_style="bright_yellow"))
120
112
  console.print("🔧 Installing CLI applications", style="bold cyan")
121
113
  try:
122
- from machineconfig.utils.installer_utils.installer import main as devops_devapps_install_main
114
+ from machineconfig.utils.installer_utils.installer_cli import main_installer_cli as devops_devapps_install_main
123
115
  devops_devapps_install_main(group=True, which=maybe_a_group, interactive=False)
124
116
  console.print("✅ CLI applications installed successfully", style="bold green")
125
117
  except Exception as e:
126
118
  console.print(f"❌ Error installing CLI applications: {e}", style="bold red")
127
- run_shell_script(". $HOME/.bashrc")
119
+ if platform.system() != "Windows":
120
+ run_shell_script(". $HOME/.bashrc")
128
121
 
129
122
  if "install_machineconfig" in selected_options:
130
123
  console.print(Panel("🐍 [bold green]PYTHON ENVIRONMENT[/bold green]\n[italic]Virtual environment setup[/italic]", border_style="green"))
@@ -133,7 +126,6 @@ def execute_installations(selected_options: list[str]) -> None:
133
126
 
134
127
  if "install_ssh_server" in selected_options:
135
128
  console.print(Panel("🔒 [bold red]SSH SERVER[/bold red]\n[italic]Remote access setup[/italic]", border_style="red"))
136
- import platform
137
129
  if platform.system() == "Windows":
138
130
  powershell_script = """Write-Host "🔧 Installing and configuring SSH server..."
139
131
  Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
@@ -150,6 +142,13 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
150
142
  from machineconfig.profile.create_shell_profile import create_default_shell_profile
151
143
  create_default_shell_profile()
152
144
  console.print("✅ Shell profile configured successfully", style="bold green")
145
+ from machineconfig.profile.create_links_export import main_public_from_parser
146
+ main_public_from_parser(method="copy", on_conflict="overwrite-default-path", which="all", interactive=False)
147
+ if platform.system() == "Windows":
148
+ from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
149
+ install_nerd_fonts()
150
+ from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
151
+ set_wt_settings_main()
153
152
  except Exception as e:
154
153
  console.print(f"❌ Error configuring shell profile: {e}", style="bold red")
155
154
 
@@ -168,12 +167,6 @@ Set-Service -Name sshd -StartupType 'Automatic'"""
168
167
  except Exception as e:
169
168
  console.print(f"❌ Error retrieving backup data: {e}", style="bold red")
170
169
 
171
- if "install_windows_desktop" in selected_options:
172
- from machineconfig.jobs.installer.custom_dev.nerfont_windows_helper import install_nerd_fonts
173
- install_nerd_fonts()
174
- from machineconfig.setup_windows.wt_and_pwsh.set_wt_settings import main as set_wt_settings_main
175
- set_wt_settings_main()
176
-
177
170
 
178
171
  def main() -> None:
179
172
  display_header()
@@ -8,6 +8,7 @@ from machineconfig.scripts.python.utils import get_app as get_utils_app
8
8
  from machineconfig.scripts.python.ftpx import ftpx as ftpx_func
9
9
  from machineconfig.scripts.python.croshell import croshell as croshell_func
10
10
  from machineconfig.scripts.python.fire_jobs import fire as get_fire_jobs_app
11
+ from machineconfig.scripts.python.terminal import get_app as get_terminal_app
11
12
 
12
13
  def get_app():
13
14
  import typer
@@ -40,9 +41,18 @@ def get_app():
40
41
  app.add_typer(utils_app, name="utils", help="[u] Utility commands", no_args_is_help=True)
41
42
  app.add_typer(utils_app, name="u", hidden=True) # short alias
42
43
 
44
+
45
+ terminal_app = get_terminal_app()
46
+ app.add_typer(terminal_app, name="terminal", help="[t] Terminal management commands", no_args_is_help=True)
47
+ app.add_typer(terminal_app, name="t", hidden=True) # short alias
48
+
43
49
  return app
44
50
 
45
51
 
46
52
  def main():
47
53
  app = get_app()
48
54
  app()
55
+
56
+
57
+ if __name__ == "__main__":
58
+ main()
@@ -0,0 +1,71 @@
1
+
2
+ import typer
3
+ from typing import Annotated
4
+
5
+
6
+ def machineconfig_search(
7
+ directory: Annotated[str, typer.Option(..., "--directory", "-d", help="The directory to search")] = ".",
8
+ ast: Annotated[bool, typer.Option(..., "--ast", "-a", help="The abstract syntax tree search/ tree sitter search of symbols")] = False,
9
+ symantic: Annotated[bool, typer.Option(..., "--symantic", "-s", help="The symantic search of symbols")] = False,
10
+ extension: Annotated[str, typer.Option(..., "--extension", "-e", help="File extension to filter by (e.g., .py, .js)")] = "",
11
+ file: Annotated[bool, typer.Option(..., "--file", "-f", help="File search using fzf")] = False,
12
+ no_dotfiles: Annotated[bool, typer.Option(..., "--no-dotfiles", "-D", help="Exclude dotfiles from search")] = False,
13
+ rga: Annotated[bool, typer.Option(..., "--rga", "-a", help="Use ripgrep-all for searching instead of ripgrep")] = False,
14
+ install_dependencies: Annotated[bool, typer.Option(..., "--install-dependencies", "-p", help="Install required dependencies if missing")] = False
15
+ ):
16
+ if install_dependencies:
17
+ from machineconfig.utils.installer_utils.installer_cli import install_if_missing
18
+ install_if_missing("fzf")
19
+ install_if_missing("tv")
20
+ install_if_missing("bat")
21
+ install_if_missing("fd")
22
+ install_if_missing("rg") # ripgrep
23
+ install_if_missing("rga") # ripgrep-all
24
+ # install_if_missing("tree-sitter-cli")
25
+ return
26
+ if symantic:
27
+ script = ""
28
+ for an_ex in extension.split(","):
29
+ script = script + f"""\nparse *.{an_ex} """
30
+ from machineconfig.utils.code import run_shell_script
31
+ run_shell_script(script=script)
32
+ return
33
+ if ast:
34
+ from machineconfig.scripts.python.helpers.ast_search import get_repo_symbols
35
+ symbols = get_repo_symbols(directory)
36
+ from machineconfig.utils.options import choose_from_options
37
+ try:
38
+ res = choose_from_options(options=symbols, msg="Select a symbol to search for:", tv=True, multi=False)
39
+ from rich import print_json
40
+ import json
41
+ res_json = json.dumps(res, indent=4)
42
+ print_json(res_json)
43
+ return None
44
+ except Exception as e:
45
+ print(f"❌ Error during selection: {e}")
46
+ return None
47
+ if file:
48
+ script = """fzf --ansi --preview-window 'right:60%' --preview 'bat --color=always --style=numbers,grid,header --line-range :300 {}' """
49
+ if no_dotfiles:
50
+ script = "fd | " + script
51
+ from machineconfig.utils.code import run_shell_script
52
+ run_shell_script(script=script)
53
+ return
54
+ from machineconfig.scripts.python.helpers_msearch import FZFG_LINUX_PATH, FZFG_WINDOWS_PATH
55
+ import platform
56
+ if platform.system() == "Linux" or platform.system() == "Darwin":
57
+ script = FZFG_LINUX_PATH.read_text(encoding="utf-8")
58
+ elif platform.system() == "Windows":
59
+ script = FZFG_WINDOWS_PATH.read_text(encoding="utf-8")
60
+ else:
61
+ raise RuntimeError("Unsupported platform")
62
+ if rga:
63
+ script = script.replace("rg ", "rga ").replace("ripgrep", "ripgrep-all")
64
+ from machineconfig.utils.code import exit_then_run_shell_script
65
+ exit_then_run_shell_script(script=script, strict=False)
66
+
67
+
68
+ def main():
69
+ app = typer.Typer(add_completion=False, no_args_is_help=True)
70
+ app.command(name="msearch", help="machineconfig search helper", no_args_is_help=False)(machineconfig_search)
71
+ app()