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.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +0 -1
- machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +114 -289
- machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -3
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/hx.py +76 -19
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +1 -7
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/installer_data.json +1101 -115
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +108 -180
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +92 -103
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +111 -114
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -103
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +115 -152
- machineconfig/scripts/python/ftpx.py +29 -24
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
- machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
- machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
- machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
- machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
- machineconfig/scripts/python/sessions.py +64 -44
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
- machineconfig/settings/broot/br.sh +0 -4
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_mac/__init__.py +16 -0
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
- machineconfig/setup_mac/uv.sh +36 -0
- machineconfig/setup_windows/__init__.py +8 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +133 -106
- machineconfig/utils/files/art/fat_croco.txt +10 -0
- machineconfig/utils/files/art/halfwit_croco.txt +9 -0
- machineconfig/utils/files/art/happy_croco.txt +22 -0
- machineconfig/utils/files/art/water_croco.txt +11 -0
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +11 -14
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +10 -18
- machineconfig/utils/installer_utils/installer_class.py +68 -126
- machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +13 -3
- machineconfig/utils/path_extended.py +46 -100
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -264
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +2 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +11 -4
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/sessions_managers/ffile.py +0 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
- machineconfig/jobs/python/python_ve_symlink.py +0 -37
- machineconfig/jobs/python/vscode/api.py +0 -57
- machineconfig/jobs/python/vscode/sync_code.py +0 -73
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -303
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/agents +0 -2
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/sessions +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -190
- machineconfig/scripts/python/count_lines_frontend.py +0 -16
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
- machineconfig/scripts/python/repos.py +0 -132
- machineconfig/scripts/python/repos_helper_action.py +0 -378
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/agents.ps1 +0 -1
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/sessions.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig-5.15.dist-info/METADATA +0 -188
- machineconfig-5.15.dist-info/RECORD +0 -415
- machineconfig-5.15.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
- {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("
|
|
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("
|
|
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
|
|
|
File without changes
|
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
|
|
2
1
|
from typing import Optional
|
|
3
2
|
import os
|
|
4
|
-
from
|
|
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(
|
|
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.
|
|
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/{
|
|
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":
|
|
File without changes
|
|
@@ -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]}" ] &&
|
|
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]}" ] &&
|
|
22
|
+
[ -n "${selected[0]}" ] && hx "${selected[0]}:${selected[1]}:${selected[2]}"
|
|
23
23
|
"
|
|
@@ -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"))
|