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,80 +1,7 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
import typer
|
|
4
|
-
from typing import Annotated,
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def download(
|
|
9
|
-
url: Annotated[Optional[str], typer.Argument(..., help="The URL to download the file from.")] = None,
|
|
10
|
-
decompress: Annotated[bool, typer.Option("--decompress", "-d", help="Decompress the file if it's an archive.")] = False,
|
|
11
|
-
output: Annotated[Optional[str], typer.Option("--output", "-o", help="The output file path.")] = None,
|
|
12
|
-
) -> None:
|
|
13
|
-
if url is None:
|
|
14
|
-
typer.echo("❌ Error: URL is required.", err=True)
|
|
15
|
-
raise typer.Exit(code=1)
|
|
16
|
-
typer.echo(f"📥 Downloading from: {url}")
|
|
17
|
-
download_path = Path(output) if output else Path(url.split("/")[-1])
|
|
18
|
-
import requests
|
|
19
|
-
import subprocess
|
|
20
|
-
try:
|
|
21
|
-
response = requests.get(url, allow_redirects=True, stream=True, timeout=60)
|
|
22
|
-
response.raise_for_status()
|
|
23
|
-
|
|
24
|
-
total_size = int(response.headers.get('content-length', 0))
|
|
25
|
-
|
|
26
|
-
with open(download_path, 'wb') as f:
|
|
27
|
-
if total_size == 0:
|
|
28
|
-
f.write(response.content)
|
|
29
|
-
else:
|
|
30
|
-
downloaded = 0
|
|
31
|
-
chunk_size = 8192
|
|
32
|
-
for chunk in response.iter_content(chunk_size=chunk_size):
|
|
33
|
-
if chunk:
|
|
34
|
-
f.write(chunk)
|
|
35
|
-
downloaded += len(chunk)
|
|
36
|
-
progress = (downloaded / total_size) * 100
|
|
37
|
-
typer.echo(f"\r⏬ Progress: {progress:.1f}% ({downloaded}/{total_size} bytes)", nl=False)
|
|
38
|
-
typer.echo()
|
|
39
|
-
|
|
40
|
-
typer.echo(f"✅ Downloaded to: {download_path}")
|
|
41
|
-
except requests.exceptions.RequestException as e:
|
|
42
|
-
typer.echo(f"❌ Download failed: {e}", err=True)
|
|
43
|
-
raise typer.Exit(code=1)
|
|
44
|
-
except OSError as e:
|
|
45
|
-
typer.echo(f"❌ File write error: {e}", err=True)
|
|
46
|
-
raise typer.Exit(code=1)
|
|
47
|
-
|
|
48
|
-
if decompress:
|
|
49
|
-
typer.echo(f"📦 Decompressing: {download_path}")
|
|
50
|
-
|
|
51
|
-
base_name = download_path.name
|
|
52
|
-
parts = base_name.split('.')
|
|
53
|
-
base_name = parts[0] if parts else download_path.stem
|
|
54
|
-
|
|
55
|
-
extract_dir = download_path.parent / base_name
|
|
56
|
-
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
57
|
-
|
|
58
|
-
try:
|
|
59
|
-
subprocess.run(
|
|
60
|
-
["ouch", "decompress", str(download_path), "--dir", str(extract_dir)],
|
|
61
|
-
check=True,
|
|
62
|
-
capture_output=True,
|
|
63
|
-
text=True
|
|
64
|
-
)
|
|
65
|
-
typer.echo(f"✅ Decompressed to: {extract_dir}")
|
|
66
|
-
|
|
67
|
-
if download_path.exists():
|
|
68
|
-
download_path.unlink()
|
|
69
|
-
typer.echo(f"🗑️ Removed archive: {download_path}")
|
|
70
|
-
|
|
71
|
-
except subprocess.CalledProcessError as e:
|
|
72
|
-
typer.echo(f"❌ Decompression failed: {e.stderr}", err=True)
|
|
73
|
-
raise typer.Exit(code=1)
|
|
74
|
-
except FileNotFoundError:
|
|
75
|
-
typer.echo("❌ Error: ouch command not found. Please install ouch.", err=True)
|
|
76
|
-
typer.echo("💡 Install with: cargo install ouch", err=True)
|
|
77
|
-
raise typer.Exit(code=1)
|
|
4
|
+
from typing import Annotated, Optional
|
|
78
5
|
|
|
79
6
|
|
|
80
7
|
def merge_pdfs(
|
|
@@ -109,7 +36,8 @@ def merge_pdfs(
|
|
|
109
36
|
writer.write(output_path)
|
|
110
37
|
print(f"✅ Merged PDF saved to: {output_path}")
|
|
111
38
|
from machineconfig.utils.meta import lambda_to_python_script
|
|
112
|
-
code = lambda_to_python_script(lambda : merge_pdfs_internal(pdfs=pdfs, output=output, compress=compress),
|
|
39
|
+
code = lambda_to_python_script(lambda : merge_pdfs_internal(pdfs=pdfs, output=output, compress=compress),
|
|
40
|
+
in_global=True, import_module=False)
|
|
113
41
|
from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
|
|
114
42
|
uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pypdf"], uv_project_dir=None)
|
|
115
43
|
run_shell_script(uv_command)
|
|
@@ -166,56 +94,3 @@ def compress_pdf(
|
|
|
166
94
|
uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pymupdf"], uv_project_dir=None)
|
|
167
95
|
run_shell_script(uv_command)
|
|
168
96
|
|
|
169
|
-
|
|
170
|
-
class MachineSpecs(TypedDict):
|
|
171
|
-
system: str
|
|
172
|
-
distro: str
|
|
173
|
-
home_dir: str
|
|
174
|
-
def get_machine_specs() -> MachineSpecs:
|
|
175
|
-
"""Write print and return the local machine specs."""
|
|
176
|
-
import platform
|
|
177
|
-
UV_RUN_CMD = "$HOME/.local/bin/uv run" if platform.system() != "Windows" else """& "$env:USERPROFILE/.local/bin/uv" run"""
|
|
178
|
-
command = f"""{UV_RUN_CMD} --with distro python -c "import distro; print(distro.name(pretty=True))" """
|
|
179
|
-
import subprocess
|
|
180
|
-
distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
|
|
181
|
-
specs: MachineSpecs = {
|
|
182
|
-
"system": platform.system(),
|
|
183
|
-
"distro": distro,
|
|
184
|
-
"home_dir": str(Path.home()),
|
|
185
|
-
}
|
|
186
|
-
print(specs)
|
|
187
|
-
from machineconfig.utils.source_of_truth import CONFIG_ROOT
|
|
188
|
-
path = CONFIG_ROOT.joinpath("machine_specs.json")
|
|
189
|
-
CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
|
|
190
|
-
import json
|
|
191
|
-
path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
|
|
192
|
-
return specs
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
def init_project(python: Annotated[Literal["3.13", "3.14"], typer.Option("--python", "-p", help="Python version for the uv virtual environment.")]= "3.13") -> None:
|
|
196
|
-
_ = python
|
|
197
|
-
repo_root = Path.cwd()
|
|
198
|
-
if not (repo_root / "pyproject.toml").exists():
|
|
199
|
-
typer.echo("❌ Error: pyproject.toml not found.", err=True)
|
|
200
|
-
raise typer.Exit(code=1)
|
|
201
|
-
print(f"Adding group `plot` with common data science and plotting packages...")
|
|
202
|
-
script = """
|
|
203
|
-
uv add --group plot \
|
|
204
|
-
# Data & computation
|
|
205
|
-
numpy pandas polars duckdb-engine python-magic \
|
|
206
|
-
# Plotting / visualization
|
|
207
|
-
matplotlib plotly kaleido \
|
|
208
|
-
# Notebooks / interactive
|
|
209
|
-
ipython ipykernel jupyterlab nbformat marimo \
|
|
210
|
-
# Code analysis / type checking / linting
|
|
211
|
-
mypy pyright ruff pylint pyrefly \
|
|
212
|
-
# Packaging / build / dev
|
|
213
|
-
cleanpy \
|
|
214
|
-
# CLI / debugging / utilities
|
|
215
|
-
ipdb pudb \
|
|
216
|
-
# Type hints for packages
|
|
217
|
-
types-python-dateutil types-pyyaml types-requests types-tqdm \
|
|
218
|
-
types-mysqlclient types-paramiko types-pytz types-sqlalchemy types-toml types-urllib3 \
|
|
219
|
-
"""
|
|
220
|
-
from machineconfig.utils.code import run_shell_script
|
|
221
|
-
run_shell_script(script)
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
# import subprocess
|
|
4
4
|
from machineconfig.utils.io import read_ini
|
|
5
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
6
5
|
from machineconfig.utils.source_of_truth import LIBRARY_ROOT, DEFAULTS_PATH
|
|
7
6
|
from machineconfig.utils.code import print_code
|
|
8
7
|
from machineconfig.utils.options import choose_cloud_interactively, choose_from_options
|
|
@@ -11,6 +10,7 @@ from platform import system
|
|
|
11
10
|
from typing import Any, Literal, Optional
|
|
12
11
|
from rich.console import Console
|
|
13
12
|
from rich.panel import Panel
|
|
13
|
+
from pathlib import Path
|
|
14
14
|
import tomllib
|
|
15
15
|
|
|
16
16
|
|
|
@@ -56,13 +56,13 @@ def main_backup_retrieve(direction: OPTIONS, which: Optional[str], cloud: Option
|
|
|
56
56
|
flags += "e" if item["encrypt"] == "True" else ""
|
|
57
57
|
flags += "r" if item["rel2home"] == "True" else ""
|
|
58
58
|
flags += "o" if system().lower() in item_name else ""
|
|
59
|
-
console.print(Panel(f"📦 PROCESSING: {item_name}\n📂 Path: {
|
|
59
|
+
console.print(Panel(f"📦 PROCESSING: {item_name}\n📂 Path: {Path(item['path']).as_posix()}\n🏳️ Flags: {flags or 'None'}", title=f"[bold blue]Processing Item: {item_name}[/bold blue]", border_style="blue"))
|
|
60
60
|
if flags:
|
|
61
61
|
flags = "-" + flags
|
|
62
62
|
if direction == "BACKUP":
|
|
63
|
-
program += f"""\ncloud_copy "{
|
|
63
|
+
program += f"""\ncloud_copy "{Path(item["path"]).as_posix()}" $cloud {flags}\n"""
|
|
64
64
|
elif direction == "RETRIEVE":
|
|
65
|
-
program += f"""\ncloud_copy $cloud "{
|
|
65
|
+
program += f"""\ncloud_copy $cloud "{Path(item["path"]).as_posix()}" {flags}\n"""
|
|
66
66
|
else:
|
|
67
67
|
console.print(Panel('❌ ERROR: INVALID DIRECTION\n⚠️ Direction must be either "BACKUP" or "RETRIEVE"', title="[bold red]Error: Invalid Direction[/bold red]", border_style="red"))
|
|
68
68
|
raise RuntimeError(f"Unknown direction: {direction}")
|
|
@@ -17,22 +17,6 @@ from machineconfig.utils.source_of_truth import CONFIG_ROOT, DEFAULTS_PATH, LIBR
|
|
|
17
17
|
console = Console()
|
|
18
18
|
|
|
19
19
|
|
|
20
|
-
def _check_system_info() -> dict[str, str]:
|
|
21
|
-
"""Gather basic system information."""
|
|
22
|
-
import socket
|
|
23
|
-
import os
|
|
24
|
-
|
|
25
|
-
return {
|
|
26
|
-
"hostname": socket.gethostname(),
|
|
27
|
-
"system": platform.system(),
|
|
28
|
-
"release": platform.release(),
|
|
29
|
-
"version": platform.version(),
|
|
30
|
-
"machine": platform.machine(),
|
|
31
|
-
"processor": platform.processor() or "Unknown",
|
|
32
|
-
"python_version": platform.python_version(),
|
|
33
|
-
"user": os.getenv("USER") or os.getenv("USERNAME") or "Unknown",
|
|
34
|
-
}
|
|
35
|
-
|
|
36
20
|
|
|
37
21
|
def _check_shell_profile_status() -> dict[str, Any]:
|
|
38
22
|
"""Check shell profile configuration status."""
|
|
@@ -480,10 +464,14 @@ def main() -> None:
|
|
|
480
464
|
console.print("\n")
|
|
481
465
|
console.print(Panel(Text("📊 Machine Status Report", justify="center", style="bold white"), style="bold blue", padding=(1, 2)))
|
|
482
466
|
console.print("\n")
|
|
483
|
-
|
|
484
|
-
system_info = _check_system_info()
|
|
467
|
+
|
|
468
|
+
# system_info = _check_system_info()
|
|
469
|
+
# from machineconfig.scripts.python.helpers_devops.devops_system_info import _check_system_info
|
|
470
|
+
from machineconfig.scripts.python.helpers_utils.path import get_machine_specs
|
|
471
|
+
system_info = get_machine_specs()
|
|
472
|
+
from typing import cast
|
|
473
|
+
system_info = cast(dict[str, str], system_info)
|
|
485
474
|
_display_system_info(system_info)
|
|
486
|
-
|
|
487
475
|
shell_status = _check_shell_profile_status()
|
|
488
476
|
_display_shell_status(shell_status)
|
|
489
477
|
|
|
@@ -45,7 +45,7 @@ schemes_list = [
|
|
|
45
45
|
|
|
46
46
|
def main2():
|
|
47
47
|
console.print(Panel("🎨 WezTerm Theme Selector", title_align="left", border_style="green"))
|
|
48
|
-
option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm",
|
|
48
|
+
option = choose_from_options(multi=False, options=schemes_list, header="Choose a theme for Wezterm", tv=True, msg="Use arrow keys to navigate, Enter to select a theme")
|
|
49
49
|
set_theme(option)
|
|
50
50
|
print(f"✅ Theme set to: {option}")
|
|
51
51
|
|
machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py}
RENAMED
|
@@ -1,24 +1,7 @@
|
|
|
1
|
-
|
|
2
1
|
from typing import Optional
|
|
3
2
|
import os
|
|
4
|
-
from
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def search_for_files_of_interest(path_obj: PathExtended):
|
|
8
|
-
if path_obj.joinpath(".venv").exists():
|
|
9
|
-
path_objects = path_obj.search("*", not_in=[".venv"])
|
|
10
|
-
files: list[PathExtended] = []
|
|
11
|
-
for a_path_obj in path_objects:
|
|
12
|
-
files += search_for_files_of_interest(path_obj=a_path_obj)
|
|
13
|
-
return files
|
|
14
|
-
if path_obj.is_file():
|
|
15
|
-
return [path_obj]
|
|
16
|
-
py_files = path_obj.search(pattern="*.py", not_in=["__init__.py"], r=True)
|
|
17
|
-
ps_files = path_obj.search(pattern="*.ps1", r=True)
|
|
18
|
-
sh_files = path_obj.search(pattern="*.sh", r=True)
|
|
19
|
-
files = py_files + ps_files + sh_files
|
|
20
|
-
return files
|
|
21
|
-
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import platform
|
|
22
5
|
|
|
23
6
|
|
|
24
7
|
def parse_pyfile(file_path: str):
|
|
@@ -29,7 +12,7 @@ def parse_pyfile(file_path: str):
|
|
|
29
12
|
func_args: list[list[args_spec]] = [[]] # this firt prepopulated dict is for the option 'RUN AS MAIN' which has no args
|
|
30
13
|
import ast
|
|
31
14
|
|
|
32
|
-
parsed_ast = ast.parse(
|
|
15
|
+
parsed_ast = ast.parse(Path(file_path).read_text(encoding="utf-8"))
|
|
33
16
|
functions = [node for node in ast.walk(parsed_ast) if isinstance(node, (ast.FunctionDef, ast.AsyncFunctionDef))]
|
|
34
17
|
module__doc__ = ast.get_docstring(parsed_ast)
|
|
35
18
|
main_option = f"RUN AS MAIN -- {module__doc__ if module__doc__ is not None else 'NoDocs'}"
|
|
@@ -110,3 +93,56 @@ def get_import_module_code(module_path: str):
|
|
|
110
93
|
module_name = "IncorrectModuleName"
|
|
111
94
|
# TODO: use py_compile to check if the statement is valid code to avoid syntax errors that can't be caught.
|
|
112
95
|
return f"from {module_name} import *"
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def wrap_import_in_try_except(import_line: str, pyfile: str, repo_root: Optional[str] = None) -> None:
|
|
99
|
+
try:
|
|
100
|
+
exec(import_line) # type: ignore
|
|
101
|
+
except (ImportError, ModuleNotFoundError) as ex:
|
|
102
|
+
print(fr"❌ Failed to import `{pyfile}` as a module: {ex} ")
|
|
103
|
+
print("⚠️ Attempting import with ad-hoc `$PATH` manipulation. DO NOT pickle any objects in this session as correct deserialization cannot be guaranteed.")
|
|
104
|
+
import sys
|
|
105
|
+
sys.path.append(str(Path(pyfile).parent))
|
|
106
|
+
if repo_root is not None:
|
|
107
|
+
sys.path.append(repo_root)
|
|
108
|
+
exec(f"from {Path(pyfile).stem} import *")
|
|
109
|
+
print(fr"✅ Successfully imported `{pyfile}`")
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def add_to_path(path_variable: str, directory: str) -> str:
|
|
113
|
+
"""
|
|
114
|
+
Generate shell script to add directory to path_variable.
|
|
115
|
+
Handles both Windows (cmd) and Unix-like systems (bash/zsh).
|
|
116
|
+
Checks if variable exists before appending, otherwise creates it.
|
|
117
|
+
"""
|
|
118
|
+
system = platform.system()
|
|
119
|
+
|
|
120
|
+
if system == "Windows":
|
|
121
|
+
script = f"""# Check if {path_variable} is defined
|
|
122
|
+
if (Test-Path env:{path_variable}) {{
|
|
123
|
+
Write-Host "Adding {directory} to existing {path_variable}"
|
|
124
|
+
$currentValue = [Environment]::GetEnvironmentVariable("{path_variable}", "User")
|
|
125
|
+
$newValue = "$currentValue;{directory}"
|
|
126
|
+
[Environment]::SetEnvironmentVariable("{path_variable}", $newValue, "User")
|
|
127
|
+
$env:{path_variable} = $newValue
|
|
128
|
+
}} else {{
|
|
129
|
+
Write-Host "Creating new {path_variable} variable"
|
|
130
|
+
[Environment]::SetEnvironmentVariable("{path_variable}", "{directory}", "User")
|
|
131
|
+
$env:{path_variable} = "{directory}"
|
|
132
|
+
}}
|
|
133
|
+
Write-Host "{path_variable} is now: $env:{path_variable}\""""
|
|
134
|
+
return script
|
|
135
|
+
else:
|
|
136
|
+
script = f"""#!/bin/bash
|
|
137
|
+
# Check if {path_variable} is defined and not empty
|
|
138
|
+
if [ -z "${{{path_variable}}}" ]; then
|
|
139
|
+
echo "Creating new {path_variable} variable"
|
|
140
|
+
export {path_variable}="{directory}"
|
|
141
|
+
else
|
|
142
|
+
echo "Adding {directory} to existing {path_variable}"
|
|
143
|
+
export {path_variable}="${{{path_variable}}}:{directory}"
|
|
144
|
+
fi
|
|
145
|
+
echo "{path_variable} is now: ${{{path_variable}}}"
|
|
146
|
+
"""
|
|
147
|
+
return script
|
|
148
|
+
|
|
@@ -5,11 +5,10 @@ from typing import Optional
|
|
|
5
5
|
import tomllib
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from machineconfig.utils.accessories import randstr
|
|
8
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
9
8
|
from machineconfig.utils.options import choose_from_options
|
|
10
9
|
|
|
11
10
|
|
|
12
|
-
def choose_function_or_lines(choice_file:
|
|
11
|
+
def choose_function_or_lines(choice_file: Path, kwargs_dict: dict[str, object]) -> tuple[Optional[str], Path, dict[str, object]]:
|
|
13
12
|
"""
|
|
14
13
|
Choose a function to run from a Python file or lines from a shell script.
|
|
15
14
|
|
|
@@ -22,9 +21,9 @@ def choose_function_or_lines(choice_file: PathExtended, kwargs_dict: dict[str, o
|
|
|
22
21
|
choice_function: Optional[str] = None
|
|
23
22
|
|
|
24
23
|
if choice_file.suffix == ".py":
|
|
25
|
-
from machineconfig.scripts.python.
|
|
24
|
+
from machineconfig.scripts.python.helpers_fire_command.file_wrangler import parse_pyfile
|
|
26
25
|
options, func_args = parse_pyfile(file_path=str(choice_file))
|
|
27
|
-
choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options,
|
|
26
|
+
choice_function_tmp = choose_from_options(msg="Choose a function to run", options=options, tv=True, multi=False)
|
|
28
27
|
assert isinstance(choice_function_tmp, str), f"choice_function must be a string. Got {type(choice_function_tmp)}"
|
|
29
28
|
choice_index = options.index(choice_function_tmp)
|
|
30
29
|
choice_function = choice_function_tmp.split(" -- ")[0]
|
|
@@ -45,8 +44,8 @@ def choose_function_or_lines(choice_file: PathExtended, kwargs_dict: dict[str, o
|
|
|
45
44
|
if line.startswith("echo"):
|
|
46
45
|
continue
|
|
47
46
|
options.append(line)
|
|
48
|
-
chosen_lines = choose_from_options(msg="Choose a line to run", options=options,
|
|
49
|
-
choice_file =
|
|
47
|
+
chosen_lines = choose_from_options(msg="Choose a line to run", options=options, tv=True, multi=True)
|
|
48
|
+
choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/shell/{randstr(10)}.sh")
|
|
50
49
|
choice_file.parent.mkdir(parents=True, exist_ok=True)
|
|
51
50
|
choice_file.write_text("\n".join(chosen_lines), encoding="utf-8")
|
|
52
51
|
choice_function = None
|
|
@@ -55,15 +54,13 @@ def choose_function_or_lines(choice_file: PathExtended, kwargs_dict: dict[str, o
|
|
|
55
54
|
|
|
56
55
|
|
|
57
56
|
def get_command_streamlit(choice_file: Path, environment: str, repo_root: Optional[Path]) -> str:
|
|
58
|
-
import
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
finally:
|
|
66
|
-
s.close()
|
|
57
|
+
# from machineconfig.scripts.python.helpers_utils.path import get_machine_specs
|
|
58
|
+
from machineconfig.scripts.python.helpers_network.address import select_lan_ipv4
|
|
59
|
+
res = select_lan_ipv4(prefer_vpn=False)
|
|
60
|
+
if res is None:
|
|
61
|
+
raise RuntimeError("Could not determine local LAN IPv4 address for streamlit app.")
|
|
62
|
+
local_ip_v4 = res
|
|
63
|
+
|
|
67
64
|
computer_name = platform.node()
|
|
68
65
|
port = 8501
|
|
69
66
|
toml_path: Optional[Path] = None
|
|
@@ -82,7 +79,7 @@ def get_command_streamlit(choice_file: Path, environment: str, repo_root: Option
|
|
|
82
79
|
port = config["server"]["port"]
|
|
83
80
|
secrets_path = toml_path.with_name("secrets.toml")
|
|
84
81
|
if repo_root is not None:
|
|
85
|
-
secrets_template_path = Path.home().joinpath(f"dotfiles/creds/streamlit/{
|
|
82
|
+
secrets_template_path = Path.home().joinpath(f"dotfiles/creds/streamlit/{Path(repo_root).name}/{choice_file.name}/secrets.toml")
|
|
86
83
|
if environment != "" and not secrets_path.exists() and secrets_template_path.exists():
|
|
87
84
|
secrets_template = tomllib.loads(secrets_template_path.read_text(encoding="utf-8"))
|
|
88
85
|
if environment == "ip":
|
|
@@ -101,6 +98,19 @@ def get_command_streamlit(choice_file: Path, environment: str, repo_root: Option
|
|
|
101
98
|
except Exception as ex:
|
|
102
99
|
print(ex)
|
|
103
100
|
raise ex
|
|
101
|
+
from machineconfig.utils.installer_utils.installer_cli import install_if_missing
|
|
102
|
+
install_if_missing("qrterminal")
|
|
103
|
+
script = f"""
|
|
104
|
+
qrterminal "http://{local_ip_v4}:{port}"
|
|
105
|
+
echo "http://{local_ip_v4}:{port}"
|
|
106
|
+
qrterminal "http://{computer_name}:{port}"
|
|
107
|
+
echo "http://{computer_name}:{port}"
|
|
108
|
+
"""
|
|
109
|
+
# from machineconfig.utils.code import run_shell_script
|
|
110
|
+
# run_shell_script(script)
|
|
111
|
+
from machineconfig.utils.code import print_code
|
|
112
|
+
print_code(code=script, lexer="shell", desc="Streamlit QR Codes and URLs")
|
|
113
|
+
|
|
104
114
|
message = f"🚀 Streamlit app is running @:\n1- http://{local_ip_v4}:{port}\n2- http://{computer_name}:{port}\n3- http://localhost:{port}"
|
|
105
115
|
from rich.panel import Panel
|
|
106
116
|
from rich import print as rprint
|
|
@@ -13,11 +13,11 @@ IFS=: read -ra selected < <(
|
|
|
13
13
|
--bind "change:reload:sleep 0.1; $RG_PREFIX {q} || true" \
|
|
14
14
|
--bind "ctrl-f:unbind(change,ctrl-f)+change-prompt(2. fzf> )+enable-search+clear-query+rebind(ctrl-r)" \
|
|
15
15
|
--bind "ctrl-r:unbind(ctrl-r)+change-prompt(1. ripgrep> )+disable-search+reload($RG_PREFIX {q} || true)+rebind(change,ctrl-f)" \
|
|
16
|
-
--prompt '1.
|
|
16
|
+
--prompt '1. ripgrep> ' \
|
|
17
17
|
--delimiter : \
|
|
18
|
-
--header '╱ CTRL-R (
|
|
18
|
+
--header '╱ CTRL-R (ripgrep mode) ╱ CTRL-F (fzf mode) ╱' \
|
|
19
19
|
--preview 'bat --color=always {1} --highlight-line {2}' \
|
|
20
20
|
--preview-window 'up,60%,border-bottom,+{2}+3/3,~3'
|
|
21
21
|
)
|
|
22
|
-
[ -n "${selected[0]}" ] &&
|
|
22
|
+
[ -n "${selected[0]}" ] && hx "${selected[0]}:${selected[1]}:${selected[2]}"
|
|
23
23
|
"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/usr/bin/env pwsh
|
|
2
|
+
[CmdletBinding()]
|
|
3
|
+
param(
|
|
4
|
+
[Parameter(ValueFromRemainingArguments = $true)]
|
|
5
|
+
[string[]]$QueryTokens
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
if ($null -eq $QueryTokens) {
|
|
9
|
+
$QueryTokens = @()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
$initialQuery = if ($QueryTokens.Count -gt 0) { [string]::Join(' ', $QueryTokens) } else { '' }
|
|
13
|
+
$rgPrefix = 'rg --column --line-number --no-heading --color=always --smart-case '
|
|
14
|
+
|
|
15
|
+
$escapedDefault = if ($initialQuery.Length -gt 0) {
|
|
16
|
+
$rgPrefix + '"' + $initialQuery.Replace('"', '""') + '" || type nul'
|
|
17
|
+
} else {
|
|
18
|
+
'type nul'
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
$previousDefault = $env:FZF_DEFAULT_COMMAND
|
|
22
|
+
$env:FZF_DEFAULT_COMMAND = $escapedDefault
|
|
23
|
+
|
|
24
|
+
$reloadBinding = "change:reload:$rgPrefix{q} || type nul"
|
|
25
|
+
$ctrlFBinding = 'ctrl-f:unbind(change,ctrl-f)+change-prompt(2. fzf> )+enable-search+clear-query+rebind(ctrl-r)'
|
|
26
|
+
$ctrlRBinding = "ctrl-r:unbind(ctrl-r)+change-prompt(1. ripgrep> )+disable-search+reload($rgPrefix{q} || type nul)+rebind(change,ctrl-f)"
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
$selectionRaw = & fzf --ansi `
|
|
30
|
+
--color 'hl:-1:underline,hl+:-1:underline:reverse' `
|
|
31
|
+
--disabled `
|
|
32
|
+
--query $initialQuery `
|
|
33
|
+
--bind $reloadBinding `
|
|
34
|
+
--bind $ctrlFBinding `
|
|
35
|
+
--bind $ctrlRBinding `
|
|
36
|
+
--prompt '1. ripgrep> ' `
|
|
37
|
+
--delimiter ':' `
|
|
38
|
+
--header 'CTRL-R (ripgrep mode) | CTRL-F (fzf mode)' `
|
|
39
|
+
--preview 'bat --color=always {1} --highlight-line {2}' `
|
|
40
|
+
--preview-window 'up,60%,border-bottom,+{2}+3/3,~3'
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if ($null -ne $previousDefault) {
|
|
44
|
+
$env:FZF_DEFAULT_COMMAND = $previousDefault
|
|
45
|
+
} else {
|
|
46
|
+
Remove-Item Env:FZF_DEFAULT_COMMAND -ErrorAction SilentlyContinue
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if ($LASTEXITCODE -ne 0 -or [string]::IsNullOrWhiteSpace($selectionRaw)) {
|
|
51
|
+
exit
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if ($selectionRaw -match '^(?<path>.+?):(?<line>\d+):(?<column>\d+):') {
|
|
55
|
+
$path = $Matches['path']
|
|
56
|
+
$line = [int]$Matches['line']
|
|
57
|
+
$column = [int]$Matches['column']
|
|
58
|
+
& hx ("{0}:{1}:{2}" -f $path,$line,$column)
|
|
59
|
+
}
|
|
@@ -188,15 +188,7 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
188
188
|
description="Configure your shell profile",
|
|
189
189
|
command="devops config shell",
|
|
190
190
|
parent="config",
|
|
191
|
-
help_text="devops config shell <
|
|
192
|
-
))
|
|
193
|
-
|
|
194
|
-
config_node.add("🔗 path - Navigate PATH variable", data=CommandInfo(
|
|
195
|
-
name="path",
|
|
196
|
-
description="Navigate PATH variable with TUI",
|
|
197
|
-
command="devops config path",
|
|
198
|
-
parent="config",
|
|
199
|
-
help_text="devops config path"
|
|
191
|
+
help_text="devops config shell --which <default|nushell>"
|
|
200
192
|
))
|
|
201
193
|
|
|
202
194
|
config_node.add("🔗 starship-theme - Select starship theme", data=CommandInfo(
|
|
@@ -560,7 +552,23 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
560
552
|
description="Choose a process to kill interactively",
|
|
561
553
|
command="utils kill-process",
|
|
562
554
|
parent="utils",
|
|
563
|
-
help_text="utils kill-process"
|
|
555
|
+
help_text="utils kill-process --interactive"
|
|
556
|
+
))
|
|
557
|
+
|
|
558
|
+
utils_node.add("📚 path - Navigate PATH variable", data=CommandInfo(
|
|
559
|
+
name="path",
|
|
560
|
+
description="Navigate PATH variable with TUI",
|
|
561
|
+
command="utils path",
|
|
562
|
+
parent="utils",
|
|
563
|
+
help_text="utils path"
|
|
564
|
+
))
|
|
565
|
+
|
|
566
|
+
utils_node.add("⬆️ upgrade-packages - Upgrade dependencies", data=CommandInfo(
|
|
567
|
+
name="upgrade-packages",
|
|
568
|
+
description="Upgrade project dependencies",
|
|
569
|
+
command="utils upgrade-packages",
|
|
570
|
+
parent="utils",
|
|
571
|
+
help_text="utils upgrade-packages"
|
|
564
572
|
))
|
|
565
573
|
|
|
566
574
|
utils_node.add("⬇️ download - Download file", data=CommandInfo(
|
|
@@ -571,18 +579,42 @@ class CommandTree(Tree[CommandInfo]):
|
|
|
571
579
|
help_text="utils download <url> --destination <path> --decompress"
|
|
572
580
|
))
|
|
573
581
|
|
|
574
|
-
utils_node.add("📄 merge-pdfs - Merge PDF files", data=CommandInfo(
|
|
575
|
-
name="merge-pdfs",
|
|
576
|
-
description="Merge two PDF files into one",
|
|
577
|
-
command="utils merge-pdfs",
|
|
578
|
-
parent="utils",
|
|
579
|
-
help_text="utils merge-pdfs <file1> <file2> --output <file>"
|
|
580
|
-
))
|
|
581
|
-
|
|
582
582
|
utils_node.add("🖥️ get-machine-specs - Get machine specifications", data=CommandInfo(
|
|
583
583
|
name="get-machine-specs",
|
|
584
584
|
description="Get machine specifications",
|
|
585
585
|
command="utils get-machine-specs",
|
|
586
586
|
parent="utils",
|
|
587
587
|
help_text="utils get-machine-specs"
|
|
588
|
+
))
|
|
589
|
+
|
|
590
|
+
utils_node.add("🚀 init-project - Initialize project", data=CommandInfo(
|
|
591
|
+
name="init-project",
|
|
592
|
+
description="Initialize a project with a uv virtual environment and install dev packages",
|
|
593
|
+
command="utils init-project",
|
|
594
|
+
parent="utils",
|
|
595
|
+
help_text="utils init-project"
|
|
596
|
+
))
|
|
597
|
+
|
|
598
|
+
utils_node.add("✏️ edit - Open file in editor", data=CommandInfo(
|
|
599
|
+
name="edit",
|
|
600
|
+
description="Open a file in the default editor",
|
|
601
|
+
command="utils edit",
|
|
602
|
+
parent="utils",
|
|
603
|
+
help_text="utils edit <file>"
|
|
604
|
+
))
|
|
605
|
+
|
|
606
|
+
utils_node.add("📄 pdf-merge - Merge PDF files", data=CommandInfo(
|
|
607
|
+
name="pdf-merge",
|
|
608
|
+
description="Merge two PDF files into one",
|
|
609
|
+
command="utils pdf-merge",
|
|
610
|
+
parent="utils",
|
|
611
|
+
help_text="utils pdf-merge <file1> <file2> --output <file>"
|
|
612
|
+
))
|
|
613
|
+
|
|
614
|
+
utils_node.add("� pdf-compress - Compress PDF file", data=CommandInfo(
|
|
615
|
+
name="pdf-compress",
|
|
616
|
+
description="Compress a PDF file",
|
|
617
|
+
command="utils pdf-compress",
|
|
618
|
+
parent="utils",
|
|
619
|
+
help_text="utils pdf-compress <file> --output <file>"
|
|
588
620
|
))
|