machineconfig 3.7__py3-none-any.whl → 7.69__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 +1 -2
- machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
- machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +128 -330
- machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
- 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 -172
- 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 +7 -21
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/gh.py +128 -0
- machineconfig/jobs/{python_custom_installers → installer/custom}/hx.py +84 -18
- machineconfig/jobs/installer/custom_dev/alacritty.py +86 -0
- machineconfig/jobs/installer/custom_dev/brave.py +82 -0
- machineconfig/jobs/installer/custom_dev/bypass_paywall.py +59 -0
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +63 -0
- machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/cursor.py +7 -7
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/espanso.py +117 -0
- machineconfig/jobs/installer/custom_dev/goes.py +68 -0
- machineconfig/jobs/installer/custom_dev/lvim.py +89 -0
- machineconfig/jobs/installer/custom_dev/nerdfont.py +111 -0
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +149 -0
- machineconfig/jobs/installer/custom_dev/redis.py +88 -0
- machineconfig/jobs/installer/custom_dev/sysabc.py +145 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +92 -0
- machineconfig/jobs/{python_custom_installers/dev → installer/custom_dev}/winget.py +2 -3
- machineconfig/jobs/installer/installer_data.json +3440 -0
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/brave.sh +4 -14
- machineconfig/jobs/{python_custom_installers/scripts/linux/warp-cli.sh → installer/linux_scripts/cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/docker.sh +6 -18
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +37 -0
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
- machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/redis.sh +6 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/vscode.sh +5 -17
- machineconfig/jobs/{python_custom_installers/scripts/linux → installer/linux_scripts}/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +255 -0
- 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/__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 +198 -0
- 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/{mcinit.py → initai.py} +3 -38
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +114 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +88 -22
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +1 -1
- 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 +129 -198
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +45 -131
- machineconfig/scripts/python/devops_navigator.py +6 -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/fire_jobs.py +166 -235
- machineconfig/scripts/python/ftpx.py +164 -100
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- 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/helpers_agents/fire_agents_help_launch.py +110 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -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} +52 -39
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +13 -18
- machineconfig/scripts/python/helpers_cloud/cloud_sync.py +81 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -1
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +32 -20
- 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/helpers_devops/cli_terminal.py +156 -0
- 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/helpers_devops/devops_update_repos.py +269 -0
- 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/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -2
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -89
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -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 +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_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} +6 -7
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
- 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/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 +187 -0
- machineconfig/scripts/python/mcfg_entry.py +63 -0
- machineconfig/scripts/python/msearch.py +40 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
- 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 -51
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +67 -0
- machineconfig/scripts/python/sessions.py +167 -0
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -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 +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/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 +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -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/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 +14 -1
- 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 +28 -203
- 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 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -189
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
- machineconfig/utils/accessories.py +52 -12
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +140 -93
- 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 +118 -0
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +68 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +95 -0
- machineconfig/utils/installer_utils/github_release_bulk.py +188 -0
- machineconfig/utils/installer_utils/install_from_url.py +180 -0
- machineconfig/utils/installer_utils/installer_class.py +239 -316
- machineconfig/utils/installer_utils/installer_cli.py +186 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +90 -5
- machineconfig/utils/installer_utils/installer_runner.py +191 -0
- machineconfig/utils/io.py +77 -24
- machineconfig/utils/links.py +309 -100
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +19 -47
- machineconfig/utils/path_extended.py +111 -121
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -74
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
- machineconfig/utils/schemas/installer/installer_types.py +28 -6
- machineconfig/utils/schemas/layouts/layout_types.py +34 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -254
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +3 -140
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +13 -5
- machineconfig-7.69.dist-info/METADATA +124 -0
- machineconfig-7.69.dist-info/RECORD +454 -0
- machineconfig-7.69.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/templates/cli_click.py +0 -102
- machineconfig/cluster/templates/cli_gooey.py +0 -115
- machineconfig/cluster/templates/utils.py +0 -51
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -32
- machineconfig/jobs/python/create_bootable_media.py +0 -16
- machineconfig/jobs/python/python_cargo_build_share.py +0 -59
- machineconfig/jobs/python/python_ve_symlink.py +0 -29
- machineconfig/jobs/python/tasks.py +0 -3
- machineconfig/jobs/python/vscode/api.py +0 -48
- machineconfig/jobs/python/vscode/link_ve.py +0 -63
- machineconfig/jobs/python/vscode/select_interpreter.py +0 -87
- machineconfig/jobs/python/vscode/sync_code.py +0 -58
- machineconfig/jobs/python_custom_installers/archive/ngrok.py +0 -63
- machineconfig/jobs/python_custom_installers/dev/aider.py +0 -37
- machineconfig/jobs/python_custom_installers/dev/alacritty.py +0 -65
- machineconfig/jobs/python_custom_installers/dev/brave.py +0 -71
- machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +0 -50
- machineconfig/jobs/python_custom_installers/dev/code.py +0 -51
- machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -78
- machineconfig/jobs/python_custom_installers/dev/espanso.py +0 -90
- machineconfig/jobs/python_custom_installers/dev/goes.py +0 -55
- machineconfig/jobs/python_custom_installers/dev/lvim.py +0 -77
- machineconfig/jobs/python_custom_installers/dev/nerdfont.py +0 -68
- machineconfig/jobs/python_custom_installers/dev/redis.py +0 -65
- machineconfig/jobs/python_custom_installers/dev/reverse_proxy.md +0 -31
- machineconfig/jobs/python_custom_installers/dev/wezterm.py +0 -70
- machineconfig/jobs/python_custom_installers/docker.py +0 -74
- machineconfig/jobs/python_custom_installers/gh.py +0 -97
- machineconfig/jobs/python_custom_installers/scripts/linux/docker_start.sh +0 -45
- machineconfig/jobs/python_custom_installers/scripts/linux/pgsql.sh +0 -49
- machineconfig/jobs/python_custom_installers/scripts/linux/timescaledb.sh +0 -85
- machineconfig/jobs/python_custom_installers/warp-cli.py +0 -71
- machineconfig/jobs/python_generic_installers/config.json +0 -603
- machineconfig/jobs/python_generic_installers/config.json.bak +0 -414
- machineconfig/jobs/python_generic_installers/dev/config.archive.json +0 -18
- machineconfig/jobs/python_generic_installers/dev/config.json +0 -825
- machineconfig/jobs/python_generic_installers/dev/config.json.bak +0 -565
- machineconfig/jobs/python_linux_installers/archive/config.json +0 -18
- machineconfig/jobs/python_linux_installers/archive/config.json.bak +0 -10
- machineconfig/jobs/python_linux_installers/config.json +0 -145
- machineconfig/jobs/python_linux_installers/config.json.bak +0 -110
- machineconfig/jobs/python_linux_installers/dev/config.json +0 -276
- machineconfig/jobs/python_linux_installers/dev/config.json.bak +0 -206
- machineconfig/jobs/python_windows_installers/archive/file.json +0 -11
- machineconfig/jobs/python_windows_installers/config.json +0 -82
- machineconfig/jobs/python_windows_installers/config.json.bak +0 -56
- machineconfig/jobs/python_windows_installers/dev/config.json +0 -4
- machineconfig/jobs/python_windows_installers/dev/config.json.bak +0 -3
- 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 -169
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- 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/fire_agents +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/kill_process +0 -2
- machineconfig/scripts/linux/mcinit +0 -2
- machineconfig/scripts/linux/programs +0 -21
- machineconfig/scripts/linux/repos +0 -2
- machineconfig/scripts/linux/scheduler +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/archive/im2text.py +0 -34
- machineconfig/scripts/python/archive/tmate_conn.py +0 -41
- machineconfig/scripts/python/archive/tmate_start.py +0 -44
- machineconfig/scripts/python/cloud_repo_sync.py +0 -192
- machineconfig/scripts/python/cloud_sync.py +0 -85
- machineconfig/scripts/python/devops_devapps_install.py +0 -202
- machineconfig/scripts/python/devops_update_repos.py +0 -180
- machineconfig/scripts/python/dotfile.py +0 -52
- machineconfig/scripts/python/fire_agents.py +0 -176
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
- machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
- machineconfig/scripts/python/fire_jobs_args_helper.py +0 -84
- machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -66
- 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 -114
- machineconfig/scripts/python/repos.py +0 -160
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/wsl_windows_transfer.py +0 -72
- 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/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/mcinit.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/repos.ps1 +0 -1
- machineconfig/scripts/windows/scheduler.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/ascii_art.sh +0 -93
- 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/setup_windows/wt_and_pwsh/install_nerd_fonts.py +0 -100
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig/utils/installer.py +0 -255
- machineconfig-3.7.dist-info/METADATA +0 -165
- machineconfig-3.7.dist-info/RECORD +0 -432
- machineconfig-3.7.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
- machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
- machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
- machineconfig/jobs/{python → installer}/__init__.py +0 -0
- machineconfig/jobs/{python_custom_installers → installer/custom_dev}/__init__.py +0 -0
- machineconfig/{setup_windows/wt_and_pwsh → jobs/installer/powershell_scripts}/install_fonts.ps1 +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_generic_installers → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/python_linux_installers → 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/{jobs/python_linux_installers/dev → 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/python_windows_installers → scripts/python/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.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/{jobs/python_windows_installers/archive → scripts/python/helpers_devops}/__init__.py +0 -0
- /machineconfig/{jobs/python_windows_installers/dev → scripts/python/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{helpers → helpers_fire_command}/__init__.py +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_fire_command/fire_jobs_streamlit_helper.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/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_sessions/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/nw/__init__.py} +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/{settings/yazi/keymap.toml → utils/files/ouch/__init__.py} +0 -0
- {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/WHEEL +0 -0
- {machineconfig-3.7.dist-info → machineconfig-7.69.dist-info}/top_level.txt +0 -0
|
@@ -2,169 +2,79 @@
|
|
|
2
2
|
"""
|
|
3
3
|
Windows Terminal local layout generator and session manager.
|
|
4
4
|
Equivalent to zellij_local.py but for Windows Terminal.
|
|
5
|
+
|
|
6
|
+
https://github.com/ruby9455/app_management/tree/main/app_management
|
|
7
|
+
|
|
5
8
|
"""
|
|
6
9
|
|
|
7
|
-
import shlex
|
|
8
10
|
import subprocess
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import json
|
|
12
|
-
from typing import Dict, List, Optional, Any
|
|
11
|
+
import platform
|
|
12
|
+
from typing import Optional, Any
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
import logging
|
|
15
15
|
|
|
16
|
-
from
|
|
16
|
+
from rich.console import Console
|
|
17
|
+
from rich.panel import Panel
|
|
18
|
+
from rich.table import Table
|
|
19
|
+
|
|
20
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
21
|
+
from machineconfig.cluster.sessions_managers.wt_utils.wt_helpers import (
|
|
22
|
+
generate_random_suffix,
|
|
23
|
+
# escape_for_wt,
|
|
24
|
+
validate_layout_config,
|
|
25
|
+
generate_wt_command_string,
|
|
26
|
+
check_wt_session_status,
|
|
27
|
+
check_command_status,
|
|
28
|
+
)
|
|
17
29
|
|
|
18
30
|
logging.basicConfig(level=logging.INFO)
|
|
19
31
|
logger = logging.getLogger(__name__)
|
|
20
|
-
|
|
32
|
+
console = Console()
|
|
21
33
|
|
|
34
|
+
# Check if we're on Windows
|
|
35
|
+
IS_WINDOWS = platform.system().lower() == "windows"
|
|
36
|
+
POWERSHELL_CMD = "powershell" if IS_WINDOWS else "pwsh" # Use pwsh on non-Windows systems
|
|
37
|
+
TMP_LAYOUT_DIR = Path.home() / "tmp_results" / "wt_layouts"
|
|
22
38
|
|
|
23
|
-
class WTLayoutGenerator:
|
|
24
|
-
def __init__(self):
|
|
25
|
-
self.session_name: Optional[str] = None
|
|
26
|
-
self.layout_config: Optional[LayoutConfig] = None # Store the complete layout config
|
|
27
|
-
self.script_path: Optional[str] = None # Store the full path to the PowerShell script
|
|
28
|
-
|
|
29
|
-
@staticmethod
|
|
30
|
-
def _generate_random_suffix(length: int) -> str:
|
|
31
|
-
"""Generate a random string suffix for unique PowerShell script names."""
|
|
32
|
-
return "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
|
|
33
|
-
|
|
34
|
-
@staticmethod
|
|
35
|
-
def _parse_command(command: str) -> tuple[str, List[str]]:
|
|
36
|
-
try:
|
|
37
|
-
parts = shlex.split(command)
|
|
38
|
-
if not parts:
|
|
39
|
-
raise ValueError("Empty command provided")
|
|
40
|
-
return parts[0], parts[1:] if len(parts) > 1 else []
|
|
41
|
-
except ValueError as e:
|
|
42
|
-
logger.error(f"Error parsing command '{command}': {e}")
|
|
43
|
-
parts = command.split()
|
|
44
|
-
return parts[0] if parts else "", parts[1:] if len(parts) > 1 else []
|
|
45
|
-
|
|
46
|
-
@staticmethod
|
|
47
|
-
def _escape_for_wt(text: str) -> str:
|
|
48
|
-
"""Escape text for use in Windows Terminal commands."""
|
|
49
|
-
# Windows Terminal uses PowerShell-style escaping
|
|
50
|
-
text = text.replace('"', '""') # Escape quotes for PowerShell
|
|
51
|
-
if " " in text or ";" in text or "&" in text or "|" in text:
|
|
52
|
-
return f'"{text}"'
|
|
53
|
-
return text
|
|
54
|
-
|
|
55
|
-
@staticmethod
|
|
56
|
-
def _create_tab_command(tab_config: TabConfig, is_first_tab: bool) -> str:
|
|
57
|
-
"""Create a Windows Terminal tab command string from tab config."""
|
|
58
|
-
tab_name = tab_config["tabName"]
|
|
59
|
-
cwd = tab_config["startDir"]
|
|
60
|
-
command = tab_config["command"]
|
|
61
|
-
|
|
62
|
-
# Convert paths to Windows format if needed
|
|
63
|
-
if cwd.startswith("~/"):
|
|
64
|
-
cwd = cwd.replace("~/", f"{Path.home()}/")
|
|
65
|
-
elif cwd == "~":
|
|
66
|
-
cwd = str(Path.home())
|
|
67
|
-
|
|
68
|
-
# Build the wt command parts
|
|
69
|
-
tab_parts = []
|
|
70
|
-
|
|
71
|
-
if not is_first_tab:
|
|
72
|
-
tab_parts.append("new-tab")
|
|
73
|
-
|
|
74
|
-
# Add starting directory
|
|
75
|
-
tab_parts.extend(["-d", WTLayoutGenerator._escape_for_wt(cwd)])
|
|
76
|
-
|
|
77
|
-
# Add tab title
|
|
78
|
-
tab_parts.extend(["--title", WTLayoutGenerator._escape_for_wt(tab_name)])
|
|
79
|
-
|
|
80
|
-
# Add the command to execute
|
|
81
|
-
tab_parts.append(WTLayoutGenerator._escape_for_wt(command))
|
|
82
|
-
|
|
83
|
-
return " ".join(tab_parts)
|
|
84
|
-
|
|
85
|
-
@staticmethod
|
|
86
|
-
def _validate_layout_config(layout_config: LayoutConfig) -> None:
|
|
87
|
-
"""Validate layout configuration format and content."""
|
|
88
|
-
if not layout_config["layoutTabs"]:
|
|
89
|
-
raise ValueError("Layout must contain at least one tab")
|
|
90
|
-
for tab in layout_config["layoutTabs"]:
|
|
91
|
-
if not tab["tabName"].strip():
|
|
92
|
-
raise ValueError(f"Invalid tab name: {tab['tabName']}")
|
|
93
|
-
if not tab["command"].strip():
|
|
94
|
-
raise ValueError(f"Invalid command for tab '{tab['tabName']}': {tab['command']}")
|
|
95
|
-
if not tab["startDir"].strip():
|
|
96
|
-
raise ValueError(f"Invalid startDir for tab '{tab['tabName']}': {tab['startDir']}")
|
|
97
|
-
|
|
98
|
-
def create_wt_layout(self, layout_config: LayoutConfig, output_dir: Optional[str]) -> str:
|
|
99
|
-
WTLayoutGenerator._validate_layout_config(layout_config)
|
|
100
|
-
logger.info(f"Creating Windows Terminal layout '{layout_config['layoutName']}' with {len(layout_config['layoutTabs'])} tabs")
|
|
101
|
-
|
|
102
|
-
# Store session name and layout config for status checking
|
|
103
|
-
self.session_name = layout_config["layoutName"]
|
|
104
|
-
self.layout_config = layout_config.copy()
|
|
105
|
-
|
|
106
|
-
# Generate Windows Terminal command
|
|
107
|
-
wt_command = self._generate_wt_command_string(layout_config, self.session_name)
|
|
108
|
-
|
|
109
|
-
try:
|
|
110
|
-
random_suffix = WTLayoutGenerator._generate_random_suffix(8)
|
|
111
|
-
if output_dir:
|
|
112
|
-
output_path = Path(output_dir)
|
|
113
|
-
output_path.mkdir(parents=True, exist_ok=True)
|
|
114
|
-
script_file = output_path / f"wt_layout_{random_suffix}.ps1"
|
|
115
|
-
else:
|
|
116
|
-
# Use the predefined TMP_LAYOUT_DIR for temporary files
|
|
117
|
-
TMP_LAYOUT_DIR.mkdir(parents=True, exist_ok=True)
|
|
118
|
-
script_file = TMP_LAYOUT_DIR / f"wt_layout_{self.session_name}_{random_suffix}.ps1"
|
|
119
39
|
|
|
120
|
-
|
|
121
|
-
|
|
40
|
+
class WTLayoutGenerator:
|
|
41
|
+
def __init__(self, layout_config: LayoutConfig, session_name: str):
|
|
42
|
+
self.session_name: str = session_name
|
|
43
|
+
self.layout_config: LayoutConfig = layout_config.copy()
|
|
44
|
+
self.script_path: Optional[str] = None
|
|
45
|
+
|
|
46
|
+
def create_layout_file(self) -> bool:
|
|
47
|
+
"""Create Windows Terminal layout file and return success status."""
|
|
48
|
+
validate_layout_config(self.layout_config)
|
|
49
|
+
tab_count = len(self.layout_config['layoutTabs'])
|
|
50
|
+
layout_name = self.layout_config['layoutName']
|
|
51
|
+
console.print(f"[bold cyan]📋 Creating Windows Terminal layout[/bold cyan] [bright_green]'{layout_name}' with {tab_count} tabs[/bright_green]")
|
|
52
|
+
|
|
53
|
+
for tab in self.layout_config['layoutTabs']:
|
|
54
|
+
console.print(f" [yellow]→[/yellow] [bold]{tab['tabName']}[/bold] [dim]in[/dim] [blue]{tab['startDir']}[/blue]")
|
|
55
|
+
|
|
56
|
+
wt_command = generate_wt_command_string(self.layout_config, self.session_name)
|
|
57
|
+
|
|
58
|
+
random_suffix = generate_random_suffix(8)
|
|
59
|
+
script_content = f"""# Windows Terminal layout for {self.session_name}
|
|
122
60
|
# Generated with random suffix: {random_suffix}
|
|
123
61
|
{wt_command}
|
|
124
62
|
"""
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
except OSError as e:
|
|
131
|
-
logger.error(f"Failed to create PowerShell script: {e}")
|
|
132
|
-
raise
|
|
133
|
-
|
|
134
|
-
def _generate_wt_command_string(self, layout_config: LayoutConfig, window_name: str) -> str:
|
|
135
|
-
"""Generate complete Windows Terminal command string."""
|
|
136
|
-
# Start building the wt command
|
|
137
|
-
wt_parts = ["wt"]
|
|
138
|
-
|
|
139
|
-
# Add window name
|
|
140
|
-
wt_parts.extend(["-w", WTLayoutGenerator._escape_for_wt(window_name)])
|
|
141
|
-
|
|
142
|
-
# Add tabs
|
|
143
|
-
tab_commands = []
|
|
144
|
-
for i, tab in enumerate(layout_config["layoutTabs"]):
|
|
145
|
-
is_first = i == 0
|
|
146
|
-
tab_cmd = self._create_tab_command(tab, is_first)
|
|
147
|
-
tab_commands.append(tab_cmd)
|
|
148
|
-
|
|
149
|
-
# Join all parts with semicolons (Windows Terminal command separator)
|
|
150
|
-
if tab_commands:
|
|
151
|
-
if len(tab_commands) == 1:
|
|
152
|
-
# Single tab - just add to the main command
|
|
153
|
-
wt_parts.extend(tab_commands[0].split())
|
|
154
|
-
else:
|
|
155
|
-
# Multiple tabs - join with semicolons
|
|
156
|
-
wt_parts.append(tab_commands[0]) # First tab
|
|
157
|
-
for tab_cmd in tab_commands[1:]:
|
|
158
|
-
wt_parts.extend([";", tab_cmd])
|
|
63
|
+
tmp_dir = Path(TMP_LAYOUT_DIR)
|
|
64
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
65
|
+
script_file = tmp_dir / f"wt_layout_{self.session_name}_{random_suffix}.ps1"
|
|
66
|
+
script_file.write_text(script_content, encoding="utf-8")
|
|
67
|
+
self.script_path = str(script_file.absolute())
|
|
159
68
|
|
|
160
|
-
|
|
69
|
+
console.print(f"[bold green]✅ Layout created successfully:[/bold green] [cyan]{self.script_path}[/cyan]")
|
|
70
|
+
return True
|
|
161
71
|
|
|
162
72
|
def get_wt_layout_preview(self, layout_config: LayoutConfig) -> str:
|
|
163
73
|
"""Generate preview of the Windows Terminal command that would be created."""
|
|
164
|
-
|
|
165
|
-
return
|
|
74
|
+
validate_layout_config(layout_config)
|
|
75
|
+
return generate_wt_command_string(layout_config, "preview")
|
|
166
76
|
|
|
167
|
-
def check_all_commands_status(self) ->
|
|
77
|
+
def check_all_commands_status(self) -> dict[str, dict[str, Any]]:
|
|
168
78
|
if not self.layout_config:
|
|
169
79
|
logger.warning("No layout config tracked. Make sure to create a layout first.")
|
|
170
80
|
return {}
|
|
@@ -172,142 +82,13 @@ class WTLayoutGenerator:
|
|
|
172
82
|
status_report = {}
|
|
173
83
|
for tab in self.layout_config["layoutTabs"]:
|
|
174
84
|
tab_name = tab["tabName"]
|
|
175
|
-
status_report[tab_name] =
|
|
85
|
+
status_report[tab_name] = check_command_status(tab_name, self.layout_config)
|
|
176
86
|
|
|
177
87
|
return status_report
|
|
178
88
|
|
|
179
|
-
|
|
180
|
-
def check_wt_session_status(session_name: str) -> Dict[str, Any]:
|
|
181
|
-
try:
|
|
182
|
-
# Check for Windows Terminal processes
|
|
183
|
-
wt_check_cmd = ["powershell", "-Command", "Get-Process -Name 'WindowsTerminal' -ErrorAction SilentlyContinue | Select-Object Id, ProcessName, StartTime, MainWindowTitle | ConvertTo-Json -Depth 2"]
|
|
184
|
-
|
|
185
|
-
result = subprocess.run(wt_check_cmd, capture_output=True, text=True, timeout=10)
|
|
186
|
-
|
|
187
|
-
if result.returncode == 0:
|
|
188
|
-
output = result.stdout.strip()
|
|
189
|
-
if output and output != "":
|
|
190
|
-
try:
|
|
191
|
-
import json
|
|
192
|
-
|
|
193
|
-
processes = json.loads(output)
|
|
194
|
-
if not isinstance(processes, list):
|
|
195
|
-
processes = [processes]
|
|
196
|
-
|
|
197
|
-
# Look for windows that might belong to our session
|
|
198
|
-
session_windows = []
|
|
199
|
-
for proc in processes:
|
|
200
|
-
window_title = proc.get("MainWindowTitle", "")
|
|
201
|
-
if session_name in window_title or not window_title:
|
|
202
|
-
session_windows.append(proc)
|
|
203
|
-
|
|
204
|
-
return {"wt_running": True, "session_exists": len(session_windows) > 0, "session_name": session_name, "all_windows": processes, "session_windows": session_windows}
|
|
205
|
-
except Exception as e:
|
|
206
|
-
return {"wt_running": True, "session_exists": False, "error": f"Failed to parse process info: {e}", "session_name": session_name}
|
|
207
|
-
else:
|
|
208
|
-
return {"wt_running": False, "session_exists": False, "session_name": session_name, "all_windows": []}
|
|
209
|
-
else:
|
|
210
|
-
return {"wt_running": False, "error": result.stderr, "session_name": session_name}
|
|
211
|
-
|
|
212
|
-
except subprocess.TimeoutExpired:
|
|
213
|
-
return {"wt_running": False, "error": "Timeout while checking Windows Terminal processes", "session_name": session_name}
|
|
214
|
-
except FileNotFoundError:
|
|
215
|
-
return {"wt_running": False, "error": "PowerShell not found in PATH", "session_name": session_name}
|
|
216
|
-
except Exception as e:
|
|
217
|
-
return {"wt_running": False, "error": str(e), "session_name": session_name}
|
|
218
|
-
|
|
219
|
-
@staticmethod
|
|
220
|
-
def check_command_status(tab_name: str, layout_config: LayoutConfig) -> Dict[str, Any]:
|
|
221
|
-
"""Check if a command is running by looking for processes."""
|
|
222
|
-
# Find the tab with the given name
|
|
223
|
-
tab_config = None
|
|
224
|
-
for tab in layout_config["layoutTabs"]:
|
|
225
|
-
if tab["tabName"] == tab_name:
|
|
226
|
-
tab_config = tab
|
|
227
|
-
break
|
|
228
|
-
|
|
229
|
-
if tab_config is None:
|
|
230
|
-
return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "pid": None, "command": None}
|
|
231
|
-
|
|
232
|
-
command = tab_config["command"]
|
|
233
|
-
|
|
234
|
-
try:
|
|
235
|
-
# Create PowerShell script to check for processes
|
|
236
|
-
cmd_parts = [part for part in command.split() if len(part) > 2]
|
|
237
|
-
primary_cmd = cmd_parts[0] if cmd_parts else ""
|
|
238
|
-
|
|
239
|
-
ps_script = f"""
|
|
240
|
-
$targetCommand = '{command.replace("'", "''")}'
|
|
241
|
-
$cmdParts = @({", ".join([f"'{part}'" for part in cmd_parts])})
|
|
242
|
-
$primaryCmd = '{primary_cmd}'
|
|
243
|
-
$currentPid = $PID
|
|
244
|
-
$matchingProcesses = @()
|
|
245
|
-
|
|
246
|
-
Get-Process | ForEach-Object {{
|
|
247
|
-
try {{
|
|
248
|
-
if ($_.Id -eq $currentPid) {{ return }}
|
|
249
|
-
|
|
250
|
-
$cmdline = ""
|
|
251
|
-
try {{
|
|
252
|
-
$cmdline = (Get-WmiObject Win32_Process -Filter "ProcessId = $($_.Id)").CommandLine
|
|
253
|
-
}} catch {{
|
|
254
|
-
$cmdline = $_.ProcessName
|
|
255
|
-
}}
|
|
256
|
-
|
|
257
|
-
if ($cmdline -and $cmdline -ne "") {{
|
|
258
|
-
if ($cmdline -like "*PowerShell*" -and $cmdline -like "*Get-Process*") {{ return }}
|
|
259
|
-
|
|
260
|
-
$matchesPrimary = $cmdline -like "*$primaryCmd*" -and $primaryCmd -ne "powershell"
|
|
261
|
-
$matchCount = 0
|
|
262
|
-
foreach ($part in $cmdParts[1..($cmdParts.Length-1)]) {{
|
|
263
|
-
if ($cmdline -like "*$part*") {{ $matchCount++ }}
|
|
264
|
-
}}
|
|
265
|
-
|
|
266
|
-
if ($matchesPrimary -and $matchCount -ge 1) {{
|
|
267
|
-
$procInfo = @{{
|
|
268
|
-
"pid" = $_.Id
|
|
269
|
-
"name" = $_.ProcessName
|
|
270
|
-
"cmdline" = $cmdline
|
|
271
|
-
"status" = $_.Status
|
|
272
|
-
"start_time" = $_.StartTime
|
|
273
|
-
}} | ConvertTo-Json -Compress
|
|
274
|
-
Write-Output $procInfo
|
|
275
|
-
}}
|
|
276
|
-
}}
|
|
277
|
-
}} catch {{
|
|
278
|
-
# Ignore processes we can't access
|
|
279
|
-
}}
|
|
280
|
-
}}
|
|
281
|
-
"""
|
|
282
|
-
|
|
283
|
-
result = subprocess.run(["powershell", "-Command", ps_script], capture_output=True, text=True, timeout=15)
|
|
284
|
-
|
|
285
|
-
if result.returncode == 0:
|
|
286
|
-
output_lines = [line.strip() for line in result.stdout.strip().split("\n") if line.strip()]
|
|
287
|
-
matching_processes = []
|
|
288
|
-
|
|
289
|
-
for line in output_lines:
|
|
290
|
-
if line.startswith("{") and line.endswith("}"):
|
|
291
|
-
try:
|
|
292
|
-
proc_info = json.loads(line)
|
|
293
|
-
matching_processes.append(proc_info)
|
|
294
|
-
except json.JSONDecodeError:
|
|
295
|
-
continue
|
|
296
|
-
|
|
297
|
-
if matching_processes:
|
|
298
|
-
return {"status": "running", "running": True, "processes": matching_processes, "command": command, "tab_name": tab_name}
|
|
299
|
-
else:
|
|
300
|
-
return {"status": "not_running", "running": False, "processes": [], "command": command, "tab_name": tab_name}
|
|
301
|
-
else:
|
|
302
|
-
return {"status": "error", "error": f"Command failed: {result.stderr}", "running": False, "command": command, "tab_name": tab_name}
|
|
303
|
-
|
|
304
|
-
except Exception as e:
|
|
305
|
-
logger.error(f"Error checking command status for tab '{tab_name}': {e}")
|
|
306
|
-
return {"status": "error", "error": str(e), "running": False, "command": command, "tab_name": tab_name}
|
|
307
|
-
|
|
308
|
-
def get_status_report(self) -> Dict[str, Any]:
|
|
89
|
+
def get_status_report(self) -> dict[str, Any]:
|
|
309
90
|
"""Get status report for this layout including Windows Terminal and commands."""
|
|
310
|
-
wt_status =
|
|
91
|
+
wt_status = check_wt_session_status(self.session_name or "default")
|
|
311
92
|
commands_status = self.check_all_commands_status()
|
|
312
93
|
|
|
313
94
|
running_count = sum(1 for status in commands_status.values() if status.get("running", False))
|
|
@@ -326,64 +107,87 @@ Get-Process | ForEach-Object {{
|
|
|
326
107
|
commands = status["commands"]
|
|
327
108
|
summary = status["summary"]
|
|
328
109
|
|
|
329
|
-
print(
|
|
330
|
-
print("
|
|
331
|
-
print("=" * 80)
|
|
110
|
+
console.print()
|
|
111
|
+
console.print(Panel.fit("� WINDOWS TERMINAL LAYOUT STATUS REPORT", style="bold cyan"))
|
|
332
112
|
|
|
333
113
|
# Windows Terminal session status
|
|
334
|
-
print(f"🪟 Session: {self.session_name}")
|
|
335
114
|
if wt_session.get("wt_running", False):
|
|
336
115
|
if wt_session.get("session_exists", False):
|
|
337
116
|
session_windows = wt_session.get("session_windows", [])
|
|
338
117
|
all_windows = wt_session.get("all_windows", [])
|
|
339
|
-
print("✅ Windows Terminal is running")
|
|
340
|
-
print(f" Session windows: {len(session_windows)}")
|
|
341
|
-
print(f" Total WT windows: {len(all_windows)}")
|
|
118
|
+
console.print(f"[bold green]✅ Windows Terminal session[/bold green] [yellow]'{self.session_name}'[/yellow] [green]is running[/green]")
|
|
119
|
+
console.print(f" Session windows: {len(session_windows)}")
|
|
120
|
+
console.print(f" Total WT windows: {len(all_windows)}")
|
|
342
121
|
else:
|
|
343
|
-
print("⚠️ Windows Terminal is running but
|
|
122
|
+
console.print(f"[bold yellow]⚠️ Windows Terminal is running but session[/bold yellow] [yellow]'{self.session_name}'[/yellow] [yellow]not found[/yellow]")
|
|
344
123
|
else:
|
|
345
124
|
error_msg = wt_session.get("error", "Unknown error")
|
|
346
|
-
print(f"❌ Windows Terminal session issue: {error_msg}")
|
|
125
|
+
console.print(f"[bold red]❌ Windows Terminal session issue:[/bold red] [red]{error_msg}[/red]")
|
|
347
126
|
|
|
348
|
-
print()
|
|
127
|
+
console.print()
|
|
128
|
+
|
|
129
|
+
# Commands status table
|
|
130
|
+
table = Table(title="📋 COMMAND STATUS", show_header=True, header_style="bold magenta")
|
|
131
|
+
table.add_column("Tab", style="cyan", no_wrap=True)
|
|
132
|
+
table.add_column("Status", justify="center")
|
|
133
|
+
table.add_column("PID", justify="center", style="dim")
|
|
134
|
+
table.add_column("Command", style="green", max_width=40)
|
|
349
135
|
|
|
350
|
-
# Commands in this layout
|
|
351
|
-
print(f"📋 COMMANDS ({summary['running_commands']}/{summary['total_commands']} running):")
|
|
352
136
|
for tab_name, cmd_status in commands.items():
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
137
|
+
if cmd_status.get("running", False):
|
|
138
|
+
status_text = "[bold green]✅ Running[/bold green]"
|
|
139
|
+
processes = cmd_status.get("processes", [])
|
|
140
|
+
if processes:
|
|
141
|
+
proc = processes[0]
|
|
142
|
+
pid = str(proc.get("pid", "N/A"))
|
|
143
|
+
else:
|
|
144
|
+
pid = "N/A"
|
|
145
|
+
else:
|
|
146
|
+
status_text = "[bold red]❌ Stopped[/bold red]"
|
|
147
|
+
pid = "N/A"
|
|
357
148
|
|
|
358
|
-
|
|
149
|
+
command = cmd_status.get("command", "Unknown")
|
|
150
|
+
if len(command) > 35:
|
|
151
|
+
command = command[:32] + "..."
|
|
359
152
|
|
|
360
|
-
|
|
361
|
-
for proc in cmd_status["processes"][:2]: # Show first 2 processes
|
|
362
|
-
pid = proc.get("pid", "Unknown")
|
|
363
|
-
name = proc.get("name", "Unknown")
|
|
364
|
-
print(f" └─ PID {pid}: {name}")
|
|
365
|
-
print()
|
|
153
|
+
table.add_row(tab_name, status_text, pid, command)
|
|
366
154
|
|
|
367
|
-
print(
|
|
155
|
+
console.print(table)
|
|
156
|
+
console.print()
|
|
368
157
|
|
|
158
|
+
# Summary panel
|
|
159
|
+
summary_text = f"""[bold]Total commands:[/bold] {summary['total_commands']}
|
|
160
|
+
[green]Running:[/green] {summary['running_commands']}
|
|
161
|
+
[red]Stopped:[/red] {summary['stopped_commands']}
|
|
162
|
+
[yellow]Session healthy:[/yellow] {"✅" if summary['session_healthy'] else "❌"}"""
|
|
369
163
|
|
|
370
|
-
|
|
371
|
-
generator = WTLayoutGenerator()
|
|
372
|
-
return generator.create_wt_layout(layout_config, output_dir)
|
|
164
|
+
console.print(Panel(summary_text, title="📊 Summary", style="blue"))
|
|
373
165
|
|
|
374
166
|
|
|
375
|
-
def
|
|
376
|
-
|
|
377
|
-
generator = WTLayoutGenerator()
|
|
378
|
-
|
|
167
|
+
def create_wt_layout(layout_config: LayoutConfig, output_path: str) -> str:
|
|
168
|
+
session_name = layout_config["layoutName"]
|
|
169
|
+
generator = WTLayoutGenerator(layout_config=layout_config, session_name=session_name)
|
|
170
|
+
generator.create_layout_file()
|
|
171
|
+
|
|
172
|
+
if generator.script_path is None:
|
|
173
|
+
raise RuntimeError("Script path was not set after creating layout file")
|
|
174
|
+
|
|
175
|
+
logger.info(f"Windows Terminal PowerShell script created: {generator.script_path}")
|
|
176
|
+
return generator.script_path
|
|
379
177
|
|
|
178
|
+
|
|
179
|
+
def run_wt_layout(layout_config: LayoutConfig) -> None:
|
|
180
|
+
"""Create and run a Windows Terminal layout."""
|
|
181
|
+
session_name = layout_config["layoutName"]
|
|
182
|
+
generator = WTLayoutGenerator(layout_config=layout_config, session_name=session_name)
|
|
183
|
+
generator.create_layout_file()
|
|
184
|
+
if generator.script_path is None:
|
|
185
|
+
raise RuntimeError("Script path was not set after creating layout file")
|
|
380
186
|
# Execute the script
|
|
381
|
-
cmd = f'powershell -ExecutionPolicy Bypass -File "{script_path}"'
|
|
187
|
+
cmd = f'powershell -ExecutionPolicy Bypass -File "{generator.script_path}"'
|
|
382
188
|
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
|
383
|
-
|
|
384
189
|
if result.returncode == 0:
|
|
385
190
|
print(f"Windows Terminal layout is running @ {layout_config['layoutName']}")
|
|
386
|
-
return script_path
|
|
387
191
|
else:
|
|
388
192
|
logger.error(f"Failed to run Windows Terminal layout: {result.stderr}")
|
|
389
193
|
raise RuntimeError(f"Failed to run layout: {result.stderr}")
|
|
@@ -392,7 +196,6 @@ def run_wt_layout(layout_config: LayoutConfig) -> str:
|
|
|
392
196
|
def run_command_in_wt_tab(command: str, tab_name: str, cwd: Optional[str]) -> str:
|
|
393
197
|
"""Create a command to run in a new Windows Terminal tab."""
|
|
394
198
|
cwd_part = f'-d "{cwd}"' if cwd else ""
|
|
395
|
-
|
|
396
199
|
return f"""
|
|
397
200
|
echo "Creating new Windows Terminal tab: {tab_name}"
|
|
398
201
|
wt new-tab --title "{tab_name}" {cwd_part} "{command}"
|
|
@@ -400,29 +203,24 @@ wt new-tab --title "{tab_name}" {cwd_part} "{command}"
|
|
|
400
203
|
|
|
401
204
|
|
|
402
205
|
if __name__ == "__main__":
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
206
|
+
sample_layout: LayoutConfig = {"layoutName": "TestLayout",
|
|
207
|
+
"layoutTabs": [
|
|
208
|
+
{"tabName": "Frontend", "startDir": "~/code", "command": "btm"},
|
|
209
|
+
{"tabName": "Monitor", "startDir": "~", "command": "lf"}
|
|
210
|
+
]}
|
|
406
211
|
try:
|
|
407
|
-
|
|
408
|
-
generator = WTLayoutGenerator()
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
print(
|
|
415
|
-
|
|
416
|
-
# Check status (won't find anything since we haven't run it)
|
|
417
|
-
print("\n🔍 Current status:")
|
|
212
|
+
session_name = sample_layout["layoutName"]
|
|
213
|
+
generator = WTLayoutGenerator(layout_config=sample_layout, session_name=session_name)
|
|
214
|
+
generator.create_layout_file()
|
|
215
|
+
|
|
216
|
+
print(f"✅ Windows Terminal layout created: {generator.script_path}")
|
|
217
|
+
preview = generator.get_wt_layout_preview(generator.layout_config)
|
|
218
|
+
print(f"📋 Command Preview:\n{preview}")
|
|
219
|
+
print("🔍 Current status:")
|
|
418
220
|
generator.print_status_report()
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
print("\n▶️ To run this layout, execute:")
|
|
422
|
-
print(f' powershell -ExecutionPolicy Bypass -File "{script_path}"')
|
|
423
|
-
|
|
221
|
+
print("▶️ To run this layout, execute:")
|
|
222
|
+
print(f' powershell -ExecutionPolicy Bypass -File "{generator.script_path}"')
|
|
424
223
|
except Exception as e:
|
|
425
224
|
print(f"❌ Error: {e}")
|
|
426
225
|
import traceback
|
|
427
|
-
|
|
428
226
|
traceback.print_exc()
|