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
|
@@ -1,32 +1,56 @@
|
|
|
1
1
|
|
|
2
|
-
from pathlib import Path
|
|
3
2
|
from typing import Optional, Literal, Annotated
|
|
4
3
|
import typer
|
|
5
4
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
5
|
+
|
|
6
|
+
def balance_load(layout_path: Annotated[str, typer.Argument(..., help="Path to the layout.json file")],
|
|
7
|
+
max_thresh: Annotated[int, typer.Option(..., "--max-threshold", "-m", help="Maximum tabs per layout")],
|
|
8
|
+
thresh_type: Annotated[Literal['number', 'n', 'weight', 'w'], typer.Option(..., "--threshold-type", "-t", help="Threshold type")],
|
|
9
|
+
breaking_method: Annotated[Literal['moreLayouts', 'ml', 'combineTabs', 'ct'], typer.Option(..., "--breaking-method", "-b", help="Breaking method")],
|
|
10
|
+
output_path: Annotated[Optional[str], typer.Option(..., "--output-path", "-o", help="Path to write the adjusted layout.json file")] = None):
|
|
11
11
|
"""Adjust layout file to limit max tabs per layout, etc."""
|
|
12
|
+
thresh_type_resolved: dict[str, Literal['number', 'weight']] = {
|
|
13
|
+
'number': 'number',
|
|
14
|
+
'n': 'number',
|
|
15
|
+
'weight': 'weight',
|
|
16
|
+
'w': 'weight'
|
|
17
|
+
}
|
|
18
|
+
breaking_method_resolved: dict[str, Literal['moreLayouts', 'combineTabs']] = {
|
|
19
|
+
'moreLayouts': 'moreLayouts',
|
|
20
|
+
'ml': 'moreLayouts',
|
|
21
|
+
'combineTabs': 'combineTabs',
|
|
22
|
+
'ct': 'combineTabs'
|
|
23
|
+
}
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
layout_path_obj = Path(layout_path).expanduser().absolute()
|
|
26
|
+
|
|
12
27
|
from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
|
|
13
28
|
import json
|
|
14
|
-
layoutfile: LayoutsFile = json.loads(
|
|
29
|
+
layoutfile: LayoutsFile = json.loads(layout_path_obj.read_text())
|
|
15
30
|
layout_configs = layoutfile["layouts"]
|
|
16
31
|
from machineconfig.cluster.sessions_managers.utils.load_balancer import limit_tab_num
|
|
17
|
-
new_layouts = limit_tab_num(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=thresh_type, breaking_method=breaking_method)
|
|
32
|
+
new_layouts = limit_tab_num(layout_configs=layout_configs, max_thresh=max_thresh, threshold_type=thresh_type_resolved[thresh_type], breaking_method=breaking_method_resolved[breaking_method])
|
|
18
33
|
layoutfile["layouts"] = new_layouts
|
|
19
|
-
target_file = output_path if output_path is not None else
|
|
34
|
+
target_file = Path(output_path) if output_path is not None else layout_path_obj.parent / f'{layout_path_obj.stem}_adjusted_{max_thresh}_{thresh_type}_{breaking_method}.json'
|
|
20
35
|
target_file.parent.mkdir(parents=True, exist_ok=True)
|
|
21
36
|
target_file.write_text(data=json.dumps(layoutfile, indent=4), encoding="utf-8")
|
|
22
37
|
typer.echo(f"Adjusted layout saved to {target_file}")
|
|
23
38
|
|
|
24
39
|
|
|
25
|
-
def select_layout(layouts_json_file:
|
|
40
|
+
def select_layout(layouts_json_file: str, selected_layouts_names: Optional[list[str]], select_interactively: bool,
|
|
41
|
+
subsitute_home: bool
|
|
42
|
+
) -> list["LayoutConfig"]:
|
|
26
43
|
import json
|
|
27
44
|
from machineconfig.utils.options import choose_from_options
|
|
28
45
|
from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
|
|
29
|
-
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
json_str = Path(layouts_json_file).read_text(encoding="utf-8")
|
|
48
|
+
if subsitute_home:
|
|
49
|
+
json_str = json_str.replace("~", str(Path.home())).replace("$HOME", str(Path.home()))
|
|
50
|
+
json_str = json_str.replace("""Command": "f """, """Command": "~/.config/machineconfig/scripts/wrap_mcfg fire """)
|
|
51
|
+
json_str = json_str.replace("""Command": "s """, """Command": "~/.config/machineconfig/scripts/wrap_mcfg sessions """)
|
|
52
|
+
|
|
53
|
+
layout_file: LayoutsFile = json.loads(json_str)
|
|
30
54
|
if len(layout_file["layouts"]) == 0:
|
|
31
55
|
raise ValueError(f"No layouts found in {layouts_json_file}")
|
|
32
56
|
if selected_layouts_names is None: # choose all, or interactively
|
|
@@ -34,7 +58,7 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
|
|
|
34
58
|
return layout_file["layouts"]
|
|
35
59
|
options = [layout["layoutName"] for layout in layout_file["layouts"]]
|
|
36
60
|
from machineconfig.utils.options import choose_from_options
|
|
37
|
-
selected_layouts_names = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:",
|
|
61
|
+
selected_layouts_names = choose_from_options(multi=True, options=options, prompt="Choose a layout configuration:", tv=True, msg="Choose one option")
|
|
38
62
|
print(f"Selected layout(s): {selected_layouts_names}")
|
|
39
63
|
# Extract the configs from the names:
|
|
40
64
|
layouts_chosen: list[LayoutConfig] = []
|
|
@@ -49,35 +73,36 @@ def select_layout(layouts_json_file: Path, selected_layouts_names: Optional[list
|
|
|
49
73
|
return layouts_chosen
|
|
50
74
|
|
|
51
75
|
|
|
52
|
-
def find_layout_file(layout_path: str, ) ->
|
|
53
|
-
from machineconfig.utils.
|
|
54
|
-
from machineconfig.scripts.python.helpers_fire.helpers4 import search_for_files_of_interest
|
|
76
|
+
def find_layout_file(layout_path: str, ) -> str:
|
|
77
|
+
from machineconfig.utils.path_helper import search_for_files_of_interest
|
|
55
78
|
from machineconfig.utils.options import choose_from_options
|
|
56
79
|
from machineconfig.utils.path_helper import match_file_name, sanitize_path
|
|
80
|
+
from pathlib import Path
|
|
57
81
|
path_obj = sanitize_path(layout_path)
|
|
58
82
|
if not path_obj.exists():
|
|
59
|
-
choice_file = match_file_name(sub_string=layout_path, search_root=
|
|
83
|
+
choice_file = match_file_name(sub_string=layout_path, search_root=Path.cwd(), suffixes={".json"})
|
|
60
84
|
elif path_obj.is_dir():
|
|
61
85
|
print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
|
|
62
|
-
files = search_for_files_of_interest(path_obj)
|
|
86
|
+
files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
|
|
63
87
|
print(f"🔍 Got #{len(files)} results.")
|
|
64
|
-
choice_file = choose_from_options(multi=False, options=files,
|
|
65
|
-
choice_file =
|
|
88
|
+
choice_file = choose_from_options(multi=False, options=files, tv=True, msg="Choose one option")
|
|
89
|
+
choice_file = Path(choice_file).expanduser().absolute()
|
|
66
90
|
else:
|
|
67
91
|
choice_file = path_obj
|
|
68
|
-
return choice_file
|
|
92
|
+
return str(choice_file)
|
|
69
93
|
|
|
70
94
|
|
|
71
95
|
def run(ctx: typer.Context,
|
|
72
96
|
layout_path: Annotated[Optional[str], typer.Argument(..., help="Path to the layout.json file")] = None,
|
|
73
|
-
max_tabs: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
|
|
74
|
-
max_layouts: Annotated[int, typer.Option(..., help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
|
|
75
|
-
sleep_inbetween: Annotated[float, typer.Option(..., help="Sleep time in seconds between launching layouts")] = 1.0,
|
|
97
|
+
max_tabs: Annotated[int, typer.Option(..., "--max-tabs", "-mt", help="A Sanity checker that throws an error if any layout exceeds the maximum number of tabs to launch.")] = 10,
|
|
98
|
+
max_layouts: Annotated[int, typer.Option(..., "--max-layouts", "-ml", help="A Sanity checker that throws an error if the total number of *parallel layouts exceeds this number.")] = 10,
|
|
99
|
+
sleep_inbetween: Annotated[float, typer.Option(..., "--sleep-inbetween", "-si", help="Sleep time in seconds between launching layouts")] = 1.0,
|
|
76
100
|
monitor: Annotated[bool, typer.Option(..., "--monitor", "-m", help="Monitor the layout sessions for completion")] = False,
|
|
77
101
|
parallel: Annotated[bool, typer.Option(..., "--parallel", "-p", help="Launch multiple layouts in parallel")] = False,
|
|
78
102
|
kill_upon_completion: Annotated[bool, typer.Option(..., "--kill-upon-completion", "-k", help="Kill session(s) upon completion (only relevant if monitor flag is set)")] = False,
|
|
79
103
|
choose: Annotated[Optional[str], typer.Option(..., "--choose", "-c", help="Comma separated names of layouts to be selected from the layout file passed")] = None,
|
|
80
|
-
choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-
|
|
104
|
+
choose_interactively: Annotated[bool, typer.Option(..., "--choose-interactively", "-i", help="Select layouts interactively")] = False,
|
|
105
|
+
subsitute_home: Annotated[bool, typer.Option(..., "--substitute-home", "-sh", help="Substitute ~ and $HOME in layout file with actual home directory path")] = False,
|
|
81
106
|
):
|
|
82
107
|
"""
|
|
83
108
|
Launch terminal sessions based on a layout configuration file.
|
|
@@ -86,7 +111,7 @@ def run(ctx: typer.Context,
|
|
|
86
111
|
typer.echo(ctx.get_help())
|
|
87
112
|
raise typer.Exit()
|
|
88
113
|
layout_path_resolved = find_layout_file(layout_path=layout_path)
|
|
89
|
-
layouts_selected = select_layout(layouts_json_file=layout_path_resolved, selected_layouts_names=choose.split(",") if choose else None, select_interactively=choose_interactively)
|
|
114
|
+
layouts_selected = select_layout(layouts_json_file=layout_path_resolved, selected_layouts_names=choose.split(",") if choose else None, select_interactively=choose_interactively, subsitute_home=subsitute_home)
|
|
90
115
|
|
|
91
116
|
# ============= Basic sanity checks =============
|
|
92
117
|
if parallel and len(layouts_selected) > max_layouts:
|
|
@@ -130,16 +155,60 @@ def run(ctx: typer.Context,
|
|
|
130
155
|
print(f"❌ Unsupported platform: {platform.system()}")
|
|
131
156
|
|
|
132
157
|
|
|
158
|
+
def create_template(name: Annotated[Optional[str], typer.Argument(..., help="Name of the layout template to create")] = None,
|
|
159
|
+
num_tabs: Annotated[int, typer.Option(..., "--num-tabs", "-t", help="Number of tabs to include in the template")] = 3,
|
|
160
|
+
):
|
|
161
|
+
"""Create a layout template file."""
|
|
162
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile, TabConfig
|
|
163
|
+
from pathlib import Path
|
|
164
|
+
tabs: list[TabConfig] = []
|
|
165
|
+
for i in range(1, num_tabs + 1):
|
|
166
|
+
tab: TabConfig = {
|
|
167
|
+
"tabName": f"Tab{i}",
|
|
168
|
+
"startDir": "~/" + str(Path.cwd().relative_to(Path.home())),
|
|
169
|
+
"command": "bash",
|
|
170
|
+
}
|
|
171
|
+
tabs.append(tab)
|
|
172
|
+
layouts: list[LayoutConfig] = [
|
|
173
|
+
{
|
|
174
|
+
"layoutName": f"{Path.cwd().name}Layout",
|
|
175
|
+
"layoutTabs": tabs,
|
|
176
|
+
}
|
|
177
|
+
]
|
|
178
|
+
file: LayoutsFile = {
|
|
179
|
+
"$schema": "https://bit.ly/cfglayout", # type: ignore
|
|
180
|
+
"version": "0.1",
|
|
181
|
+
"layouts": layouts
|
|
182
|
+
}
|
|
183
|
+
import json
|
|
184
|
+
json_string = json.dumps(file, indent=4)
|
|
185
|
+
if name is None:
|
|
186
|
+
layout_path = Path.cwd() / "layout.json"
|
|
187
|
+
else:
|
|
188
|
+
layout_path = Path.cwd() / (name.replace(".json", "") + ".json")
|
|
189
|
+
layout_path.parent.mkdir(parents=True, exist_ok=True)
|
|
190
|
+
if layout_path.exists():
|
|
191
|
+
print(f"❌ File {layout_path} already exists. Aborting to avoid overwriting.")
|
|
192
|
+
return
|
|
193
|
+
layout_path.write_text(json_string, encoding="utf-8")
|
|
194
|
+
print(f"✅ Created layout template at {layout_path}")
|
|
195
|
+
|
|
196
|
+
|
|
133
197
|
def get_app():
|
|
134
198
|
layouts_app = typer.Typer(help="Layouts management subcommands", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
135
199
|
from machineconfig.scripts.python.helpers_sessions.sessions_multiprocess import create_from_function
|
|
200
|
+
|
|
136
201
|
layouts_app.command("create-from-function", no_args_is_help=True, help="[c] Create a layout from a function")(create_from_function)
|
|
137
202
|
layouts_app.command("c", no_args_is_help=True, help="Create a layout from a function", hidden=True)(create_from_function)
|
|
203
|
+
|
|
138
204
|
layouts_app.command("run", no_args_is_help=True, help="[r] Run the selected layout(s)")(run)
|
|
139
205
|
layouts_app.command("r", no_args_is_help=True, help="Run the selected layout(s)", hidden=True)(run)
|
|
206
|
+
|
|
140
207
|
layouts_app.command("balance-load", no_args_is_help=True, help="[b] Balance the load across sessions")(balance_load)
|
|
141
208
|
layouts_app.command("b", no_args_is_help=True, help="Balance the load across sessions", hidden=True)(balance_load)
|
|
142
209
|
|
|
210
|
+
layouts_app.command("create-template", no_args_is_help=False, help="[t] Create a layout template file")(create_template)
|
|
211
|
+
layouts_app.command("t", no_args_is_help=False, help="Create a layout template file", hidden=True)(create_template)
|
|
143
212
|
return layouts_app
|
|
144
213
|
|
|
145
214
|
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
|
|
2
|
+
import typer
|
|
3
|
+
from typing import Annotated, Optional
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def strip_ansi_codes(text: str) -> str:
|
|
7
|
+
"""Remove ANSI color codes from text."""
|
|
8
|
+
import re
|
|
9
|
+
return re.sub(r'\x1b\[[0-9;]*[a-zA-Z]', '', text)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def choose_zellij_session(
|
|
13
|
+
name: Annotated[Optional[str], typer.Argument(help="Name of the Zellij session to attach to. If not provided, a list will be shown to choose from.")] = None,
|
|
14
|
+
new_session: Annotated[bool, typer.Option("--new-session", "-n", help="Create a new Zellij session instead of attaching to an existing one.", show_default=True)] = False,
|
|
15
|
+
kill_all: Annotated[bool, typer.Option("--kill-all", "-k", help="Kill all existing Zellij sessions before creating a new one.", show_default=True)] = False):
|
|
16
|
+
if name is not None:
|
|
17
|
+
result = f"zellij attach {name}"
|
|
18
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
19
|
+
exit_then_run_shell_script(result, strict=True)
|
|
20
|
+
|
|
21
|
+
if new_session:
|
|
22
|
+
cmd = """
|
|
23
|
+
zellij --layout st2
|
|
24
|
+
"""
|
|
25
|
+
if kill_all:
|
|
26
|
+
cmd = f"""zellij kill-sessions
|
|
27
|
+
{cmd}"""
|
|
28
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
29
|
+
exit_then_run_shell_script(script=cmd, strict=True)
|
|
30
|
+
typer.Exit()
|
|
31
|
+
return
|
|
32
|
+
cmd = "zellij list-sessions"
|
|
33
|
+
import subprocess
|
|
34
|
+
sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
|
|
35
|
+
# filter out empty lines and keep raw lines (they contain creation info)
|
|
36
|
+
sessions = [s for s in sessions if s.strip()]
|
|
37
|
+
sessions.sort(key=lambda s: "EXITED" in s)
|
|
38
|
+
|
|
39
|
+
if "current" in sessions:
|
|
40
|
+
print("Already in a Zellij session, avoiding nesting and exiting.")
|
|
41
|
+
raise typer.Exit()
|
|
42
|
+
if len(sessions) == 0:
|
|
43
|
+
print("No Zellij sessions found, creating a new one.")
|
|
44
|
+
result = """zellij --layout st2"""
|
|
45
|
+
elif len(sessions) == 1:
|
|
46
|
+
session_name = sessions[0].split(" [Created")[0]
|
|
47
|
+
print(f"Only one Zellij session found: {session_name}, attaching to it.")
|
|
48
|
+
result = f"zellij attach {session_name}"
|
|
49
|
+
else:
|
|
50
|
+
from machineconfig.utils.options import choose_from_options
|
|
51
|
+
# Artificially inject a "NEW SESSION" option so the user can create one from the list
|
|
52
|
+
NEW_SESSION_LABEL = "NEW SESSION"
|
|
53
|
+
options = [NEW_SESSION_LABEL] + sessions
|
|
54
|
+
session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
|
|
55
|
+
if session_name == NEW_SESSION_LABEL:
|
|
56
|
+
cmd = "zellij --layout st2"
|
|
57
|
+
if kill_all:
|
|
58
|
+
cmd = f"zellij kill-sessions\n{cmd}"
|
|
59
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
60
|
+
exit_then_run_shell_script(cmd, strict=True)
|
|
61
|
+
raise typer.Exit()
|
|
62
|
+
session_name = session_name.split(" [Created")[0]
|
|
63
|
+
result = f"zellij attach {session_name}"
|
|
64
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
65
|
+
exit_then_run_shell_script(result, strict=True)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def get_session_tabs() -> list[tuple[str, str]]:
|
|
70
|
+
cmd = "zellij list-sessions"
|
|
71
|
+
import subprocess
|
|
72
|
+
sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
|
|
73
|
+
sessions = [strip_ansi_codes(s) for s in sessions]
|
|
74
|
+
active_sessions = [s for s in sessions if "EXITED" not in s]
|
|
75
|
+
result: list[tuple[str, str]] = []
|
|
76
|
+
for session_line in active_sessions:
|
|
77
|
+
session_name = session_line.split(" [Created")[0].strip()
|
|
78
|
+
# Query tab names for the session
|
|
79
|
+
tab_cmd = f"zellij --session {session_name} action query-tab-names"
|
|
80
|
+
try:
|
|
81
|
+
tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
|
|
82
|
+
for tab in tabs:
|
|
83
|
+
if tab.strip():
|
|
84
|
+
result.append((session_name, tab.strip()))
|
|
85
|
+
except subprocess.CalledProcessError:
|
|
86
|
+
# Skip if query fails
|
|
87
|
+
continue
|
|
88
|
+
print(result)
|
|
89
|
+
return result
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def start_wt(layout_name: Annotated[str, typer.Argument(help="Layout name to start.")]):
|
|
93
|
+
from pathlib import Path
|
|
94
|
+
layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
|
|
95
|
+
if not layouts_file.exists():
|
|
96
|
+
typer.echo(f"❌ Layouts file not found: {layouts_file}")
|
|
97
|
+
# available
|
|
98
|
+
raise typer.Exit(code=1)
|
|
99
|
+
import json
|
|
100
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
|
|
101
|
+
layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
|
|
102
|
+
chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
|
|
103
|
+
if not chosen_layout:
|
|
104
|
+
typer.echo(f"❌ Layout '{layout_name}' not found in layouts file.")
|
|
105
|
+
available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
|
|
106
|
+
typer.echo(f"Available layouts: {', '.join(available_layouts)}")
|
|
107
|
+
raise typer.Exit(code=1)
|
|
108
|
+
from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
|
|
109
|
+
run_wt_layout(layout_config=chosen_layout)
|
|
110
|
+
# cmd = f'powershell -ExecutionPolicy Bypass -File "./{layout_name}_layout.ps1"'
|
|
111
|
+
# from machineconfig.utils.code import exit_then_run_shell_script
|
|
112
|
+
# exit_then_run_shell_script(cmd, strict=True)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_app():
|
|
116
|
+
app = typer.Typer(help="🖥️ Terminal utilities", no_args_is_help=True, add_help_option=False)
|
|
117
|
+
app.command(name="attach-to-zellij", no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
|
|
118
|
+
app.command(name="z", hidden=True, no_args_is_help=False, help="[z] Choose a Zellij session to attach to")(choose_zellij_session)
|
|
119
|
+
|
|
120
|
+
app.command(name="start-wt", no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
|
|
121
|
+
app.command(name="w", hidden=True, no_args_is_help=True, help="[w] Start a Windows Terminal layout by name.")(start_wt)
|
|
122
|
+
|
|
123
|
+
app.command(name="get-session-tabs", no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
|
|
124
|
+
app.command(name="zt", hidden=True, no_args_is_help=False, help="[zt] Get all Zellij session tabs.")(get_session_tabs)
|
|
125
|
+
return app
|
|
126
|
+
|
|
127
|
+
def main():
|
|
128
|
+
app = get_app()
|
|
129
|
+
app()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
if __name__ == "__main__":
|
|
133
|
+
main()
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
from machineconfig.scripts.python.
|
|
1
|
+
from machineconfig.scripts.python.helpers_devops.cli_utils import merge_pdfs, compress_pdf
|
|
2
|
+
from machineconfig.scripts.python.helpers_utils.path import edit_file_with_hx, get_machine_specs, init_project, tui_env
|
|
3
|
+
from machineconfig.scripts.python.helpers_utils.download import download
|
|
4
4
|
import typer
|
|
5
|
-
from typing import Annotated
|
|
6
|
-
from pathlib import Path
|
|
5
|
+
from typing import Annotated
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
def kill_process(
|
|
@@ -21,41 +20,40 @@ def kill_process(
|
|
|
21
20
|
# )
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
def
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
r_dir = Path(repo_dir).resolve()
|
|
29
|
-
if not r_dir.exists() or not r_dir.is_dir() or not (r_dir / "pyproject.toml").exists():
|
|
30
|
-
typer.echo(f"❌ The provided repo directory `{r_dir}` is not valid or does not contain a `pyproject.toml` file.")
|
|
31
|
-
raise typer.Exit(code=1)
|
|
32
|
-
command = f"""
|
|
33
|
-
cd "{r_dir}" || exit 1
|
|
34
|
-
uv add nbformat ipdb ipykernel ipython pylint pyright mypy pyrefly ty pytest
|
|
35
|
-
"""
|
|
36
|
-
from machineconfig.utils.code import run_shell_script
|
|
37
|
-
typer.echo(f"➡️ Installing dev packages in repo at `{r_dir}`...")
|
|
38
|
-
run_shell_script(command)
|
|
39
|
-
typer.echo(f"✅ Dev packages installed successfully in repo at `{r_dir}`.")
|
|
40
|
-
# TODO: see upgrade packages.
|
|
41
|
-
|
|
23
|
+
def upgrade_packages():
|
|
24
|
+
from machineconfig.utils.upgrade_packages import generate_uv_add_commands
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
generate_uv_add_commands(pyproject_path=Path.cwd() / "pyproject.toml", output_path=Path.cwd() / "pyproject_init.sh")
|
|
42
27
|
|
|
43
28
|
|
|
44
29
|
def get_app() -> typer.Typer:
|
|
45
30
|
app = typer.Typer(help="🛠️ utilities operations", no_args_is_help=True, add_help_option=False, add_completion=False)
|
|
46
|
-
app.command(name="kill-process", no_args_is_help=False, help="[k] Choose a process to kill")(kill_process)
|
|
31
|
+
app.command(name="kill-process", no_args_is_help=False, help="⚔️ [k] Choose a process to kill")(kill_process)
|
|
47
32
|
app.command(name="k", no_args_is_help=False, help="Choose a process to kill", hidden=True)(kill_process)
|
|
48
|
-
|
|
33
|
+
|
|
34
|
+
app.command("environment", no_args_is_help=False, help="📚 [v] NAVIGATE ENV/PATH variable with TUI")(tui_env)
|
|
35
|
+
app.command("v", no_args_is_help=False, help="NAVIGATE ENV/PATH variable with TUI", hidden=True)(tui_env)
|
|
36
|
+
|
|
37
|
+
app.command(name="upgrade-packages", no_args_is_help=False, help="⬆️ [up] Upgrade project dependencies.")(upgrade_packages)
|
|
38
|
+
app.command(name="up", no_args_is_help=False, hidden=True)(upgrade_packages)
|
|
39
|
+
|
|
40
|
+
app.command(name="download", no_args_is_help=True, help="⬇️ [d] Download a file from a URL and optionally decompress it.")(download)
|
|
49
41
|
app.command(name="d", no_args_is_help=True, hidden=True)(download)
|
|
50
|
-
app.command(name="get-machine-specs", no_args_is_help=False, help="[g] Get machine specifications.")(get_machine_specs)
|
|
42
|
+
app.command(name="get-machine-specs", no_args_is_help=False, help="💻 [g] Get machine specifications.")(get_machine_specs)
|
|
51
43
|
app.command(name="g", no_args_is_help=False, hidden=True)(get_machine_specs)
|
|
52
|
-
app.command(name="init-project", no_args_is_help=False, help="[i] Initialize a project with a uv virtual environment and install dev packages.")(init_project)
|
|
44
|
+
app.command(name="init-project", no_args_is_help=False, help="🚀 [i] Initialize a project with a uv virtual environment and install dev packages.")(init_project)
|
|
53
45
|
app.command(name="i", no_args_is_help=False, hidden=True)(init_project)
|
|
46
|
+
app.command(name="edit", no_args_is_help=False, help="✏️ [e] Open a file in the default editor.")(edit_file_with_hx)
|
|
47
|
+
app.command(name="e", no_args_is_help=False, hidden=True)(edit_file_with_hx)
|
|
54
48
|
|
|
55
|
-
app.command(name="pdf-merge", no_args_is_help=True, help="[pm] Merge two PDF files into one.")(merge_pdfs)
|
|
49
|
+
app.command(name="pdf-merge", no_args_is_help=True, help="📄 [pm] Merge two PDF files into one.")(merge_pdfs)
|
|
56
50
|
app.command(name="pm", no_args_is_help=True, hidden=True)(merge_pdfs)
|
|
57
|
-
app.command(name="pdf-compress", no_args_is_help=True, help="[pc] Compress a PDF file.")(compress_pdf)
|
|
51
|
+
app.command(name="pdf-compress", no_args_is_help=True, help="📦 [pc] Compress a PDF file.")(compress_pdf)
|
|
58
52
|
app.command(name="pc", no_args_is_help=True, hidden=True)(compress_pdf)
|
|
53
|
+
|
|
54
|
+
# app.command(name="copy", no_args_is_help=True, help="[c] Copy files or directories.")(copy)
|
|
55
|
+
# app.command(name="c", no_args_is_help=True, hidden=True)(copy)
|
|
56
|
+
|
|
59
57
|
return app
|
|
60
58
|
|
|
61
59
|
# def func():
|
|
@@ -63,4 +61,4 @@ def get_app() -> typer.Typer:
|
|
|
63
61
|
|
|
64
62
|
def main():
|
|
65
63
|
app = get_app()
|
|
66
|
-
app()
|
|
64
|
+
app()
|
|
@@ -7,7 +7,7 @@ $user = ''
|
|
|
7
7
|
$sharePath = ''
|
|
8
8
|
$driveLetter = ''
|
|
9
9
|
|
|
10
|
-
uv run --python 3.14 --with "machineconfig>=
|
|
10
|
+
uv run --python 3.14 --with "machineconfig>=7.98" python -m machineconfig.scripts.python.mount_ssh
|
|
11
11
|
|
|
12
12
|
net use T: \\sshfs.kr\$user@$host.local
|
|
13
13
|
# this worked: net use T: \\sshfs\alex@alex-p51s-5.local
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
function wrap_in_shell_script {
|
|
2
|
+
param(
|
|
3
|
+
[Parameter(Mandatory=$true)]
|
|
4
|
+
[string]$Command,
|
|
5
|
+
|
|
6
|
+
[Parameter(ValueFromRemainingArguments=$true)]
|
|
7
|
+
[string[]]$Arguments
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
# Generate a random name (based on current timestamp hashed with SHA256)
|
|
11
|
+
# Compute SHA256 of the timestamp string (don't pipe the string to Get-FileHash
|
|
12
|
+
# because that attempts to treat the input as a path). Take the first 16 hex
|
|
13
|
+
# chars as the random name.
|
|
14
|
+
$ts = Get-Date -Format o
|
|
15
|
+
try {
|
|
16
|
+
$sha = [System.Security.Cryptography.SHA256]::Create()
|
|
17
|
+
$bytes = [System.Text.Encoding]::UTF8.GetBytes($ts)
|
|
18
|
+
$hashBytes = $sha.ComputeHash($bytes)
|
|
19
|
+
$hash = [System.BitConverter]::ToString($hashBytes).Replace("-", "").ToLower()
|
|
20
|
+
$randomName = $hash.Substring(0, 16)
|
|
21
|
+
} finally {
|
|
22
|
+
if ($sha) { $sha.Dispose() }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
# Define the output path
|
|
26
|
+
$env:OP_PROGRAM_PATH = "$HOME/tmp_results/tmp_scripts/machineconfig/${randomName}.ps1"
|
|
27
|
+
|
|
28
|
+
# Run the specified command with its arguments
|
|
29
|
+
& $Command @Arguments
|
|
30
|
+
|
|
31
|
+
# Check if the file exists
|
|
32
|
+
if (Test-Path $env:OP_PROGRAM_PATH) {
|
|
33
|
+
Write-Host "🚀 Taking over from python script @ $env:OP_PROGRAM_PATH"
|
|
34
|
+
try {
|
|
35
|
+
bat --style=full --theme=OneHalfDark --paging=never "$env:OP_PROGRAM_PATH"
|
|
36
|
+
} catch {
|
|
37
|
+
# Write-Host "⚠️ Warning: Failed to display script content with 'bat'. Proceeding to execute the script."
|
|
38
|
+
Write-Host " "
|
|
39
|
+
}
|
|
40
|
+
& $env:OP_PROGRAM_PATH
|
|
41
|
+
# Write-Host "✅ '$Command' execution completed."
|
|
42
|
+
|
|
43
|
+
} else {
|
|
44
|
+
# Write-Host "✅ '$Command' execution completed."
|
|
45
|
+
Write-Host " "
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Clean up the temporary environment variable so it doesn't leak to other processes/sessions
|
|
49
|
+
try {
|
|
50
|
+
Remove-Item Env:\OP_PROGRAM_PATH -ErrorAction SilentlyContinue
|
|
51
|
+
} catch {
|
|
52
|
+
# best-effort cleanup; ignore any errors
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Also explicitly clear the variable in the current process
|
|
56
|
+
$env:OP_PROGRAM_PATH = $null
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
# Call the function with any arguments passed to the script
|
|
60
|
+
if ($args.Count -gt 0) {
|
|
61
|
+
wrap_in_shell_script @args
|
|
62
|
+
}
|
|
63
|
+
|
|
@@ -25,3 +25,19 @@ enable = true
|
|
|
25
25
|
max-wrap = 25 # increase value to reduce forced mid-word wrapping
|
|
26
26
|
max-indent-retain = 0
|
|
27
27
|
wrap-indicator = "" # set wrap-indicator to "" to hide it
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# https://yazi-rs.github.io/docs/tips#helix-with-zellij
|
|
31
|
+
# ~/.config/helix/config.toml
|
|
32
|
+
[keys.normal]
|
|
33
|
+
C-y = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh open %{buffer_name}"
|
|
34
|
+
|
|
35
|
+
# ~/.config/helix/config.toml
|
|
36
|
+
|
|
37
|
+
# [keys.normal.C-y]
|
|
38
|
+
# Open the file(s) in the current window
|
|
39
|
+
# y = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh open %{buffer_name}"
|
|
40
|
+
# Open the file(s) in a vertical split
|
|
41
|
+
# v = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh vsplit %{buffer_name}"
|
|
42
|
+
# Open the file(s) in a horizontal split
|
|
43
|
+
# h = ":sh zellij run -n Yazi -c -f -x 10%% -y 10%% --width 80%% --height 80%% -- bash ~/.config/helix/yazi-picker.sh hsplit %{buffer_name}"
|
|
@@ -1,13 +1,22 @@
|
|
|
1
|
-
# adopted from https://github.com/helix-editor/helix/wiki/
|
|
1
|
+
# adopted from https://github.com/helix-editor/helix/wiki/Language-Server-Configurations
|
|
2
2
|
# adopted from https://github.com/helix-editor/helix/discussions/6623
|
|
3
|
-
# You will need:
|
|
3
|
+
# You will need: uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp
|
|
4
4
|
|
|
5
5
|
[[language]]
|
|
6
6
|
name = "python"
|
|
7
|
-
language-servers = [ "pyright", "ruff" ]
|
|
7
|
+
language-servers = ["pylsp", "pyright", "ruff", "pyrefly"]
|
|
8
|
+
|
|
9
|
+
[language-server.pyrefly]
|
|
10
|
+
command = "pyrefly"
|
|
11
|
+
args = [ "lsp" ]
|
|
12
|
+
|
|
13
|
+
[language-server.pylsp.config.pylsp]
|
|
14
|
+
plugins.pylsp_mypy.enabled = true
|
|
15
|
+
plugins.pylsp_mypy.live_mode = true
|
|
16
|
+
|
|
8
17
|
|
|
9
18
|
[language-server.pyright.config.python.analysis]
|
|
10
|
-
typeCheckingMode = "
|
|
19
|
+
typeCheckingMode = "strict"
|
|
11
20
|
|
|
12
21
|
[language-server.ruff]
|
|
13
22
|
command = "ruff-lsp"
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
paths=$(yazi "$2" --chooser-file=/dev/stdout | while read -r; do printf "%q " "$REPLY"; done)
|
|
4
|
+
|
|
5
|
+
if [[ -n "$paths" ]]; then
|
|
6
|
+
zellij action toggle-floating-panes
|
|
7
|
+
zellij action write 27 # send <Escape> key
|
|
8
|
+
zellij action write-chars ":$1 $paths"
|
|
9
|
+
zellij action write 13 # send <Enter> key
|
|
10
|
+
else
|
|
11
|
+
zellij action toggle-floating-panes
|
|
12
|
+
fi
|
|
@@ -20,8 +20,9 @@ case "$file" in
|
|
|
20
20
|
echo "x: $x, y: $y, width: $width, height: $height"
|
|
21
21
|
|
|
22
22
|
if [ -n "$x" ]; then
|
|
23
|
-
echo "📐 Dimensions provided by caller, passing to viu"
|
|
24
|
-
viu "$file" -x "$x" -y "$y" -w "$width" -h "$height"
|
|
23
|
+
# echo "📐 Dimensions provided by caller, passing to viu"
|
|
24
|
+
# viu "$file" -x "$x" -y "$y" -w "$width" -h "$height"
|
|
25
|
+
# chafa --fit-width -f sixel "$file"
|
|
25
26
|
echo "✅ Finished viu"
|
|
26
27
|
chafa "$file"
|
|
27
28
|
echo "✅ Finished chafa"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
function lfcd {
|
|
19
19
|
$tmp = [System.IO.Path]::GetTempFileName()
|
|
20
|
-
|
|
20
|
+
& "$env:USERPROFILE\AppData\Local\Microsoft\WindowsApps\lf.exe" -last-dir-path="$tmp" $args
|
|
21
21
|
if (Test-Path -PathType Leaf "$tmp")
|
|
22
22
|
{
|
|
23
23
|
$dir = Get-Content "$tmp"
|
|
@@ -51,19 +51,19 @@ map x
|
|
|
51
51
|
map c
|
|
52
52
|
map v
|
|
53
53
|
map r
|
|
54
|
-
map D $diskonaut $
|
|
55
|
-
map K $kondo $
|
|
54
|
+
map D $diskonaut $f
|
|
55
|
+
map K $kondo $f
|
|
56
56
|
map r reload
|
|
57
57
|
|
|
58
58
|
|
|
59
59
|
# e edit
|
|
60
60
|
map e # edit modal key.
|
|
61
|
-
map en $nano $
|
|
62
|
-
map el $pwsh -File $env:USERPROFILE/.local/bin/lvim.ps1 -- $
|
|
63
|
-
map ev $nvim $
|
|
64
|
-
map ec $code $
|
|
61
|
+
map en $nano $f
|
|
62
|
+
map el $pwsh -File $env:USERPROFILE/.local/bin/lvim.ps1 -- $f
|
|
63
|
+
map ev $nvim $f
|
|
64
|
+
map ec $code $f
|
|
65
65
|
map ep $& 'C:\Program Files (x86)\JetBrains\PyCharm Community Edition 2022.2\bin\pycharm.exe' $f
|
|
66
|
-
map o $start $
|
|
66
|
+
map o $start $f
|
|
67
67
|
map <enter> open
|
|
68
68
|
|
|
69
69
|
|
|
@@ -73,27 +73,25 @@ map ww $powershell
|
|
|
73
73
|
map wp $pwsh
|
|
74
74
|
map wc $croshell.ps1
|
|
75
75
|
map wm $cmd
|
|
76
|
-
map i $~/.config/machineconfig/settings/lf/windows/previewer.ps1 $
|
|
77
|
-
map R $powershell $env:USERPROFILE/scripts/croshell.ps1 -r $
|
|
76
|
+
map i $~/.config/machineconfig/settings/lf/windows/previewer.ps1 $f
|
|
77
|
+
map R $powershell $env:USERPROFILE/scripts/croshell.ps1 -r $f
|
|
78
78
|
|
|
79
79
|
# o file/folder Operations
|
|
80
80
|
map o
|
|
81
81
|
map od cut
|
|
82
82
|
map op paste
|
|
83
83
|
map oy copy
|
|
84
|
-
map oc $Set-Clipboard -Value $
|
|
84
|
+
map oc $Set-Clipboard -Value $f
|
|
85
85
|
map c clear
|
|
86
86
|
map or rename
|
|
87
|
-
map <delete>
|
|
88
|
-
|
|
89
|
-
echo 'FINISHED DELETEING'
|
|
90
|
-
}}
|
|
87
|
+
map <delete> delete
|
|
88
|
+
map <del> delete
|
|
91
89
|
map of reload
|
|
92
90
|
map os mark-save
|
|
93
91
|
map ol mark-load
|
|
94
92
|
map oR mark-remove
|
|
95
|
-
map oD !ouch d $
|
|
96
|
-
map oC !ouch c $
|
|
93
|
+
map oD !ouch d $f
|
|
94
|
+
map oC !ouch c $f '$f'.zip
|
|
97
95
|
|
|
98
96
|
# j jump
|
|
99
97
|
map j
|