machineconfig 5.15__py3-none-any.whl → 7.98__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- 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 +70 -210
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
- 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 +25 -170
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
- 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/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +5 -9
- 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/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
- machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/custom_dev/winget.py +10 -14
- machineconfig/jobs/installer/installer_data.json +1487 -229
- 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 +10 -6
- 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 +106 -177
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +62 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +147 -0
- machineconfig/profile/mapper.toml +263 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +123 -117
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
- 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/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +28 -5
- machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +137 -113
- machineconfig/scripts/python/devops.py +61 -101
- machineconfig/scripts/python/devops_navigator.py +6 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -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/fire_jobs.py +110 -150
- machineconfig/scripts/python/ftpx.py +51 -24
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/run_py_script.py +79 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -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} +29 -35
- 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} +8 -9
- machineconfig/scripts/python/helpers_devops/cli_config.py +105 -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 +214 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
- 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 +499 -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} +3 -3
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/helpers_fire_command/f.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/helpers_fire_command/fire_jobs_route_helper.py +121 -0
- 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}/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- 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 +620 -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_network/__init__.py +0 -0
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
- machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
- 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/{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/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- 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 +65 -0
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/mcfg_entry.py +58 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +119 -45
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +64 -0
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -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 +63 -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/lfcd.ps1 +1 -1
- 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 +82 -31
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -35
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +61 -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/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -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/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/setup_linux/__init__.py +11 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- 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_linux/web_shortcuts/live_from_github.sh +31 -0
- 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 +11 -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 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +155 -105
- 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/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +64 -181
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +256 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +48 -101
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +88 -124
- 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 +263 -274
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +3 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- machineconfig-7.98.dist-info/RECORD +504 -0
- machineconfig-7.98.dist-info/entry_points.txt +13 -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/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- 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/skrg +0 -4
- 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/generate_files.py +0 -83
- 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/devops_add_ssh_key.py +0 -120
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
- 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/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- 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/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/nix/cli_installation.sh +0 -157
- 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/utils/installer_utils/installer.py +0 -189
- 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/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/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.ps1 → 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/scripts/python/{fire_jobs_streamlit_helper.py → 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/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/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_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/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.98.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py}
RENAMED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Update repositories with fancy output"""
|
|
2
2
|
|
|
3
|
+
from concurrent.futures import ThreadPoolExecutor, as_completed
|
|
3
4
|
from pathlib import Path
|
|
4
5
|
|
|
5
6
|
import git
|
|
@@ -8,7 +9,7 @@ from rich.panel import Panel
|
|
|
8
9
|
from rich.table import Table
|
|
9
10
|
from rich.text import Text
|
|
10
11
|
|
|
11
|
-
from machineconfig.scripts.python.
|
|
12
|
+
from machineconfig.scripts.python.helpers_repos.update import RepositoryUpdateResult, run_uv_sync, update_repository
|
|
12
13
|
from machineconfig.utils.io import read_ini
|
|
13
14
|
from machineconfig.utils.source_of_truth import DEFAULTS_PATH
|
|
14
15
|
|
|
@@ -16,6 +17,55 @@ from machineconfig.utils.source_of_truth import DEFAULTS_PATH
|
|
|
16
17
|
console = Console()
|
|
17
18
|
|
|
18
19
|
|
|
20
|
+
def _process_single_repo(expanded_path: Path, allow_password_prompt: bool) -> tuple[RepositoryUpdateResult, Path | None]:
|
|
21
|
+
"""Process a single repository and return the result."""
|
|
22
|
+
try:
|
|
23
|
+
repo = git.Repo(str(expanded_path), search_parent_directories=True)
|
|
24
|
+
# Update repository and get detailed results
|
|
25
|
+
result = update_repository(repo, allow_password_prompt=allow_password_prompt, auto_uv_sync=True)
|
|
26
|
+
|
|
27
|
+
# Keep track of repos with dependency changes for additional uv sync
|
|
28
|
+
repo_path = None
|
|
29
|
+
if result["dependencies_changed"] and not result["uv_sync_ran"]:
|
|
30
|
+
repo_path = Path(repo.working_dir)
|
|
31
|
+
|
|
32
|
+
return result, repo_path
|
|
33
|
+
|
|
34
|
+
except Exception as ex:
|
|
35
|
+
# Create a result for failed repos
|
|
36
|
+
error_result: RepositoryUpdateResult = {
|
|
37
|
+
"repo_path": str(expanded_path),
|
|
38
|
+
"status": "error",
|
|
39
|
+
"had_uncommitted_changes": False,
|
|
40
|
+
"uncommitted_files": [],
|
|
41
|
+
"commit_before": "",
|
|
42
|
+
"commit_after": "",
|
|
43
|
+
"commits_changed": False,
|
|
44
|
+
"pyproject_changed": False,
|
|
45
|
+
"dependencies_changed": False,
|
|
46
|
+
"uv_sync_ran": False,
|
|
47
|
+
"uv_sync_success": False,
|
|
48
|
+
"remotes_processed": [],
|
|
49
|
+
"remotes_skipped": [],
|
|
50
|
+
"error_message": str(ex),
|
|
51
|
+
"is_machineconfig_repo": False,
|
|
52
|
+
"permissions_updated": False,
|
|
53
|
+
}
|
|
54
|
+
console.print(
|
|
55
|
+
Panel(
|
|
56
|
+
"\n".join(
|
|
57
|
+
[
|
|
58
|
+
f"❌ Repository error: {expanded_path}",
|
|
59
|
+
f"Exception: {ex}",
|
|
60
|
+
]
|
|
61
|
+
),
|
|
62
|
+
border_style="red",
|
|
63
|
+
padding=(1, 2),
|
|
64
|
+
)
|
|
65
|
+
)
|
|
66
|
+
return error_result, None
|
|
67
|
+
|
|
68
|
+
|
|
19
69
|
def _display_summary(results: list[RepositoryUpdateResult]) -> None:
|
|
20
70
|
"""Display a comprehensive summary of all repository update operations."""
|
|
21
71
|
|
|
@@ -148,7 +198,7 @@ def _display_summary(results: list[RepositoryUpdateResult]) -> None:
|
|
|
148
198
|
def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
|
|
149
199
|
"""Main function to update all configured repositories."""
|
|
150
200
|
_ = verbose
|
|
151
|
-
repos: list[Path] = [
|
|
201
|
+
repos: list[Path] = []
|
|
152
202
|
try:
|
|
153
203
|
tmp = read_ini(DEFAULTS_PATH)["general"]["repos"].split(",")
|
|
154
204
|
if tmp[-1] == "":
|
|
@@ -188,60 +238,29 @@ def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
|
|
|
188
238
|
padding=(1, 2),
|
|
189
239
|
)
|
|
190
240
|
)
|
|
241
|
+
update_repos(repos, allow_password_prompt)
|
|
191
242
|
|
|
192
|
-
|
|
243
|
+
|
|
244
|
+
def update_repos(repos: list[Path], allow_password_prompt: bool) -> None:
|
|
245
|
+
# Process repositories in parallel
|
|
193
246
|
results: list[RepositoryUpdateResult] = []
|
|
194
247
|
repos_with_changes = []
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
248
|
+
with ThreadPoolExecutor(max_workers=min(len(repos), 8)) as executor:
|
|
249
|
+
# Submit all tasks
|
|
250
|
+
future_to_repo = {
|
|
251
|
+
executor.submit(_process_single_repo, expanded_path, allow_password_prompt): expanded_path
|
|
252
|
+
for expanded_path in repos
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
# Collect results as they complete
|
|
256
|
+
for future in as_completed(future_to_repo):
|
|
257
|
+
result, repo_path = future.result()
|
|
201
258
|
results.append(result)
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
if result["dependencies_changed"] and not result["uv_sync_ran"]:
|
|
205
|
-
repos_with_changes.append(Path(repo.working_dir))
|
|
206
|
-
|
|
207
|
-
except Exception as ex:
|
|
208
|
-
# Create a result for failed repos
|
|
209
|
-
error_result: RepositoryUpdateResult = {
|
|
210
|
-
"repo_path": str(expanded_path),
|
|
211
|
-
"status": "error",
|
|
212
|
-
"had_uncommitted_changes": False,
|
|
213
|
-
"uncommitted_files": [],
|
|
214
|
-
"commit_before": "",
|
|
215
|
-
"commit_after": "",
|
|
216
|
-
"commits_changed": False,
|
|
217
|
-
"pyproject_changed": False,
|
|
218
|
-
"dependencies_changed": False,
|
|
219
|
-
"uv_sync_ran": False,
|
|
220
|
-
"uv_sync_success": False,
|
|
221
|
-
"remotes_processed": [],
|
|
222
|
-
"remotes_skipped": [],
|
|
223
|
-
"error_message": str(ex),
|
|
224
|
-
"is_machineconfig_repo": False,
|
|
225
|
-
"permissions_updated": False,
|
|
226
|
-
}
|
|
227
|
-
results.append(error_result)
|
|
228
|
-
console.print(
|
|
229
|
-
Panel(
|
|
230
|
-
"\n".join(
|
|
231
|
-
[
|
|
232
|
-
f"❌ Repository error: {expanded_path}",
|
|
233
|
-
f"Exception: {ex}",
|
|
234
|
-
]
|
|
235
|
-
),
|
|
236
|
-
border_style="red",
|
|
237
|
-
padding=(1, 2),
|
|
238
|
-
)
|
|
239
|
-
)
|
|
240
|
-
|
|
259
|
+
if repo_path is not None:
|
|
260
|
+
repos_with_changes.append(repo_path)
|
|
241
261
|
# Run uv sync for repositories where pyproject.toml changed but sync wasn't run yet
|
|
242
262
|
for repo_path in repos_with_changes:
|
|
243
263
|
run_uv_sync(repo_path)
|
|
244
|
-
|
|
245
264
|
# Generate and display summary
|
|
246
265
|
_display_summary(results)
|
|
247
266
|
|
|
@@ -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
|
+
}
|
|
@@ -45,21 +45,21 @@ schemes_list = [
|
|
|
45
45
|
|
|
46
46
|
def main2():
|
|
47
47
|
console.print(Panel("🎨 WezTerm Theme Selector", title_align="left", border_style="green"))
|
|
48
|
-
option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm",
|
|
48
|
+
option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm", tv=True, msg="Use arrow keys to navigate, Enter to select a theme")
|
|
49
49
|
set_theme(option)
|
|
50
50
|
print(f"✅ Theme set to: {option}")
|
|
51
51
|
|
|
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
|
|
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(',')]
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import platform
|
|
4
|
+
from typing import Optional
|
|
5
|
+
import tomllib
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from machineconfig.utils.accessories import randstr
|
|
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, tv=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, tv=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
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def get_command_streamlit(choice_file: Path, environment: str, repo_root: Optional[Path]) -> str:
|
|
57
|
+
# from machineconfig.scripts.python.helpers_utils.path import get_machine_specs
|
|
58
|
+
from machineconfig.scripts.python.helpers_network.address import select_lan_ipv4
|
|
59
|
+
res = select_lan_ipv4(prefer_vpn=False)
|
|
60
|
+
if res is None:
|
|
61
|
+
raise RuntimeError("Could not determine local LAN IPv4 address for streamlit app.")
|
|
62
|
+
local_ip_v4 = res
|
|
63
|
+
|
|
64
|
+
computer_name = platform.node()
|
|
65
|
+
port = 8501
|
|
66
|
+
toml_path: Optional[Path] = None
|
|
67
|
+
toml_path_maybe = choice_file.parent.joinpath(".streamlit/config.toml")
|
|
68
|
+
if toml_path_maybe.exists():
|
|
69
|
+
toml_path = toml_path_maybe
|
|
70
|
+
elif choice_file.parent.name == "pages":
|
|
71
|
+
toml_path_maybe = choice_file.parent.parent.joinpath(".streamlit/config.toml")
|
|
72
|
+
if toml_path_maybe.exists():
|
|
73
|
+
toml_path = toml_path_maybe
|
|
74
|
+
if toml_path is not None:
|
|
75
|
+
print(f"📄 Reading config.toml @ {toml_path}")
|
|
76
|
+
config = tomllib.loads(toml_path.read_text(encoding="utf-8"))
|
|
77
|
+
if "server" in config:
|
|
78
|
+
if "port" in config["server"]:
|
|
79
|
+
port = config["server"]["port"]
|
|
80
|
+
secrets_path = toml_path.with_name("secrets.toml")
|
|
81
|
+
if repo_root is not None:
|
|
82
|
+
secrets_template_path = Path.home().joinpath(f"dotfiles/creds/streamlit/{Path(repo_root).name}/{choice_file.name}/secrets.toml")
|
|
83
|
+
if environment != "" and not secrets_path.exists() and secrets_template_path.exists():
|
|
84
|
+
secrets_template = tomllib.loads(secrets_template_path.read_text(encoding="utf-8"))
|
|
85
|
+
if environment == "ip":
|
|
86
|
+
host_url = f"http://{local_ip_v4}:{port}/oauth2callback"
|
|
87
|
+
elif environment == "localhost":
|
|
88
|
+
host_url = f"http://localhost:{port}/oauth2callback"
|
|
89
|
+
elif environment == "hostname":
|
|
90
|
+
host_url = f"http://{computer_name}:{port}/oauth2callback"
|
|
91
|
+
else:
|
|
92
|
+
host_url = f"http://{environment}:{port}/oauth2callback"
|
|
93
|
+
try:
|
|
94
|
+
secrets_template["auth"]["redirect_uri"] = host_url
|
|
95
|
+
secrets_template["auth"]["cookie_secret"] = randstr(35)
|
|
96
|
+
secrets_template["auth"]["auth0"]["redirect_uri"] = host_url
|
|
97
|
+
# save_toml(obj=secrets_template, path=secrets_path)
|
|
98
|
+
except Exception as ex:
|
|
99
|
+
print(ex)
|
|
100
|
+
raise ex
|
|
101
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
102
|
+
install_if_missing("qrterminal")
|
|
103
|
+
script = f"""
|
|
104
|
+
qrterminal "http://{local_ip_v4}:{port}"
|
|
105
|
+
echo "http://{local_ip_v4}:{port}"
|
|
106
|
+
qrterminal "http://{computer_name}:{port}"
|
|
107
|
+
echo "http://{computer_name}:{port}"
|
|
108
|
+
"""
|
|
109
|
+
# from machineconfig.utils.code import run_shell_script
|
|
110
|
+
# run_shell_script(script)
|
|
111
|
+
from machineconfig.utils.code import print_code
|
|
112
|
+
print_code(code=script, lexer="shell", desc="Streamlit QR Codes and URLs")
|
|
113
|
+
|
|
114
|
+
message = f"🚀 Streamlit app is running @:\n1- http://{local_ip_v4}:{port}\n2- http://{computer_name}:{port}\n3- http://localhost:{port}"
|
|
115
|
+
from rich.panel import Panel
|
|
116
|
+
from rich import print as rprint
|
|
117
|
+
|
|
118
|
+
rprint(Panel(message))
|
|
119
|
+
exe = f"streamlit run --server.address 0.0.0.0 --server.headless true --server.port {port}"
|
|
120
|
+
# exe = f"cd '{choice_file.parent}'; " + exe
|
|
121
|
+
return exe
|
|
File without changes
|
|
@@ -13,11 +13,11 @@ IFS=: read -ra selected < <(
|
|
|
13
13
|
--bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \
|
|
14
14
|
--bind "ctrl-f:unbind(change,ctrl-f)+change-prompt(2. fzf> )+enable-search+clear-query+rebind(ctrl-r)" \
|
|
15
15
|
--bind "ctrl-r:unbind(ctrl-r)+change-prompt(1. ripgrep> )+disable-search+reload($RG_PREFIX {q} || true)+rebind(change,ctrl-f)" \
|
|
16
|
-
--prompt '1.
|
|
16
|
+
--prompt '1. ripgrep> ' \
|
|
17
17
|
--delimiter : \
|
|
18
|
-
--header '╱ CTRL-R (
|
|
18
|
+
--header '╱ CTRL-R (ripgrep mode) ╱ CTRL-F (fzf mode) ╱' \
|
|
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,59 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
[CmdletBinding()]
|
|
3
|
+
param(
|
|
4
|
+
[Parameter(ValueFromRemainingArguments = $true)]
|
|
5
|
+
[string[]]$QueryTokens
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
if ($null -eq $QueryTokens) {
|
|
9
|
+
$QueryTokens = @()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
$initialQuery = if ($QueryTokens.Count -gt 0) { [string]::Join(' ', $QueryTokens) } else { '' }
|
|
13
|
+
$rgPrefix = 'rg --column --line-number --no-heading --color=always --smart-case '
|
|
14
|
+
|
|
15
|
+
$escapedDefault = if ($initialQuery.Length -gt 0) {
|
|
16
|
+
$rgPrefix + '"' + $initialQuery.Replace('"', '""') + '" || type nul'
|
|
17
|
+
} else {
|
|
18
|
+
'type nul'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
$previousDefault = $env:FZF_DEFAULT_COMMAND
|
|
22
|
+
$env:FZF_DEFAULT_COMMAND = $escapedDefault
|
|
23
|
+
|
|
24
|
+
$reloadBinding = "change:reload:$rgPrefix{q} || type nul"
|
|
25
|
+
$ctrlFBinding = 'ctrl-f:unbind(change,ctrl-f)+change-prompt(2. fzf> )+enable-search+clear-query+rebind(ctrl-r)'
|
|
26
|
+
$ctrlRBinding = "ctrl-r:unbind(ctrl-r)+change-prompt(1. ripgrep> )+disable-search+reload($rgPrefix{q} || type nul)+rebind(change,ctrl-f)"
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
$selectionRaw = & fzf --ansi `
|
|
30
|
+
--color 'hl:-1:underline,hl+:-1:underline:reverse' `
|
|
31
|
+
--disabled `
|
|
32
|
+
--query $initialQuery `
|
|
33
|
+
--bind $reloadBinding `
|
|
34
|
+
--bind $ctrlFBinding `
|
|
35
|
+
--bind $ctrlRBinding `
|
|
36
|
+
--prompt '1. ripgrep> ' `
|
|
37
|
+
--delimiter ':' `
|
|
38
|
+
--header 'CTRL-R (ripgrep mode) | CTRL-F (fzf mode)' `
|
|
39
|
+
--preview 'bat --color=always {1} --highlight-line {2}' `
|
|
40
|
+
--preview-window 'up,60%,border-bottom,+{2}+3/3,~3'
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if ($null -ne $previousDefault) {
|
|
44
|
+
$env:FZF_DEFAULT_COMMAND = $previousDefault
|
|
45
|
+
} else {
|
|
46
|
+
Remove-Item Env:FZF_DEFAULT_COMMAND -ErrorAction SilentlyContinue
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($selectionRaw)) {
|
|
51
|
+
exit
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if ($selectionRaw -match '^(?<path>.+?):(?<line>\d+):(?<column>\d+):') {
|
|
55
|
+
$path = $Matches['path']
|
|
56
|
+
$line = [int]$Matches['line']
|
|
57
|
+
$column = [int]$Matches['column']
|
|
58
|
+
& hx ("{0}:{1}:{2}" -f $path,$line,$column)
|
|
59
|
+
}
|
|
@@ -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
|
+
]
|