machineconfig 6.82__py3-none-any.whl → 7.98__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +25 -13
- machineconfig/cluster/sessions_managers/wt_local.py +16 -221
- machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
- 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_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
- machineconfig/jobs/installer/custom/boxes.py +2 -2
- machineconfig/jobs/installer/custom/hx.py +75 -18
- machineconfig/jobs/installer/custom/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/brave.py +5 -3
- 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 +1 -1
- machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +27 -22
- 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 +1287 -216
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +58 -89
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/create_helper.py +43 -16
- machineconfig/profile/create_links.py +2 -1
- machineconfig/profile/create_links_export.py +64 -18
- machineconfig/profile/create_shell_profile.py +78 -127
- machineconfig/profile/mapper.toml +15 -8
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +52 -37
- machineconfig/scripts/python/ai/initai.py +1 -1
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -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 +4 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/generic.py +1 -1
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
- machineconfig/scripts/python/croshell.py +77 -78
- machineconfig/scripts/python/devops.py +39 -21
- machineconfig/scripts/python/devops_navigator.py +0 -4
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +1 -1
- machineconfig/scripts/python/fire_jobs.py +84 -115
- machineconfig/scripts/python/ftpx.py +42 -16
- 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_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- 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_fire → helpers_agents}/fire_agents_help_launch.py +32 -13
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_helper_types.py +11 -14
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -0
- machineconfig/scripts/python/helpers_cloud/cloud_copy.py +28 -21
- machineconfig/scripts/python/helpers_cloud/cloud_helpers.py +1 -1
- machineconfig/scripts/python/helpers_cloud/cloud_mount.py +19 -17
- machineconfig/scripts/python/helpers_cloud/cloud_sync.py +8 -7
- machineconfig/scripts/python/helpers_croshell/crosh.py +3 -3
- machineconfig/scripts/python/helpers_croshell/start_slidev.py +6 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +46 -61
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +67 -55
- machineconfig/scripts/python/helpers_devops/cli_nw.py +157 -16
- machineconfig/scripts/python/helpers_devops/cli_repos.py +55 -21
- machineconfig/scripts/python/helpers_devops/cli_self.py +98 -48
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +80 -42
- machineconfig/scripts/python/helpers_devops/{cli_terminal.py → cli_share_terminal.py} +15 -17
- machineconfig/scripts/python/helpers_devops/cli_utils.py +3 -128
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +4 -4
- machineconfig/scripts/python/helpers_devops/devops_status.py +7 -19
- machineconfig/scripts/python/helpers_devops/themes/choose_wezterm_theme.py +1 -1
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
- 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/command_tree.py +50 -18
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{nw → helpers_network}/devops_add_ssh_key.py +24 -5
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
- machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/{nw → helpers_network}/wsl_windows_transfer.py +3 -2
- machineconfig/scripts/python/helpers_repos/clone.py +0 -1
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +46 -19
- machineconfig/scripts/python/helpers_repos/entrypoint.py +2 -1
- machineconfig/scripts/python/helpers_repos/grource.py +1 -1
- machineconfig/scripts/python/helpers_repos/record.py +2 -1
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/helpers_repos/{count_lines.py → repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +20 -13
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +19 -26
- machineconfig/scripts/python/{mcfg.py → mcfg_entry.py} +10 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +94 -25
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +28 -30
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +1 -1
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- 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 +3 -2
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +14 -16
- machineconfig/settings/marimo/marimo.toml +1 -1
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/shells/bash/init.sh +43 -11
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -32
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +40 -14
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +14 -5
- machineconfig/settings/shells/zsh/init.sh +17 -19
- 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 +2 -1
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +31 -0
- machineconfig/setup_mac/__init__.py +2 -3
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_windows/__init__.py +3 -3
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -11
- 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 -4
- machineconfig/utils/code.py +99 -32
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/headers.py +3 -2
- 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 +42 -99
- 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} +36 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +16 -61
- machineconfig/utils/io.py +69 -1
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +33 -18
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +44 -95
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +1 -1
- machineconfig/utils/scheduler.py +20 -53
- machineconfig/utils/scheduling.py +0 -2
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/ssh.py +159 -412
- 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 +1 -0
- machineconfig/utils/upgrade_packages.py +104 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/RECORD +259 -196
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/entry_points.txt +4 -1
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- machineconfig/jobs/installer/powershell_scripts/archive_pygraphviz.ps1 +0 -12
- 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/mcfgs +0 -38
- machineconfig/scripts/linux/other/share_smb +0 -1
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
- machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
- machineconfig/scripts/python/helpers_fire/template.sh +0 -15
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/mcfgs.ps1 +0 -17
- 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/apps.sh +0 -66
- machineconfig/setup_linux/others/cli_installation.sh +0 -137
- machineconfig/setup_mac/apps.sh +0 -73
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig-6.82.dist-info/METADATA +0 -82
- /machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- /machineconfig/scripts/python/{helpers_fire → ai/utils}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_agents}/__init__.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_network/__init__.py} +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/devops_add_identity.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_smb +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/{Restore-ThunderbirdProfile.ps1 → windows/mounts/Restore-ThunderbirdProfile.ps1} +0 -0
- /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/installer/powershell_scripts → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
- {machineconfig-6.82.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
import random
|
|
3
|
+
import string
|
|
4
|
+
import json
|
|
5
|
+
import shlex
|
|
6
|
+
import logging
|
|
7
|
+
from typing import Any
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
POWERSHELL_CMD = "powershell" if __import__("platform").system().lower() == "windows" else "pwsh"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def generate_random_suffix(length: int) -> str:
|
|
18
|
+
"""Generate a random string suffix for unique PowerShell script names."""
|
|
19
|
+
return "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def parse_command(command: str) -> tuple[str, list[str]]:
|
|
23
|
+
try:
|
|
24
|
+
parts = shlex.split(command)
|
|
25
|
+
if not parts:
|
|
26
|
+
raise ValueError("Empty command provided")
|
|
27
|
+
return parts[0], parts[1:] if len(parts) > 1 else []
|
|
28
|
+
except ValueError as e:
|
|
29
|
+
logger.error(f"Error parsing command '{command}': {e}")
|
|
30
|
+
parts = command.split()
|
|
31
|
+
return parts[0] if parts else "", parts[1:] if len(parts) > 1 else []
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def escape_for_wt(text: str) -> str:
|
|
35
|
+
"""Escape text for use in Windows Terminal commands."""
|
|
36
|
+
text = text.replace('"', '""')
|
|
37
|
+
if " " in text or ";" in text or "&" in text or "|" in text:
|
|
38
|
+
return f'"{text}"'
|
|
39
|
+
return text
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def validate_layout_config(layout_config: LayoutConfig) -> None:
|
|
43
|
+
"""Validate layout configuration format and content."""
|
|
44
|
+
if not layout_config["layoutTabs"]:
|
|
45
|
+
raise ValueError("Layout must contain at least one tab")
|
|
46
|
+
for tab in layout_config["layoutTabs"]:
|
|
47
|
+
if not tab["tabName"].strip():
|
|
48
|
+
raise ValueError(f"Invalid tab name: {tab['tabName']}")
|
|
49
|
+
if not tab["command"].strip():
|
|
50
|
+
raise ValueError(f"Invalid command for tab '{tab['tabName']}': {tab['command']}")
|
|
51
|
+
if not tab["startDir"].strip():
|
|
52
|
+
raise ValueError(f"Invalid startDir for tab '{tab['tabName']}': {tab['startDir']}")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def generate_wt_command_string(layout_config: LayoutConfig, window_name: str) -> str:
|
|
56
|
+
"""Generate complete Windows Terminal command string."""
|
|
57
|
+
command_parts = []
|
|
58
|
+
|
|
59
|
+
for i, tab in enumerate(layout_config["layoutTabs"]):
|
|
60
|
+
is_first = i == 0
|
|
61
|
+
|
|
62
|
+
if is_first:
|
|
63
|
+
tab_parts = ["wt", "-w", escape_for_wt(window_name)]
|
|
64
|
+
else:
|
|
65
|
+
tab_parts = ["new-tab"]
|
|
66
|
+
|
|
67
|
+
tab_name = tab["tabName"]
|
|
68
|
+
cwd = tab["startDir"]
|
|
69
|
+
command = tab["command"]
|
|
70
|
+
|
|
71
|
+
if cwd.startswith("~/"):
|
|
72
|
+
cwd = cwd.replace("~/", f"{Path.home()}/")
|
|
73
|
+
elif cwd == "~":
|
|
74
|
+
cwd = str(Path.home())
|
|
75
|
+
|
|
76
|
+
tab_parts.extend(["-d", escape_for_wt(cwd)])
|
|
77
|
+
tab_parts.extend(["--title", escape_for_wt(tab_name)])
|
|
78
|
+
tab_parts.append("--")
|
|
79
|
+
|
|
80
|
+
# Split the command into arguments
|
|
81
|
+
command_args = shlex.split(command)
|
|
82
|
+
tab_parts.extend(command_args)
|
|
83
|
+
|
|
84
|
+
command_parts.append(" ".join(tab_parts))
|
|
85
|
+
|
|
86
|
+
return " `; ".join(command_parts)
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def check_wt_session_status(session_name: str) -> dict[str, Any]:
|
|
90
|
+
try:
|
|
91
|
+
ps_script = """
|
|
92
|
+
try {
|
|
93
|
+
$wtProcesses = Get-Process -Name 'WindowsTerminal' -ErrorAction SilentlyContinue
|
|
94
|
+
if ($wtProcesses) {
|
|
95
|
+
$processInfo = @()
|
|
96
|
+
$wtProcesses | ForEach-Object {
|
|
97
|
+
$info = @{
|
|
98
|
+
"Id" = $_.Id
|
|
99
|
+
"ProcessName" = $_.ProcessName
|
|
100
|
+
"StartTime" = $_.StartTime.ToString()
|
|
101
|
+
}
|
|
102
|
+
$processInfo += $info
|
|
103
|
+
}
|
|
104
|
+
$processInfo | ConvertTo-Json -Depth 2
|
|
105
|
+
}
|
|
106
|
+
} catch {
|
|
107
|
+
# No Windows Terminal processes found
|
|
108
|
+
}
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
result = subprocess.run([POWERSHELL_CMD, "-Command", ps_script], capture_output=True, text=True, timeout=5)
|
|
112
|
+
|
|
113
|
+
if result.returncode == 0:
|
|
114
|
+
output = result.stdout.strip()
|
|
115
|
+
if output and output != "":
|
|
116
|
+
try:
|
|
117
|
+
processes = json.loads(output)
|
|
118
|
+
if not isinstance(processes, list):
|
|
119
|
+
processes = [processes]
|
|
120
|
+
|
|
121
|
+
return {"wt_running": True, "session_exists": len(processes) > 0, "session_name": session_name, "all_windows": processes, "session_windows": processes}
|
|
122
|
+
except Exception as e:
|
|
123
|
+
return {"wt_running": True, "session_exists": False, "error": f"Failed to parse process info: {e}", "session_name": session_name}
|
|
124
|
+
else:
|
|
125
|
+
return {"wt_running": False, "session_exists": False, "session_name": session_name, "all_windows": []}
|
|
126
|
+
else:
|
|
127
|
+
return {"wt_running": False, "error": result.stderr, "session_name": session_name}
|
|
128
|
+
|
|
129
|
+
except subprocess.TimeoutExpired:
|
|
130
|
+
return {"wt_running": False, "error": "Timeout while checking Windows Terminal processes", "session_name": session_name}
|
|
131
|
+
except FileNotFoundError:
|
|
132
|
+
return {"wt_running": False, "error": f"PowerShell ({POWERSHELL_CMD}) not found in PATH", "session_name": session_name}
|
|
133
|
+
except Exception as e:
|
|
134
|
+
return {"wt_running": False, "error": str(e), "session_name": session_name}
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def check_command_status(tab_name: str, layout_config: LayoutConfig) -> dict[str, Any]:
|
|
138
|
+
"""Check if a command is running by looking for processes."""
|
|
139
|
+
tab_config = None
|
|
140
|
+
for tab in layout_config["layoutTabs"]:
|
|
141
|
+
if tab["tabName"] == tab_name:
|
|
142
|
+
tab_config = tab
|
|
143
|
+
break
|
|
144
|
+
|
|
145
|
+
if tab_config is None:
|
|
146
|
+
return {"status": "unknown", "error": f"Tab '{tab_name}' not found in layout config", "running": False, "pid": None, "command": None}
|
|
147
|
+
|
|
148
|
+
command = tab_config["command"]
|
|
149
|
+
|
|
150
|
+
try:
|
|
151
|
+
primary_cmd = command.split()[0] if command.strip() else ""
|
|
152
|
+
if not primary_cmd:
|
|
153
|
+
return {"status": "error", "error": "Empty command", "running": False, "command": command, "tab_name": tab_name}
|
|
154
|
+
|
|
155
|
+
ps_script = f"""
|
|
156
|
+
try {{
|
|
157
|
+
$processes = Get-Process -Name '{primary_cmd}' -ErrorAction SilentlyContinue
|
|
158
|
+
if ($processes) {{
|
|
159
|
+
$processes | ForEach-Object {{
|
|
160
|
+
$procInfo = @{{
|
|
161
|
+
"pid" = $_.Id
|
|
162
|
+
"name" = $_.ProcessName
|
|
163
|
+
"start_time" = $_.StartTime.ToString()
|
|
164
|
+
}}
|
|
165
|
+
Write-Output ($procInfo | ConvertTo-Json -Compress)
|
|
166
|
+
}}
|
|
167
|
+
}}
|
|
168
|
+
}} catch {{
|
|
169
|
+
# No processes found or other error
|
|
170
|
+
}}
|
|
171
|
+
"""
|
|
172
|
+
|
|
173
|
+
result = subprocess.run([POWERSHELL_CMD, "-Command", ps_script], capture_output=True, text=True, timeout=5)
|
|
174
|
+
|
|
175
|
+
if result.returncode == 0:
|
|
176
|
+
output_lines = [line.strip() for line in result.stdout.strip().split("\n") if line.strip()]
|
|
177
|
+
matching_processes = []
|
|
178
|
+
|
|
179
|
+
for line in output_lines:
|
|
180
|
+
if line.startswith("{") and line.endswith("}"):
|
|
181
|
+
try:
|
|
182
|
+
proc_info = json.loads(line)
|
|
183
|
+
matching_processes.append(proc_info)
|
|
184
|
+
except json.JSONDecodeError:
|
|
185
|
+
continue
|
|
186
|
+
|
|
187
|
+
if matching_processes:
|
|
188
|
+
return {"status": "running", "running": True, "processes": matching_processes, "command": command, "tab_name": tab_name}
|
|
189
|
+
else:
|
|
190
|
+
return {"status": "not_running", "running": False, "processes": [], "command": command, "tab_name": tab_name}
|
|
191
|
+
else:
|
|
192
|
+
return {"status": "error", "error": f"Command failed: {result.stderr}", "running": False, "command": command, "tab_name": tab_name}
|
|
193
|
+
|
|
194
|
+
except subprocess.TimeoutExpired:
|
|
195
|
+
logger.error(f"Timeout checking command status for tab '{tab_name}'")
|
|
196
|
+
return {"status": "timeout", "error": "Timeout checking process status", "running": False, "command": command, "tab_name": tab_name}
|
|
197
|
+
except Exception as e:
|
|
198
|
+
logger.error(f"Error checking command status for tab '{tab_name}': {e}")
|
|
199
|
+
return {"status": "error", "error": str(e), "running": False, "command": command, "tab_name": tab_name}
|
|
@@ -276,7 +276,9 @@ class ZellijLocalManager:
|
|
|
276
276
|
print(f"📊 Quick Summary: {global_summary['running_commands']}/{global_summary['total_commands']} commands running across {global_summary['healthy_sessions']}/{global_summary['total_sessions']} sessions")
|
|
277
277
|
|
|
278
278
|
logger.info(f"Starting monitoring routine with {wait_ms}ms intervals")
|
|
279
|
-
|
|
279
|
+
from machineconfig.utils.scheduler import LoggerTemplate
|
|
280
|
+
from typing import cast
|
|
281
|
+
sched = Scheduler(routine=routine, wait_ms=wait_ms, logger=cast(LoggerTemplate, logger))
|
|
280
282
|
sched.run()
|
|
281
283
|
|
|
282
284
|
def save(self, session_id: Optional[str]) -> str:
|
|
@@ -88,8 +88,9 @@ class ZellijSessionManager:
|
|
|
88
88
|
# Print statuses
|
|
89
89
|
for i, status in enumerate(statuses):
|
|
90
90
|
print(f"Manager {i}: {status}")
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
from machineconfig.utils.scheduler import LoggerTemplate
|
|
92
|
+
from typing import cast
|
|
93
|
+
sched = Scheduler(routine=routine, wait_ms=60_000, logger=cast(LoggerTemplate, logger))
|
|
93
94
|
sched.run()
|
|
94
95
|
|
|
95
96
|
def save(self, session_id: Optional[str]) -> str:
|
|
@@ -53,7 +53,7 @@ class ProcessMonitor:
|
|
|
53
53
|
command = tab_config["command"]
|
|
54
54
|
try:
|
|
55
55
|
check_script = self._create_process_check_script(command)
|
|
56
|
-
remote_cmd = f"$HOME/.local/bin devops self
|
|
56
|
+
remote_cmd = f"$HOME/.local/bin devops self python -c {shlex.quote(check_script)}"
|
|
57
57
|
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
58
58
|
if result.returncode == 0:
|
|
59
59
|
try:
|
|
@@ -139,7 +139,7 @@ if __name__ == "__main__":
|
|
|
139
139
|
check_timestamp = timestamp_result.stdout.strip() if timestamp_result.returncode == 0 else "unknown"
|
|
140
140
|
|
|
141
141
|
check_script = self._create_fresh_check_script(command)
|
|
142
|
-
remote_cmd = f"$HOME/.local/bin/devops self
|
|
142
|
+
remote_cmd = f"$HOME/.local/bin/devops self python -c {shlex.quote(check_script)}"
|
|
143
143
|
result = self.remote_executor.run_command(remote_cmd, timeout=15)
|
|
144
144
|
|
|
145
145
|
if result.returncode == 0:
|
|
@@ -5,7 +5,7 @@ from typing import Optional
|
|
|
5
5
|
|
|
6
6
|
from rich.console import Console
|
|
7
7
|
from rich.panel import Panel
|
|
8
|
-
from machineconfig.utils.installer_utils.
|
|
8
|
+
from machineconfig.utils.installer_utils.installer_locator_utils import WINDOWS_INSTALL_PATH
|
|
9
9
|
|
|
10
10
|
from machineconfig.utils.installer_utils.installer_class import Installer
|
|
11
11
|
from machineconfig.utils.schemas.installer.installer_types import InstallerData
|
|
@@ -40,7 +40,7 @@ def main(installer_data: InstallerData, version: Optional[str] = None) -> None:
|
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
installer = Installer(installer_data=installer_data_modified)
|
|
43
|
-
downloaded, _version_to_be_installed = installer.
|
|
43
|
+
downloaded, _version_to_be_installed = installer.binary_download(version=version)
|
|
44
44
|
decomp_path = downloaded.decompress()
|
|
45
45
|
from pathlib import Path
|
|
46
46
|
for item in decomp_path.rglob("*"):
|
|
@@ -3,37 +3,39 @@ Installers do not add runtime files to the machine, hence this script.
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from machineconfig.utils.path_extended import PathExtended
|
|
6
|
-
from machineconfig.utils.installer_utils.
|
|
6
|
+
from machineconfig.utils.installer_utils.installer_locator_utils import WINDOWS_INSTALL_PATH
|
|
7
7
|
from typing import Optional
|
|
8
8
|
import platform
|
|
9
9
|
|
|
10
|
-
from machineconfig.utils.installer_utils.
|
|
10
|
+
from machineconfig.utils.installer_utils.installer_locator_utils import LINUX_INSTALL_PATH
|
|
11
11
|
from machineconfig.utils.installer_utils.installer_class import Installer
|
|
12
12
|
from rich.console import Console
|
|
13
13
|
from rich.panel import Panel
|
|
14
14
|
from machineconfig.utils.schemas.installer.installer_types import InstallerData
|
|
15
15
|
|
|
16
16
|
|
|
17
|
+
LANGUAGES_SUPPORTED_GRAMMER = ["python.so", "nu.so", "bash.so", "lua.so", "powershell.so"]
|
|
17
18
|
config_dict: InstallerData = {
|
|
18
19
|
"appName": "hx",
|
|
19
20
|
"repoURL": "CMD",
|
|
20
21
|
"doc": "Helix is a post-modern modal text editor.",
|
|
21
22
|
"fileNamePattern": {
|
|
22
23
|
"amd64": {
|
|
23
|
-
"linux": "
|
|
24
|
-
"macos": "
|
|
25
|
-
"windows": "
|
|
24
|
+
"linux": "helix-{version}-x86_64-linux.tar.xz",
|
|
25
|
+
"macos": "helix-{version}-x86_64-macos.tar.xz",
|
|
26
|
+
"windows": "helix-{version}-x86_64-windows.zip",
|
|
26
27
|
},
|
|
27
28
|
"arm64": {
|
|
28
|
-
"linux": "
|
|
29
|
-
"macos": "
|
|
30
|
-
"windows": "
|
|
29
|
+
"linux": "helix-{version}-arm64-linux.tar.xz",
|
|
30
|
+
"macos": "helix-{version}-arm64-macos.tar.xz",
|
|
31
|
+
"windows": "helix-{version}-arm64-windows.zip",
|
|
31
32
|
},
|
|
32
33
|
},
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
|
|
36
|
-
def main(version: Optional[str], install_lib: bool =
|
|
37
|
+
def main(installer_data: InstallerData, version: Optional[str], install_lib: bool = True):
|
|
38
|
+
_ = installer_data
|
|
37
39
|
console = Console()
|
|
38
40
|
|
|
39
41
|
console.print(Panel(f"HELIX EDITOR INSTALLER 🧬\nPlatform: {platform.system()}\nVersion: {'latest' if version is None else version}", title="Installer", expand=False))
|
|
@@ -43,7 +45,7 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
43
45
|
inst = Installer(installer_data=config_dict_copy)
|
|
44
46
|
|
|
45
47
|
print("\n📥 [Step 1/5] Downloading Helix editor...")
|
|
46
|
-
downloaded, _version_to_be_installed = inst.
|
|
48
|
+
downloaded, _version_to_be_installed = inst.binary_download(version=version)
|
|
47
49
|
print(" ✨ Download complete.")
|
|
48
50
|
|
|
49
51
|
print("\n🔍 [Step 2/5] Locating executable and components...")
|
|
@@ -57,6 +59,7 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
57
59
|
raise FileNotFoundError(f"Could not find 'hx' executable in {downloaded.name}")
|
|
58
60
|
|
|
59
61
|
assert len(hx_file_search) == 1, f"Expected 1 'hx' executable, found {len(hx_file_search)}"
|
|
62
|
+
|
|
60
63
|
hx_file = hx_file_search[0]
|
|
61
64
|
contrib = hx_file.parent / "contrib"
|
|
62
65
|
runtime = contrib.parent / "runtime"
|
|
@@ -72,9 +75,6 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
72
75
|
print("\n🗑️ [Step 3/5] Cleaning up previous installation (if any)...")
|
|
73
76
|
runtime_path = PathExtended.home().joinpath(".config/helix/runtime")
|
|
74
77
|
contrib_path = PathExtended.home().joinpath(".config/helix/contrib")
|
|
75
|
-
runtime_path.delete(sure=True, verbose=False)
|
|
76
|
-
contrib_path.delete(sure=True, verbose=False)
|
|
77
|
-
print(f" ✨ Cleaned '{runtime_path}' and '{contrib_path}'.")
|
|
78
78
|
|
|
79
79
|
print("\n📦 [Step 4/5] Installing Helix components...")
|
|
80
80
|
target_config_dir = PathExtended.home().joinpath(".config/helix").expanduser()
|
|
@@ -84,9 +84,41 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
84
84
|
target_bin_path = PathExtended(LINUX_INSTALL_PATH) if platform.system() == "Linux" else PathExtended("/usr/local/bin")
|
|
85
85
|
exe_name = "hx"
|
|
86
86
|
hx_file.move(folder=target_bin_path, overwrite=True)
|
|
87
|
+
|
|
88
|
+
# Always install contrib (regardless of install_lib flag) — treat it like the executable.
|
|
89
|
+
contrib_path.delete(sure=True, verbose=False)
|
|
90
|
+
contrib.move(folder=target_config_dir, overwrite=True)
|
|
91
|
+
|
|
92
|
+
# Install runtime only if install_lib is True. When copying runtime, copy all subfolders
|
|
93
|
+
# except 'grammars' (for which we only copy the specific python.so file if present).
|
|
87
94
|
if install_lib:
|
|
88
|
-
|
|
89
|
-
|
|
95
|
+
runtime_path.delete(sure=True, verbose=False)
|
|
96
|
+
print(f" ✨ Cleaned '{runtime_path}' and '{contrib_path}'.")
|
|
97
|
+
target_runtime = target_config_dir.joinpath("runtime")
|
|
98
|
+
target_runtime.mkdir(parents=True, exist_ok=True)
|
|
99
|
+
|
|
100
|
+
# iterate runtime children and copy selectively
|
|
101
|
+
for child in runtime.iterdir():
|
|
102
|
+
# skip non-existent or weird entries
|
|
103
|
+
if not child.exists():
|
|
104
|
+
continue
|
|
105
|
+
if child.name == "grammars":
|
|
106
|
+
# copy only the specific language files from runtime/grammars if they exist
|
|
107
|
+
for a_language in LANGUAGES_SUPPORTED_GRAMMER:
|
|
108
|
+
lang_file = child.joinpath(a_language)
|
|
109
|
+
if lang_file.exists() and lang_file.is_file():
|
|
110
|
+
dest = target_runtime.joinpath("grammars")
|
|
111
|
+
lang_file.copy(folder=dest, overwrite=True)
|
|
112
|
+
else:
|
|
113
|
+
# copy the whole child (file or directory) into target_runtime
|
|
114
|
+
# for directories, copy will create target_runtime/<child.name>
|
|
115
|
+
try:
|
|
116
|
+
child.copy(folder=target_runtime, overwrite=True)
|
|
117
|
+
except Exception:
|
|
118
|
+
# fallback: try copying contents if it's a directory
|
|
119
|
+
if child.is_dir():
|
|
120
|
+
for sub in child.iterdir():
|
|
121
|
+
sub.copy(folder=target_runtime.joinpath(child.name), overwrite=True)
|
|
90
122
|
system_name = "Linux" if platform.system() == "Linux" else "macOS"
|
|
91
123
|
console.print(
|
|
92
124
|
Panel(
|
|
@@ -102,9 +134,34 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
102
134
|
target_bin_path = PathExtended(WINDOWS_INSTALL_PATH)
|
|
103
135
|
exe_name = "hx.exe"
|
|
104
136
|
hx_file.move(folder=target_bin_path, overwrite=True)
|
|
137
|
+
|
|
138
|
+
# Always install contrib (regardless of install_lib flag)
|
|
139
|
+
contrib_path.delete(sure=True, verbose=False)
|
|
140
|
+
contrib.move(folder=target_config_dir, overwrite=True)
|
|
141
|
+
|
|
142
|
+
# Install runtime only if install_lib is True. Copy selectively as on POSIX.
|
|
105
143
|
if install_lib:
|
|
106
|
-
|
|
107
|
-
|
|
144
|
+
runtime_path.delete(sure=True, verbose=False)
|
|
145
|
+
print(f" ✨ Cleaned '{runtime_path}' and '{contrib_path}'.")
|
|
146
|
+
target_runtime = target_config_dir.joinpath("runtime")
|
|
147
|
+
target_runtime.mkdir(parents=True, exist_ok=True)
|
|
148
|
+
|
|
149
|
+
for child in runtime.iterdir():
|
|
150
|
+
if not child.exists():
|
|
151
|
+
continue
|
|
152
|
+
if child.name == "grammars":
|
|
153
|
+
for a_language in LANGUAGES_SUPPORTED_GRAMMER:
|
|
154
|
+
lang_file = child.joinpath(a_language)
|
|
155
|
+
if lang_file.exists() and lang_file.is_file():
|
|
156
|
+
dest = target_runtime.joinpath("grammars")
|
|
157
|
+
lang_file.copy(folder=dest, overwrite=True)
|
|
158
|
+
else:
|
|
159
|
+
try:
|
|
160
|
+
child.copy(folder=target_runtime, overwrite=True)
|
|
161
|
+
except Exception:
|
|
162
|
+
if child.is_dir():
|
|
163
|
+
for sub in child.iterdir():
|
|
164
|
+
sub.copy(folder=target_runtime.joinpath(child.name), overwrite=True)
|
|
108
165
|
console.print(
|
|
109
166
|
Panel(
|
|
110
167
|
f"""✅ SUCCESS | Helix editor installed successfully on Windows!
|
|
@@ -137,4 +194,4 @@ def main(version: Optional[str], install_lib: bool = False):
|
|
|
137
194
|
|
|
138
195
|
|
|
139
196
|
if __name__ == "__main__":
|
|
140
|
-
|
|
197
|
+
pass
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import Optional
|
|
3
|
+
import platform
|
|
4
|
+
from machineconfig.utils.installer_utils.installer_class import Installer
|
|
5
|
+
from machineconfig.utils.schemas.installer.installer_types import InstallerData
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
installer_standard: InstallerData = {
|
|
9
|
+
"appName": "yazi",
|
|
10
|
+
"repoURL": "https://github.com/sxyazi/yazi",
|
|
11
|
+
"doc": "⚡ Blazing Fast Terminal File Manager.",
|
|
12
|
+
"fileNamePattern": {
|
|
13
|
+
"amd64": {
|
|
14
|
+
"linux": "yazi-x86_64-unknown-linux-musl.zip",
|
|
15
|
+
"macos": "yazi-x86_64-apple-darwin.zip",
|
|
16
|
+
"windows": "yazi-x86_64-pc-windows-msvc.zip"
|
|
17
|
+
},
|
|
18
|
+
"arm64": {
|
|
19
|
+
"linux": "yazi-aarch64-unknown-linux-musl.zip",
|
|
20
|
+
"macos": "yazi-aarch64-apple-darwin.zip",
|
|
21
|
+
"windows": "yazi-aarch64-pc-windows-msvc.zip"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
def main(installer_data: InstallerData, version: Optional[str]):
|
|
27
|
+
_ = installer_data
|
|
28
|
+
inst = Installer(installer_data=installer_standard)
|
|
29
|
+
inst.install(version=version)
|
|
30
|
+
|
|
31
|
+
print("\n" * 5)
|
|
32
|
+
print("Installing Yazi plugins and flavors...")
|
|
33
|
+
installer_standard["appName"] = "ya"
|
|
34
|
+
inst = Installer(installer_data=installer_standard)
|
|
35
|
+
inst.install(version=version)
|
|
36
|
+
|
|
37
|
+
print("\n" * 5)
|
|
38
|
+
print("Cloning Yazi plugins and flavors repositories...")
|
|
39
|
+
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
system_name = platform.system().lower()
|
|
42
|
+
home_dir = Path.home()
|
|
43
|
+
if system_name == "windows":
|
|
44
|
+
yazi_plugins_dir = home_dir.joinpath("AppData", "Roaming", "yazi", "config")
|
|
45
|
+
else:
|
|
46
|
+
yazi_plugins_dir = home_dir.joinpath(".config", "yazi")
|
|
47
|
+
|
|
48
|
+
yazi_plugins_path = yazi_plugins_dir.joinpath("plugins")
|
|
49
|
+
yazi_flavours_path = yazi_plugins_dir.joinpath("flavors")
|
|
50
|
+
if yazi_plugins_path.exists():
|
|
51
|
+
if yazi_plugins_path.is_file():
|
|
52
|
+
yazi_plugins_path.unlink()
|
|
53
|
+
elif yazi_plugins_path.is_dir():
|
|
54
|
+
import shutil
|
|
55
|
+
shutil.rmtree(yazi_plugins_path)
|
|
56
|
+
yazi_plugins_dir.mkdir(parents=True, exist_ok=True)
|
|
57
|
+
import git
|
|
58
|
+
git.Repo.clone_from("https://github.com/yazi-rs/plugins", yazi_plugins_path)
|
|
59
|
+
if yazi_flavours_path.exists():
|
|
60
|
+
if yazi_flavours_path.is_file():
|
|
61
|
+
yazi_flavours_path.unlink()
|
|
62
|
+
elif yazi_flavours_path.is_dir():
|
|
63
|
+
import shutil
|
|
64
|
+
shutil.rmtree(yazi_flavours_path)
|
|
65
|
+
yazi_plugins_dir.mkdir(parents=True, exist_ok=True)
|
|
66
|
+
import git
|
|
67
|
+
git.Repo.clone_from("https://github.com/yazi-rs/flavors", yazi_flavours_path)
|
|
68
|
+
|
|
69
|
+
# previewers:
|
|
70
|
+
if platform.system() == "Linux":
|
|
71
|
+
script = r"""
|
|
72
|
+
sudo nala install poppler-utils -y || true # For PDF preview, needed by yazi.
|
|
73
|
+
"""
|
|
74
|
+
from machineconfig.utils.code import run_shell_script
|
|
75
|
+
run_shell_script(script)
|
|
76
|
+
elif platform.system() == "Darwin":
|
|
77
|
+
script = r"""
|
|
78
|
+
brew install --upgrade poppler || true # For PDF preview, needed by yazi.
|
|
79
|
+
"""
|
|
80
|
+
from machineconfig.utils.code import run_shell_script
|
|
81
|
+
run_shell_script(script)
|
|
82
|
+
elif platform.system() == "Windows":
|
|
83
|
+
popler_installer: InstallerData = {
|
|
84
|
+
"appName": "poppler",
|
|
85
|
+
"repoURL": "https://github.com/oschwartz10612/poppler-windows",
|
|
86
|
+
"doc": "PDF rendering library - Windows builds.",
|
|
87
|
+
"fileNamePattern": {
|
|
88
|
+
"amd64": {
|
|
89
|
+
"windows": "Release-{version}.zip",
|
|
90
|
+
"linux": None,
|
|
91
|
+
"macos": None,
|
|
92
|
+
},
|
|
93
|
+
"arm64": {
|
|
94
|
+
"windows": None,
|
|
95
|
+
"linux": None,
|
|
96
|
+
"macos": None,
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
inst_poppler = Installer(installer_data=popler_installer)
|
|
101
|
+
inst_poppler.install(version=None)
|
|
102
|
+
# assuming ouch is already installed
|
|
103
|
+
script = """
|
|
104
|
+
ya pkg add 'ndtoan96/ouch' # make ouch default previewer in yazi for compressed files
|
|
105
|
+
ya pkg add 'AnirudhG07/rich-preview' # rich-cli based previewer for yazi
|
|
106
|
+
ya pack -a 'stelcodes/bunny'
|
|
107
|
+
ya pkg add 'Tyarel8/goto-drives'
|
|
108
|
+
ya pkg add 'uhs-robert/sshfs'
|
|
109
|
+
ya pkg add 'boydaihungst/file-extra-metadata'
|
|
110
|
+
ya pkg add 'wylie102/duckdb'
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
from machineconfig.utils.code import run_shell_script
|
|
115
|
+
run_shell_script(script)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
if __name__ == "__main__":
|
|
119
|
+
pass
|
|
@@ -27,7 +27,7 @@ def main(installer_data: InstallerData, version: Optional[str]) -> None:
|
|
|
27
27
|
console.print("🪟 Installing Brave Browser on Windows using winget...", style="bold")
|
|
28
28
|
program = """
|
|
29
29
|
|
|
30
|
-
winget install --
|
|
30
|
+
winget install --no-upgrade --name "Brave" --Id "Brave.Brave" --source winget --scope user --accept-package-agreements --accept-source-agreements
|
|
31
31
|
|
|
32
32
|
"""
|
|
33
33
|
elif platform.system() in ["Linux", "Darwin"]:
|
|
@@ -70,9 +70,11 @@ winget install --Name "Brave Browser" --Id Brave.Brave --source winget --accept-
|
|
|
70
70
|
)
|
|
71
71
|
|
|
72
72
|
console.print("🔄 EXECUTING | Running Brave Browser installation...", style="bold yellow")
|
|
73
|
+
from machineconfig.utils.code import print_code, run_shell_script
|
|
73
74
|
try:
|
|
74
|
-
|
|
75
|
-
|
|
75
|
+
print_code(code=program, lexer="shell", desc="Installation Script Preview")
|
|
76
|
+
run_shell_script(program)
|
|
77
|
+
console.print("✅ Installation completed successfully!", style="bold green")
|
|
76
78
|
except subprocess.CalledProcessError as e:
|
|
77
79
|
console.print(f"❌ Installation failed with exit code {e.returncode}", style="bold red")
|
|
78
80
|
raise
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
from typing import Optional
|
|
3
|
+
import platform
|
|
4
|
+
from machineconfig.utils.schemas.installer.installer_types import InstallerData
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def main(installer_data: InstallerData, version: Optional[str]):
|
|
8
|
+
_ = installer_data, version
|
|
9
|
+
system = platform.system()
|
|
10
|
+
if system == "Windows":
|
|
11
|
+
raise NotImplementedError("Installer is not yet implemented for Windows.")
|
|
12
|
+
elif system == "Linux":
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
import machineconfig.jobs.installer as module
|
|
15
|
+
program = Path(module.__file__).parent.joinpath("linux_scripts/cloudflare_warp_cli.sh").read_text(encoding="utf-8")
|
|
16
|
+
elif system == "Darwin":
|
|
17
|
+
program = "brew install --cask cloudflare-warp"
|
|
18
|
+
else:
|
|
19
|
+
raise NotImplementedError(f"Unsupported platform: {system}")
|
|
20
|
+
import subprocess
|
|
21
|
+
subprocess.run(program, shell=True, check=True)
|
|
22
|
+
return f"Cloudflare WARP CLI installed successfully on {system}."
|
|
23
|
+
|
|
@@ -32,7 +32,10 @@ def main(installer_data: InstallerData, version: Optional[str] = None) -> None:
|
|
|
32
32
|
install_script = """brew install --cask visual-studio-code"""
|
|
33
33
|
elif platform.system() == "Windows":
|
|
34
34
|
console.print("🪟 Installing VS Code on Windows using winget...", style="bold")
|
|
35
|
-
install_script = """
|
|
35
|
+
install_script = """
|
|
36
|
+
winget install --no-upgrade --name "Microsoft Visual Studio Code" --Id "Microsoft.VisualStudioCode" --source winget --scope user --accept-package-agreements --accept-source-agreements
|
|
37
|
+
|
|
38
|
+
"""
|
|
36
39
|
else:
|
|
37
40
|
error_msg = f"Unsupported platform: {platform.system()}"
|
|
38
41
|
console.print(
|
|
@@ -25,6 +25,6 @@ installer_data: InstallerData = {
|
|
|
25
25
|
|
|
26
26
|
def main(installer_data: InstallerData, version: Optional[str]) -> None:
|
|
27
27
|
_ = version
|
|
28
|
-
from machineconfig.utils.
|
|
28
|
+
from machineconfig.utils.installer_utils.installer_runner import Installer
|
|
29
29
|
installer = Installer(installer_data)
|
|
30
30
|
installer.install(version=None)
|