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

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

Potentially problematic release.


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

Files changed (389) hide show
  1. machineconfig/__init__.py +0 -28
  2. machineconfig/cluster/remote/distribute.py +0 -1
  3. machineconfig/cluster/remote/file_manager.py +0 -2
  4. machineconfig/cluster/remote/script_execution.py +0 -1
  5. machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
  6. machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
  7. machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
  8. machineconfig/cluster/sessions_managers/wt_local.py +114 -289
  9. machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
  10. machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
  11. machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
  12. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
  13. machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
  14. machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
  15. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
  16. machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
  17. machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
  18. machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
  19. machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
  20. machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
  21. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
  22. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
  23. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
  24. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
  25. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
  26. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
  27. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
  28. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
  29. machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
  30. machineconfig/jobs/{python → installer}/check_installations.py +2 -3
  31. machineconfig/jobs/installer/custom/boxes.py +61 -0
  32. machineconfig/jobs/installer/custom/hx.py +76 -19
  33. machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
  34. machineconfig/jobs/installer/custom_dev/brave.py +1 -7
  35. machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
  36. machineconfig/jobs/installer/custom_dev/code.py +4 -1
  37. machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
  38. machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
  39. machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
  40. machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
  41. machineconfig/jobs/installer/installer_data.json +1101 -115
  42. machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
  43. machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
  44. machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
  45. machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
  46. machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
  47. machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
  48. machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
  49. machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
  50. machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
  51. machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
  52. machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
  53. machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
  54. machineconfig/jobs/installer/package_groups.py +108 -180
  55. machineconfig/logger.py +0 -1
  56. machineconfig/profile/backup.toml +49 -0
  57. machineconfig/profile/bash_shell_profiles.md +11 -0
  58. machineconfig/profile/create_helper.py +74 -0
  59. machineconfig/profile/create_links.py +288 -0
  60. machineconfig/profile/create_links_export.py +100 -0
  61. machineconfig/profile/create_shell_profile.py +136 -0
  62. machineconfig/profile/mapper.toml +258 -0
  63. machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
  64. machineconfig/scripts/__init__.py +0 -4
  65. machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
  66. machineconfig/scripts/linux/wrap_mcfg +47 -0
  67. machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
  68. machineconfig/scripts/python/agents.py +92 -103
  69. machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
  70. machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
  71. machineconfig/scripts/python/ai/generate_files.py +307 -42
  72. machineconfig/scripts/python/ai/initai.py +3 -28
  73. machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
  74. machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
  75. machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
  76. machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
  77. machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
  78. machineconfig/scripts/python/ai/solutions/generic.py +27 -4
  79. machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
  80. machineconfig/scripts/python/cloud.py +29 -0
  81. machineconfig/scripts/python/croshell.py +111 -114
  82. machineconfig/scripts/python/define.py +31 -0
  83. machineconfig/scripts/python/devops.py +44 -103
  84. machineconfig/scripts/python/devops_navigator.py +10 -0
  85. machineconfig/scripts/python/env_manager/__init__.py +1 -0
  86. machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
  87. machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
  88. machineconfig/scripts/python/explore.py +49 -0
  89. machineconfig/scripts/python/fire_jobs.py +115 -152
  90. machineconfig/scripts/python/ftpx.py +29 -24
  91. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
  92. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
  93. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
  94. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
  95. machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
  96. machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
  97. machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
  98. machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
  99. machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
  100. machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
  101. machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
  102. machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
  103. machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
  104. machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
  105. machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
  106. machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
  107. machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
  108. machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
  109. machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
  110. machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
  111. machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
  112. machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
  113. machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
  114. machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
  115. machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
  116. machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
  117. machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
  118. machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
  119. machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
  120. machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
  121. machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
  122. machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
  123. machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
  124. machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
  125. machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
  126. machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
  127. machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
  128. machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
  129. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
  130. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
  131. machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
  132. machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
  133. machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
  134. machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
  135. machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
  136. machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
  137. machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
  138. machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
  139. machineconfig/scripts/python/helpers_repos/action.py +209 -0
  140. machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
  141. machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
  142. machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
  143. machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
  144. machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
  145. machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
  146. machineconfig/scripts/python/helpers_repos/grource.py +340 -0
  147. machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
  148. machineconfig/scripts/python/helpers_repos/sync.py +66 -0
  149. machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
  150. machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
  151. machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
  152. machineconfig/scripts/python/helpers_utils/download.py +152 -0
  153. machineconfig/scripts/python/helpers_utils/path.py +108 -0
  154. machineconfig/scripts/python/interactive.py +64 -84
  155. machineconfig/scripts/python/machineconfig.py +63 -0
  156. machineconfig/scripts/python/msearch.py +21 -0
  157. machineconfig/scripts/python/nw/__init__.py +0 -0
  158. machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
  159. machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
  160. machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
  161. machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
  162. machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
  163. machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
  164. machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
  165. machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
  166. machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
  167. machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
  168. machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
  169. machineconfig/scripts/python/sessions.py +64 -44
  170. machineconfig/scripts/python/terminal.py +127 -0
  171. machineconfig/scripts/python/utils.py +66 -0
  172. machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
  173. machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
  174. machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
  175. machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
  176. machineconfig/settings/broot/br.sh +0 -4
  177. machineconfig/settings/broot/conf.toml +1 -1
  178. machineconfig/settings/helix/config.toml +16 -0
  179. machineconfig/settings/helix/languages.toml +13 -4
  180. machineconfig/settings/helix/yazi-picker.sh +12 -0
  181. machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
  182. machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
  183. machineconfig/settings/lf/linux/lfrc +10 -12
  184. machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
  185. machineconfig/settings/lf/windows/lfrc +18 -38
  186. machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
  187. machineconfig/settings/linters/.ruff.toml +1 -1
  188. machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
  189. machineconfig/settings/marimo/marimo.toml +80 -0
  190. machineconfig/settings/marimo/snippets/globalize.py +34 -0
  191. machineconfig/settings/pistol/pistol.conf +1 -1
  192. machineconfig/settings/shells/bash/init.sh +55 -31
  193. machineconfig/settings/shells/nushell/config.nu +1 -34
  194. machineconfig/settings/shells/nushell/init.nu +127 -0
  195. machineconfig/settings/shells/pwsh/init.ps1 +60 -43
  196. machineconfig/settings/shells/starship/starship.toml +16 -0
  197. machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
  198. machineconfig/settings/shells/wt/settings.json +32 -17
  199. machineconfig/settings/shells/zsh/init.sh +89 -0
  200. machineconfig/settings/svim/linux/init.toml +0 -4
  201. machineconfig/settings/svim/windows/init.toml +0 -3
  202. machineconfig/settings/yazi/init.lua +57 -0
  203. machineconfig/settings/yazi/keymap_linux.toml +79 -0
  204. machineconfig/settings/yazi/keymap_windows.toml +78 -0
  205. machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
  206. machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
  207. machineconfig/settings/yazi/yazi.toml +13 -0
  208. machineconfig/setup_linux/__init__.py +10 -0
  209. machineconfig/setup_linux/apps_desktop.sh +89 -0
  210. machineconfig/setup_linux/apps_gui.sh +64 -0
  211. machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
  212. machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
  213. machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
  214. machineconfig/setup_linux/uv.sh +15 -0
  215. machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
  216. machineconfig/setup_mac/__init__.py +16 -0
  217. machineconfig/setup_mac/apps_gui.sh +248 -0
  218. machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
  219. machineconfig/setup_mac/uv.sh +36 -0
  220. machineconfig/setup_windows/__init__.py +8 -0
  221. machineconfig/setup_windows/others/power_options.ps1 +7 -0
  222. machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
  223. machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
  224. machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
  225. machineconfig/setup_windows/uv.ps1 +10 -0
  226. machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
  227. machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
  228. machineconfig/utils/accessories.py +7 -5
  229. machineconfig/utils/cloud/onedrive/README.md +139 -0
  230. machineconfig/utils/code.py +133 -106
  231. machineconfig/utils/files/art/fat_croco.txt +10 -0
  232. machineconfig/utils/files/art/halfwit_croco.txt +9 -0
  233. machineconfig/utils/files/art/happy_croco.txt +22 -0
  234. machineconfig/utils/files/art/water_croco.txt +11 -0
  235. machineconfig/utils/files/ascii_art.py +1 -1
  236. machineconfig/utils/files/dbms.py +257 -0
  237. machineconfig/utils/files/headers.py +11 -14
  238. machineconfig/utils/files/ouch/__init__.py +0 -0
  239. machineconfig/utils/files/ouch/decompress.py +45 -0
  240. machineconfig/utils/files/read.py +10 -18
  241. machineconfig/utils/installer_utils/installer_class.py +68 -126
  242. machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
  243. machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
  244. machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
  245. machineconfig/utils/io.py +77 -23
  246. machineconfig/utils/links.py +254 -162
  247. machineconfig/utils/meta.py +255 -0
  248. machineconfig/utils/notifications.py +1 -1
  249. machineconfig/utils/options.py +13 -3
  250. machineconfig/utils/path_extended.py +46 -100
  251. machineconfig/utils/path_helper.py +75 -22
  252. machineconfig/utils/procs.py +50 -70
  253. machineconfig/utils/scheduler.py +94 -97
  254. machineconfig/utils/scheduling.py +0 -3
  255. machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
  256. machineconfig/utils/schemas/layouts/layout_types.py +1 -1
  257. machineconfig/utils/source_of_truth.py +3 -6
  258. machineconfig/utils/ssh.py +742 -264
  259. machineconfig/utils/ssh_utils/utils.py +0 -0
  260. machineconfig/utils/terminal.py +2 -113
  261. machineconfig/utils/tst.py +20 -0
  262. machineconfig/utils/upgrade_packages.py +109 -28
  263. machineconfig/utils/ve.py +11 -4
  264. machineconfig-7.66.dist-info/METADATA +124 -0
  265. machineconfig-7.66.dist-info/RECORD +451 -0
  266. machineconfig-7.66.dist-info/entry_points.txt +15 -0
  267. machineconfig/cluster/sessions_managers/ffile.py +0 -4
  268. machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
  269. machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
  270. machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
  271. machineconfig/jobs/python/python_ve_symlink.py +0 -37
  272. machineconfig/jobs/python/vscode/api.py +0 -57
  273. machineconfig/jobs/python/vscode/sync_code.py +0 -73
  274. machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
  275. machineconfig/jobs/windows/start_terminal.ps1 +0 -6
  276. machineconfig/jobs/windows/startup_file.cmd +0 -2
  277. machineconfig/profile/create.py +0 -303
  278. machineconfig/profile/shell.py +0 -176
  279. machineconfig/scripts/cloud/init.sh +0 -119
  280. machineconfig/scripts/linux/agents +0 -2
  281. machineconfig/scripts/linux/choose_wezterm_theme +0 -3
  282. machineconfig/scripts/linux/cloud_copy +0 -2
  283. machineconfig/scripts/linux/cloud_mount +0 -2
  284. machineconfig/scripts/linux/cloud_repo_sync +0 -2
  285. machineconfig/scripts/linux/cloud_sync +0 -2
  286. machineconfig/scripts/linux/croshell +0 -3
  287. machineconfig/scripts/linux/devops +0 -2
  288. machineconfig/scripts/linux/fire +0 -2
  289. machineconfig/scripts/linux/ftpx +0 -2
  290. machineconfig/scripts/linux/fzf2g +0 -21
  291. machineconfig/scripts/linux/fzffg +0 -25
  292. machineconfig/scripts/linux/gh_models +0 -2
  293. machineconfig/scripts/linux/initai +0 -2
  294. machineconfig/scripts/linux/kill_process +0 -2
  295. machineconfig/scripts/linux/scheduler +0 -2
  296. machineconfig/scripts/linux/sessions +0 -2
  297. machineconfig/scripts/linux/share_smb +0 -1
  298. machineconfig/scripts/linux/start_slidev +0 -2
  299. machineconfig/scripts/linux/start_terminals +0 -3
  300. machineconfig/scripts/linux/warp-cli.sh +0 -122
  301. machineconfig/scripts/linux/wifi_conn +0 -2
  302. machineconfig/scripts/linux/z_ls +0 -104
  303. machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
  304. machineconfig/scripts/python/cloud_repo_sync.py +0 -190
  305. machineconfig/scripts/python/count_lines_frontend.py +0 -16
  306. machineconfig/scripts/python/dotfile.py +0 -78
  307. machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
  308. machineconfig/scripts/python/get_zellij_cmd.py +0 -15
  309. machineconfig/scripts/python/gh_models.py +0 -104
  310. machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
  311. machineconfig/scripts/python/repos.py +0 -132
  312. machineconfig/scripts/python/repos_helper_action.py +0 -378
  313. machineconfig/scripts/python/snapshot.py +0 -25
  314. machineconfig/scripts/python/start_terminals.py +0 -121
  315. machineconfig/scripts/python/t4.py +0 -17
  316. machineconfig/scripts/windows/agents.ps1 +0 -1
  317. machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
  318. machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
  319. machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
  320. machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
  321. machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
  322. machineconfig/scripts/windows/croshell.ps1 +0 -1
  323. machineconfig/scripts/windows/devops.ps1 +0 -1
  324. machineconfig/scripts/windows/dotfile.ps1 +0 -1
  325. machineconfig/scripts/windows/fire.ps1 +0 -1
  326. machineconfig/scripts/windows/ftpx.ps1 +0 -1
  327. machineconfig/scripts/windows/gpt.ps1 +0 -1
  328. machineconfig/scripts/windows/grep.ps1 +0 -2
  329. machineconfig/scripts/windows/initai.ps1 +0 -1
  330. machineconfig/scripts/windows/kill_process.ps1 +0 -1
  331. machineconfig/scripts/windows/nano.ps1 +0 -3
  332. machineconfig/scripts/windows/pomodoro.ps1 +0 -1
  333. machineconfig/scripts/windows/reload_path.ps1 +0 -3
  334. machineconfig/scripts/windows/scheduler.ps1 +0 -1
  335. machineconfig/scripts/windows/sessions.ps1 +0 -1
  336. machineconfig/scripts/windows/snapshot.ps1 +0 -1
  337. machineconfig/scripts/windows/start_slidev.ps1 +0 -1
  338. machineconfig/scripts/windows/start_terminals.ps1 +0 -1
  339. machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
  340. machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
  341. machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
  342. machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
  343. machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
  344. machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
  345. machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
  346. machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
  347. machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
  348. machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
  349. machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
  350. machineconfig/utils/ai/generate_file_checklist.py +0 -68
  351. machineconfig-5.15.dist-info/METADATA +0 -188
  352. machineconfig-5.15.dist-info/RECORD +0 -415
  353. machineconfig-5.15.dist-info/entry_points.txt +0 -18
  354. machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
  355. machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
  356. machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
  357. machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
  358. machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
  359. machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
  360. machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
  361. machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
  362. machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
  363. machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
  364. /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
  365. /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
  366. /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
  367. /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
  368. /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
  369. /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
  370. /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
  371. /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
  372. /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
  373. /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
  374. /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
  375. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
  376. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
  377. /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
  378. /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
  379. /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
  380. /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
  381. /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
  382. /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
  383. /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
  384. /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
  385. /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
  386. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
  387. /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
  388. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
  389. {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,81 @@
1
+ # Requires: fzf, oh-my-posh
2
+ # Purpose: Interactive Oh My Posh theme chooser with live preview
3
+
4
+ # Path to your Oh My Posh themes directory
5
+ $themesDir = "$env:LOCALAPPDATA\Programs\oh-my-posh\themes"
6
+
7
+ if (-not (Test-Path $themesDir)) {
8
+ Write-Host "Themes directory not found at $themesDir" -ForegroundColor Red
9
+ exit 1
10
+ }
11
+
12
+ # Get all theme files and extract just the theme names for display
13
+ $themes = Get-ChildItem $themesDir -Filter "*.omp.json" | ForEach-Object {
14
+ [PSCustomObject]@{
15
+ Name = $_.BaseName
16
+ Path = $_.FullName
17
+ }
18
+ }
19
+
20
+ # Create a simple preview command that shows theme name and a sample prompt
21
+ $previewCommand = "pwsh -NoProfile -Command `"Write-Host 'Theme: ' -NoNewline -ForegroundColor Cyan; Write-Host (Split-Path '{}' -Leaf); Write-Host ''; oh-my-posh print primary --config '{}' 2>`$null`""
22
+
23
+ # Run fzf with preview
24
+ $selectedThemeName = $themes | ForEach-Object { $_.Path } |
25
+ fzf --height 80% --border --ansi --reverse `
26
+ --header "Select an Oh My Posh theme (Ctrl+C to cancel)" `
27
+ --preview $previewCommand `
28
+ --preview-window=right:60%:wrap
29
+
30
+ # After fzf selection
31
+ if ($selectedThemeName) {
32
+ Write-Host "`nYou selected:" -ForegroundColor Green
33
+ Write-Host (Split-Path $selectedThemeName -Leaf) -ForegroundColor Yellow
34
+ Write-Host "`nApplying theme..." -ForegroundColor Cyan
35
+
36
+ # Apply the theme to current session
37
+ oh-my-posh init pwsh --config $selectedThemeName | Invoke-Expression
38
+
39
+ Write-Host "`nTheme applied to current session!" -ForegroundColor Green
40
+
41
+ # Safely update the PowerShell profile
42
+ $profilePath = $PROFILE
43
+ $ompLine = "oh-my-posh init pwsh --config '$selectedThemeName' | Invoke-Expression"
44
+
45
+ # Create profile directory if it doesn't exist
46
+ $profileDir = Split-Path $profilePath -Parent
47
+ if (-not (Test-Path $profileDir)) {
48
+ New-Item -ItemType Directory -Path $profileDir -Force | Out-Null
49
+ }
50
+
51
+ # Read existing profile content or create empty array
52
+ if (Test-Path $profilePath) {
53
+ $profileContent = Get-Content $profilePath -Raw
54
+ } else {
55
+ $profileContent = ""
56
+ }
57
+
58
+ # Check if oh-my-posh line already exists and replace it
59
+ if ($profileContent -match "oh-my-posh init pwsh[^\r\n]*") {
60
+ # Replace existing oh-my-posh line
61
+ $profileContent = $profileContent -replace "oh-my-posh init pwsh[^\r\n]*", $ompLine
62
+ } else {
63
+ # Add the oh-my-posh line with proper newlines
64
+ if ($profileContent.Length -gt 0 -and -not $profileContent.EndsWith("`n")) {
65
+ $profileContent += "`n"
66
+ }
67
+ if ($profileContent.Length -gt 0) {
68
+ $profileContent += "`n"
69
+ }
70
+ $profileContent += $ompLine
71
+ $profileContent += "`n"
72
+ }
73
+
74
+ # Write back to profile
75
+ $profileContent | Set-Content $profilePath -Encoding UTF8 -NoNewline
76
+
77
+ Write-Host "Profile updated successfully!" -ForegroundColor Green
78
+ Write-Host "The theme will be applied automatically in future PowerShell sessions." -ForegroundColor Cyan
79
+ } else {
80
+ Write-Host "`nNo theme selected." -ForegroundColor DarkGray
81
+ }
@@ -52,14 +52,14 @@ def main2():
52
52
 
53
53
  def set_theme(theme: str):
54
54
  print(f"🔄 Setting WezTerm theme to: {theme}")
55
- txt_lines = PathExtended("~/.config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
55
+ txt_lines = PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
56
56
  res_lines = []
57
57
  for line in txt_lines:
58
58
  if "config.color_scheme = " in line:
59
59
  res_lines.append(f"config.color_scheme = '{theme}'")
60
60
  else:
61
61
  res_lines.append(line)
62
- PathExtended("~/.config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
62
+ PathExtended.home().joinpath(".config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
63
63
  time.sleep(0.1)
64
64
  print("💾 Configuration saved")
65
65
 
@@ -1,24 +1,7 @@
1
-
2
1
  from typing import Optional
3
2
  import os
4
- from machineconfig.utils.path_extended import PathExtended
5
-
6
-
7
- def search_for_files_of_interest(path_obj: PathExtended):
8
- if path_obj.joinpath(".venv").exists():
9
- path_objects = path_obj.search("*", not_in=[".venv"])
10
- files: list[PathExtended] = []
11
- for a_path_obj in path_objects:
12
- files += search_for_files_of_interest(path_obj=a_path_obj)
13
- return files
14
- if path_obj.is_file():
15
- return [path_obj]
16
- py_files = path_obj.search(pattern="*.py", not_in=["__init__.py"], r=True)
17
- ps_files = path_obj.search(pattern="*.ps1", r=True)
18
- sh_files = path_obj.search(pattern="*.sh", r=True)
19
- files = py_files + ps_files + sh_files
20
- return files
21
-
3
+ from pathlib import Path
4
+ import platform
22
5
 
23
6
 
24
7
  def parse_pyfile(file_path: str):
@@ -29,7 +12,7 @@ def parse_pyfile(file_path: str):
29
12
  func_args: list[list[args_spec]] = [[]] # this firt prepopulated dict is for the option 'RUN AS MAIN' which has no args
30
13
  import ast
31
14
 
32
- parsed_ast = ast.parse(PathExtended(file_path).read_text(encoding="utf-8"))
15
+ parsed_ast = ast.parse(Path(file_path).read_text(encoding="utf-8"))
33
16
  functions = [node for node in ast.walk(parsed_ast) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]
34
17
  module__doc__ = ast.get_docstring(parsed_ast)
35
18
  main_option = f"RUN AS MAIN -- {module__doc__ if module__doc__ is not None else 'NoDocs'}"
@@ -110,3 +93,56 @@ def get_import_module_code(module_path: str):
110
93
  module_name = "IncorrectModuleName"
111
94
  # TODO: use py_compile to check if the statement is valid code to avoid syntax errors that can't be caught.
112
95
  return f"from {module_name} import *"
96
+
97
+
98
+ def wrap_import_in_try_except(import_line: str, pyfile: str, repo_root: Optional[str] = None) -> None:
99
+ try:
100
+ exec(import_line) # type: ignore
101
+ except (ImportError, ModuleNotFoundError) as ex:
102
+ print(fr"❌ Failed to import `{pyfile}` as a module: {ex} ")
103
+ print("⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
104
+ import sys
105
+ sys.path.append(str(Path(pyfile).parent))
106
+ if repo_root is not None:
107
+ sys.path.append(repo_root)
108
+ exec(f"from {Path(pyfile).stem} import *")
109
+ print(fr"✅ Successfully imported `{pyfile}`")
110
+
111
+
112
+ def add_to_path(path_variable: str, directory: str) -> str:
113
+ """
114
+ Generate shell script to add directory to path_variable.
115
+ Handles both Windows (cmd) and Unix-like systems (bash/zsh).
116
+ Checks if variable exists before appending, otherwise creates it.
117
+ """
118
+ system = platform.system()
119
+
120
+ if system == "Windows":
121
+ script = f"""# Check if {path_variable} is defined
122
+ if (Test-Path env:{path_variable}) {{
123
+ Write-Host "Adding {directory} to existing {path_variable}"
124
+ $currentValue = [Environment]::GetEnvironmentVariable("{path_variable}", "User")
125
+ $newValue = "$currentValue;{directory}"
126
+ [Environment]::SetEnvironmentVariable("{path_variable}", $newValue, "User")
127
+ $env:{path_variable} = $newValue
128
+ }} else {{
129
+ Write-Host "Creating new {path_variable} variable"
130
+ [Environment]::SetEnvironmentVariable("{path_variable}", "{directory}", "User")
131
+ $env:{path_variable} = "{directory}"
132
+ }}
133
+ Write-Host "{path_variable} is now: $env:{path_variable}\""""
134
+ return script
135
+ else:
136
+ script = f"""#!/bin/bash
137
+ # Check if {path_variable} is defined and not empty
138
+ if [ -z "${{{path_variable}}}" ]; then
139
+ echo "Creating new {path_variable} variable"
140
+ export {path_variable}="{directory}"
141
+ else
142
+ echo "Adding {directory} to existing {path_variable}"
143
+ export {path_variable}="${{{path_variable}}}:{directory}"
144
+ fi
145
+ echo "{path_variable} is now: ${{{path_variable}}}"
146
+ """
147
+ return script
148
+
@@ -15,6 +15,7 @@ class FireJobArgs:
15
15
  choose_function: bool = False
16
16
  loop: bool = False
17
17
  jupyter: bool = False
18
+ marimo: bool = False
18
19
  submit_to_cloud: bool = False
19
20
  remote: bool = False
20
21
  module: bool = False
@@ -24,7 +25,6 @@ class FireJobArgs:
24
25
  PathExport: bool = False
25
26
  git_pull: bool = False
26
27
  optimized: bool = False
27
- Nprocess: int = 1
28
28
  zellij_tab: Optional[str] = None
29
29
  watch: bool = False
30
30
 
@@ -96,6 +96,10 @@ def _convert_value_type(value: str) -> object:
96
96
  elif value.lower() in ('false', '0', 'no', 'off'):
97
97
  return False
98
98
 
99
+ # Try to convert None
100
+ if value.lower() == 'none':
101
+ return None
102
+
99
103
  # Try to parse as list (comma-separated values)
100
104
  if ',' in value:
101
105
  items = [_convert_value_type(item.strip()) for item in value.split(',')]
@@ -5,7 +5,52 @@ from typing import Optional
5
5
  import tomllib
6
6
  from pathlib import Path
7
7
  from machineconfig.utils.accessories import randstr
8
- from machineconfig.utils.path_extended import PathExtended
8
+ from machineconfig.utils.options import choose_from_options
9
+
10
+
11
+ def choose_function_or_lines(choice_file: Path, kwargs_dict: dict[str, object]) -> tuple[Optional[str], Path, dict[str, object]]:
12
+ """
13
+ Choose a function to run from a Python file or lines from a shell script.
14
+
15
+ Returns:
16
+ tuple: (choice_function, choice_file, kwargs_dict)
17
+ - choice_function: The selected function name or None
18
+ - choice_file: The file path (potentially modified for shell scripts)
19
+ - kwargs_dict: Updated kwargs dictionary with user-provided arguments
20
+ """
21
+ choice_function: Optional[str] = None
22
+
23
+ if choice_file.suffix == ".py":
24
+ from machineconfig.scripts.python.helpers_fire_command.file_wrangler import parse_pyfile
25
+ options, func_args = parse_pyfile(file_path=str(choice_file))
26
+ choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options, fzf=True, multi=False)
27
+ assert isinstance(choice_function_tmp, str), f"choice_function must be a string. Got {type(choice_function_tmp)}"
28
+ choice_index = options.index(choice_function_tmp)
29
+ choice_function = choice_function_tmp.split(" -- ")[0]
30
+ choice_function_args = func_args[choice_index]
31
+
32
+ if choice_function == "RUN AS MAIN":
33
+ choice_function = None
34
+ if len(choice_function_args) > 0 and len(kwargs_dict) == 0:
35
+ for item in choice_function_args:
36
+ kwargs_dict[item.name] = input(f"Please enter a value for argument `{item.name}` (type = {item.type}) (default = {item.default}) : ") or item.default
37
+ elif choice_file.suffix == ".sh":
38
+ options = []
39
+ for line in choice_file.read_text(encoding="utf-8").splitlines():
40
+ if line.startswith("#"):
41
+ continue
42
+ if line == "":
43
+ continue
44
+ if line.startswith("echo"):
45
+ continue
46
+ options.append(line)
47
+ chosen_lines = choose_from_options(msg="Choose a line to run", options=options, fzf=True, multi=True)
48
+ choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/shell/{randstr(10)}.sh")
49
+ choice_file.parent.mkdir(parents=True, exist_ok=True)
50
+ choice_file.write_text("\n".join(chosen_lines), encoding="utf-8")
51
+ choice_function = None
52
+
53
+ return choice_function, choice_file, kwargs_dict
9
54
 
10
55
 
11
56
  def get_command_streamlit(choice_file: Path, environment: str, repo_root: Optional[Path]) -> str:
@@ -36,7 +81,7 @@ def get_command_streamlit(choice_file: Path, environment: str, repo_root: Option
36
81
  port = config["server"]["port"]
37
82
  secrets_path = toml_path.with_name("secrets.toml")
38
83
  if repo_root is not None:
39
- secrets_template_path = Path.home().joinpath(f"dotfiles/creds/streamlit/{PathExtended(repo_root).name}/{choice_file.name}/secrets.toml")
84
+ secrets_template_path = Path.home().joinpath(f"dotfiles/creds/streamlit/{Path(repo_root).name}/{choice_file.name}/secrets.toml")
40
85
  if environment != "" and not secrets_path.exists() and secrets_template_path.exists():
41
86
  secrets_template = tomllib.loads(secrets_template_path.read_text(encoding="utf-8"))
42
87
  if environment == "ip":
@@ -0,0 +1,5 @@
1
+
2
+ from pathlib import Path
3
+
4
+ FZFG_LINUX_PATH = Path(__file__).parent.joinpath("scripts_linux", "fzfg")
5
+ FZFG_WINDOWS_PATH = Path(__file__).parent.joinpath("scripts_windows", "fzfg.ps1")
@@ -13,5 +13,5 @@ IFS=: read -ra selected < <(
13
13
  --preview 'batcat --color=always {1} --highlight-line {2}' \
14
14
  --preview-window 'up,60%,border-bottom,+{2}+3/3,~3'
15
15
  )
16
- [ -n "${selected[0]}" ] && lvim "${selected[0]}" "+${selected[1]}"
16
+ [ -n "${selected[0]}" ] && hx "${selected[0]}" "+${selected[1]}"
17
17
 
@@ -19,5 +19,5 @@ IFS=: read -ra selected < <(
19
19
  --preview 'bat --color=always {1} --highlight-line {2}' \
20
20
  --preview-window 'up,60%,border-bottom,+{2}+3/3,~3'
21
21
  )
22
- [ -n "${selected[0]}" ] && lvim "${selected[0]}" "+${selected[1]}
22
+ [ -n "${selected[0]}" ] && hx "${selected[0]}:${selected[1]}:${selected[2]}"
23
23
  "
@@ -13,7 +13,7 @@ rga-fzf() {
13
13
  --preview-window="70%:wrap"
14
14
  )" &&
15
15
  echo "opening $file" &&
16
- xdg-open "$file"
16
+ hx "$file"
17
17
  }
18
18
 
19
19
 
@@ -0,0 +1,20 @@
1
+ """
2
+ Helper modules for the devops navigator TUI application.
3
+ """
4
+
5
+ from machineconfig.scripts.python.helpers_navigator.data_models import CommandInfo, ArgumentInfo
6
+ from machineconfig.scripts.python.helpers_navigator.command_builder import CommandBuilderScreen
7
+ from machineconfig.scripts.python.helpers_navigator.command_tree import CommandTree
8
+ from machineconfig.scripts.python.helpers_navigator.command_detail import CommandDetail
9
+ from machineconfig.scripts.python.helpers_navigator.search_bar import SearchBar
10
+ from machineconfig.scripts.python.helpers_navigator.main_app import CommandNavigatorApp
11
+
12
+ __all__ = [
13
+ "CommandInfo",
14
+ "ArgumentInfo",
15
+ "CommandBuilderScreen",
16
+ "CommandTree",
17
+ "CommandDetail",
18
+ "SearchBar",
19
+ "CommandNavigatorApp",
20
+ ]
@@ -0,0 +1,111 @@
1
+ """
2
+ Command builder screen for building commands with arguments.
3
+ """
4
+
5
+ import re
6
+ from textual.app import ComposeResult
7
+ from textual.containers import Horizontal, VerticalScroll
8
+ from textual.widgets import Static, Input, Label, Button
9
+ from textual.screen import ModalScreen
10
+ from machineconfig.scripts.python.helpers_navigator.data_models import CommandInfo, ArgumentInfo
11
+
12
+
13
+ class CommandBuilderScreen(ModalScreen[str]):
14
+ """Modal screen for building command with arguments."""
15
+
16
+ def __init__(self, command_info: CommandInfo) -> None:
17
+ super().__init__()
18
+ self.command_info = command_info
19
+ self.arguments = self._parse_arguments()
20
+ self.input_widgets: dict[str, Input] = {}
21
+
22
+ def _parse_arguments(self) -> list[ArgumentInfo]:
23
+ """Parse arguments from help_text."""
24
+ args: list[ArgumentInfo] = []
25
+ seen_names: set[str] = set()
26
+
27
+ if not self.command_info.help_text:
28
+ return args
29
+
30
+ help_text = self.command_info.help_text
31
+
32
+ optional_pattern = re.compile(r'--(\w+(?:-\w+)*)\s+<([^>]+)>')
33
+ for match in optional_pattern.finditer(help_text):
34
+ arg_name = match.group(1)
35
+ placeholder = match.group(2)
36
+ if arg_name not in seen_names:
37
+ args.append(ArgumentInfo(name=arg_name, is_required=False, is_flag=False, placeholder=placeholder))
38
+ seen_names.add(arg_name)
39
+
40
+ flag_pattern = re.compile(r'--(\w+(?:-\w+)*)(?:\s|$)')
41
+ for match in flag_pattern.finditer(help_text):
42
+ arg_name = match.group(1)
43
+ if arg_name not in seen_names:
44
+ args.append(ArgumentInfo(name=arg_name, is_required=False, is_flag=True))
45
+ seen_names.add(arg_name)
46
+
47
+ positional_pattern = re.compile(r'<(\w+)>(?!\s*>)')
48
+ for match in positional_pattern.finditer(help_text):
49
+ arg_name = match.group(1)
50
+ if arg_name not in seen_names and not re.search(rf'--\w+\s+<{arg_name}>', help_text):
51
+ args.append(ArgumentInfo(name=arg_name, is_required=True, is_flag=False, placeholder=arg_name))
52
+ seen_names.add(arg_name)
53
+
54
+ return args
55
+
56
+ def compose(self) -> ComposeResult:
57
+ """Compose the modal screen."""
58
+ with VerticalScroll():
59
+ yield Static(f"[bold cyan]Build Command: {self.command_info.command}[/bold cyan]\n", classes="title")
60
+
61
+ if not self.arguments:
62
+ yield Static("[yellow]No arguments needed for this command[/yellow]\n")
63
+ else:
64
+ for arg in self.arguments:
65
+ if arg.is_flag:
66
+ label_text = f"--{arg.name} (flag, leave empty to skip)"
67
+ yield Label(label_text)
68
+ input_widget = Input(placeholder="yes/no or leave empty", id=f"arg_{arg.name}")
69
+ else:
70
+ required_marker = "[red]*[/red]" if arg.is_required else "[dim](optional)[/dim]"
71
+ label_text = f"--{arg.name} {required_marker}"
72
+ yield Label(label_text)
73
+ input_widget = Input(placeholder=arg.placeholder or arg.name, id=f"arg_{arg.name}")
74
+
75
+ self.input_widgets[arg.name] = input_widget
76
+ yield input_widget
77
+
78
+ with Horizontal(classes="buttons"):
79
+ yield Button("Execute", variant="primary", id="execute")
80
+ yield Button("Copy", variant="success", id="copy")
81
+ yield Button("Cancel", variant="error", id="cancel")
82
+
83
+ def on_button_pressed(self, event: Button.Pressed) -> None:
84
+ """Handle button presses."""
85
+ if event.button.id == "cancel":
86
+ self.dismiss("")
87
+ return
88
+
89
+ built_command = self._build_command()
90
+
91
+ if event.button.id == "execute":
92
+ self.dismiss(f"EXECUTE:{built_command}")
93
+ elif event.button.id == "copy":
94
+ self.dismiss(f"COPY:{built_command}")
95
+
96
+ def _build_command(self) -> str:
97
+ """Build the complete command with arguments."""
98
+ parts = [self.command_info.command]
99
+
100
+ for arg in self.arguments:
101
+ input_widget = self.input_widgets.get(arg.name)
102
+ if input_widget:
103
+ value = input_widget.value.strip()
104
+ if value:
105
+ if arg.is_flag:
106
+ if value.lower() in ('yes', 'y', 'true', '1'):
107
+ parts.append(f"--{arg.name}")
108
+ else:
109
+ parts.append(f"--{arg.name} {value}")
110
+
111
+ return " ".join(parts)
@@ -0,0 +1,44 @@
1
+ """
2
+ Command detail widget for displaying command information.
3
+ """
4
+
5
+ from typing import Optional
6
+ from textual.widgets import Static
7
+ from rich.panel import Panel
8
+ from rich.text import Text
9
+ from machineconfig.scripts.python.helpers_navigator.data_models import CommandInfo
10
+
11
+
12
+ class CommandDetail(Static):
13
+ """Widget for displaying command details."""
14
+
15
+ def __init__(self, *, id: str) -> None: # type: ignore
16
+ super().__init__(id=id)
17
+ self.command_info: Optional[CommandInfo] = None
18
+
19
+ def update_command(self, command_info: Optional[CommandInfo]) -> None:
20
+ """Update displayed command information."""
21
+ self.command_info = command_info
22
+ if command_info is None:
23
+ self.update("Select a command to view details")
24
+ return
25
+
26
+ content = Text()
27
+ content.append(f"{'🗂️ Group' if command_info.is_group else '⚡ Command'}: ", style="bold cyan")
28
+ content.append(f"{command_info.name}\n\n", style="bold yellow")
29
+
30
+ content.append("Description: ", style="bold green")
31
+ content.append(f"{command_info.description}\n\n", style="white")
32
+
33
+ content.append("Command: ", style="bold blue")
34
+ content.append(f"{command_info.command}\n\n", style="bold white")
35
+
36
+ if command_info.help_text:
37
+ content.append("Usage: ", style="bold magenta")
38
+ content.append(f"{command_info.help_text}\n\n", style="white")
39
+
40
+ if command_info.module_path:
41
+ content.append("Module: ", style="bold red")
42
+ content.append(f"{command_info.module_path}\n", style="white")
43
+
44
+ self.update(Panel(content, title=f"[bold]{command_info.name}[/bold]", border_style="blue"))