machineconfig 6.82__py3-none-any.whl → 8.51__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/remote/run_cluster.py +1 -1
- machineconfig/cluster/remote/run_remote.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +29 -15
- machineconfig/cluster/sessions_managers/wt_local.py +17 -222
- machineconfig/cluster/sessions_managers/wt_local_manager.py +56 -194
- 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.py +1 -1
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +4 -2
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +2 -2
- machineconfig/jobs/installer/checks/check_installations.py +133 -0
- machineconfig/jobs/installer/checks/install_utils.py +132 -0
- machineconfig/jobs/installer/checks/report_utils.py +39 -0
- machineconfig/jobs/installer/checks/vt_utils.py +89 -0
- machineconfig/jobs/installer/installer_data.json +1500 -310
- machineconfig/jobs/installer/linux_scripts/docker.sh +6 -9
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +62 -91
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/jobs/installer/{custom → python_scripts}/boxes.py +2 -3
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
- machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +14 -9
- machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/python_scripts/hx.py +214 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +32 -26
- machineconfig/jobs/installer/python_scripts/sysabc.py +145 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
- machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
- machineconfig/jobs/installer/python_scripts/yazi.py +139 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
- machineconfig/jobs/scripts/powershell_scripts/cmatrix.ps1 +52 -0
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
- machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
- machineconfig/jobs/scripts_dynamic/a.py +428 -0
- machineconfig/logger.py +1 -2
- machineconfig/profile/create_helper.py +56 -18
- machineconfig/profile/create_links.py +79 -21
- machineconfig/profile/create_links_export.py +87 -36
- machineconfig/profile/create_shell_profile.py +92 -127
- machineconfig/profile/mapper_data.toml +45 -0
- machineconfig/profile/mapper_dotfiles.toml +249 -0
- 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 +85 -165
- machineconfig/scripts/python/ai/initai.py +4 -2
- machineconfig/scripts/python/ai/scripts/__init__.py +1 -0
- 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/scripts/lint_and_type_check.ps1 +2 -0
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +8 -6
- machineconfig/scripts/python/ai/solutions/claude/claude.py +1 -1
- machineconfig/scripts/python/ai/solutions/cline/cline.py +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 +6 -6
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +33 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/crush/crush.py +1 -1
- machineconfig/scripts/python/ai/solutions/cursor/cursors.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/gemini.py +1 -1
- machineconfig/scripts/python/ai/solutions/gemini/settings.json +3 -0
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{solutions → utils}/generic.py +2 -15
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +13 -5
- machineconfig/scripts/python/cloud.py +58 -11
- machineconfig/scripts/python/croshell.py +10 -162
- machineconfig/scripts/python/devops.py +73 -36
- machineconfig/scripts/python/devops_navigator.py +16 -6
- machineconfig/scripts/python/fire_jobs.py +8 -222
- machineconfig/scripts/python/ftpx.py +7 -200
- machineconfig/scripts/python/graph/cli_graph.json +8743 -0
- machineconfig/scripts/python/{env_manager → helper_env}/path_manager_tui.py +2 -2
- machineconfig/scripts/python/helpers/helper_env/env_manager_tui.py +204 -0
- machineconfig/scripts/python/helpers/helper_env/path_manager_tui.py +228 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers/helpers_agents/agents_impl.py +168 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_launch.py +38 -16
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_helper_types.py +11 -14
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/helpers/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers/helpers_agents/templates/template.sh +34 -0
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_copy.py +32 -25
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_mount.py +29 -22
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_sync.py +9 -8
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/crosh.py +3 -3
- machineconfig/scripts/python/helpers/helpers_croshell/croshell_impl.py +225 -0
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/scheduler.py +4 -4
- machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/start_slidev.py +12 -12
- machineconfig/scripts/python/helpers/helpers_devops/backup_config.py +149 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_backup_retrieve.py +262 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config.py +98 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_config_dotfile.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_data.py +67 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_nw.py +201 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_repos.py +274 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_self.py +197 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_share_file.py +151 -0
- machineconfig/scripts/python/helpers/helpers_devops/cli_share_server.py +125 -0
- machineconfig/scripts/python/{helpers_devops/cli_terminal.py → helpers/helpers_devops/cli_share_terminal.py} +26 -22
- machineconfig/scripts/python/helpers/helpers_devops/cli_ssh.py +167 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_status.py +17 -23
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/{interactive.py → helpers/helpers_devops/interactive.py} +78 -71
- machineconfig/scripts/python/helpers/helpers_devops/run_script.py +197 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.ps1 +41 -0
- machineconfig/scripts/python/helpers/helpers_devops/themes/choose_starship_theme.sh +48 -0
- machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_wezterm_theme.py +4 -4
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers/helpers_fire_command/file_wrangler.py} +57 -20
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_args_helper.py +1 -0
- machineconfig/scripts/python/helpers/helpers_fire_command/fire_jobs_impl.py +233 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/fire_jobs_route_helper.py +26 -16
- machineconfig/scripts/python/helpers/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/python/helpers/helpers_msearch/msearch_impl.py +248 -0
- machineconfig/scripts/{linux → python/helpers/helpers_msearch/scripts_linux}/fzfg +6 -5
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_linux/search_with_context.sh +48 -0
- machineconfig/scripts/python/helpers/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- machineconfig/scripts/python/helpers/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers/helpers_navigator/cli_graph_loader.py +234 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/command_builder.py +61 -13
- machineconfig/scripts/python/helpers/helpers_navigator/command_detail.py +153 -0
- machineconfig/scripts/python/helpers/helpers_navigator/command_tree.py +45 -0
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/data_models.py +18 -11
- machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/helpers/helpers_network/address.py +174 -0
- machineconfig/scripts/python/helpers/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/helpers/helpers_network/ftpx_impl.py +276 -0
- machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_ssh.py +3 -3
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_identity.py +73 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_add_ssh_key.py +175 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_linux.py +319 -0
- machineconfig/scripts/python/helpers/helpers_network/ssh_debug_windows.py +275 -0
- machineconfig/scripts/python/{nw → helpers/helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/action_helper.py +3 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/clone.py +0 -1
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/cloud_repo_sync.py +159 -48
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/grource.py +4 -3
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/record.py +33 -12
- machineconfig/scripts/python/helpers/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{helpers_repos/count_lines.py → helpers/helpers_repos/repo_analyzer_2.py} +156 -191
- machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/update.py +0 -6
- machineconfig/scripts/python/helpers/helpers_search/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/helpers_search/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/helpers_search/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/helpers_search/script_help.py +81 -0
- machineconfig/scripts/python/helpers/helpers_search/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_sessions/sessions_impl.py +186 -0
- machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py +20 -14
- machineconfig/scripts/python/helpers/helpers_terminal/__init__.py +0 -0
- machineconfig/scripts/python/helpers/helpers_terminal/terminal_impl.py +96 -0
- machineconfig/scripts/python/helpers/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers/helpers_utils/pdf.py +96 -0
- machineconfig/scripts/python/helpers/helpers_utils/python.py +210 -0
- machineconfig/scripts/python/helpers/helpers_utils/specs.py +246 -0
- machineconfig/scripts/python/mcfg_entry.py +143 -0
- machineconfig/scripts/python/msearch.py +26 -0
- machineconfig/scripts/python/sessions.py +69 -135
- machineconfig/scripts/python/terminal.py +58 -0
- machineconfig/scripts/python/utils.py +115 -38
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/atuin/config.toml +294 -0
- machineconfig/settings/atuin/themes/catppuccin-mocha-mauve.toml +12 -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/linters/.ruff.toml +2 -1
- machineconfig/settings/marimo/marimo.toml +1 -1
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/mprocs/windows/mprocs.yaml +2 -2
- machineconfig/settings/shells/bash/init.sh +47 -12
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +25 -33
- machineconfig/settings/shells/nushell/env.nu +21 -8
- machineconfig/settings/shells/nushell/init.nu +138 -0
- machineconfig/settings/shells/pwsh/init.ps1 +111 -17
- machineconfig/settings/shells/pwsh/search_pwsh_history.ps1 +99 -0
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +6 -1
- machineconfig/settings/shells/wt/settings.json +27 -18
- machineconfig/settings/shells/zsh/init.sh +42 -23
- 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/tv/config.toml +234 -0
- machineconfig/settings/tv/themes/catppuccin-mocha-sky.toml +22 -0
- machineconfig/settings/wsl/.wslconfig +5 -30
- machineconfig/settings/wt/__init__.py +0 -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 +94 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/settings/zellij/layouts/st.kdl +40 -9
- machineconfig/settings/zellij/layouts/st2.kdl +1 -1
- machineconfig/setup_linux/__init__.py +2 -2
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -12
- machineconfig/setup_linux/web_shortcuts/live_from_github.sh +34 -0
- machineconfig/setup_mac/__init__.py +1 -4
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_windows/__init__.py +2 -5
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +28 -12
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +31 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/type_hinting/sql/__init__.py +1 -0
- machineconfig/type_hinting/sql/base.py +216 -0
- machineconfig/type_hinting/sql/core_schema.py +64 -0
- machineconfig/type_hinting/sql/core_schema_typeddict.py +41 -0
- machineconfig/type_hinting/sql/typeddict_codegen.py +222 -0
- machineconfig/type_hinting/typedict/__init__.py +1 -0
- machineconfig/type_hinting/typedict/ast_utils.py +130 -0
- machineconfig/type_hinting/typedict/generator_helpers.py +319 -0
- machineconfig/type_hinting/typedict/generators.py +231 -0
- machineconfig/type_hinting/typedict/polars_schema.py +24 -0
- machineconfig/type_hinting/typedict/polars_schema_typeddict.py +63 -0
- machineconfig/utils/accessories.py +31 -4
- machineconfig/utils/code.py +163 -51
- machineconfig/utils/files/ascii_art.py +11 -15
- machineconfig/utils/files/headers.py +6 -7
- machineconfig/utils/files/read.py +8 -1
- machineconfig/utils/installer_utils/github_release_bulk.py +95 -138
- machineconfig/utils/installer_utils/github_release_scraper.py +99 -0
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +53 -102
- machineconfig/utils/installer_utils/installer_cli.py +161 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +42 -91
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +20 -65
- machineconfig/utils/io.py +94 -9
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +38 -21
- machineconfig/utils/options.py +81 -23
- machineconfig/utils/options_utils/__init__.py +0 -0
- machineconfig/utils/options_utils/options_tv_linux.py +211 -0
- machineconfig/utils/options_utils/options_tv_windows.py +88 -0
- machineconfig/utils/options_utils/tv_options.py +37 -0
- machineconfig/utils/path_extended.py +52 -102
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +1 -1
- machineconfig/utils/scheduler.py +26 -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/source_of_truth.py +6 -1
- machineconfig/utils/ssh.py +216 -419
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +116 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +303 -0
- machineconfig/utils/ssh_utils/utils.py +158 -0
- machineconfig/utils/ssh_utils/wsl.py +147 -0
- machineconfig/utils/ssh_utils/wsl_helper.py +217 -0
- machineconfig/utils/terminal.py +1 -0
- machineconfig/utils/upgrade_packages.py +107 -35
- machineconfig/utils/ve.py +12 -4
- machineconfig-8.51.dist-info/METADATA +140 -0
- machineconfig-8.51.dist-info/RECORD +543 -0
- {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/entry_points.txt +4 -1
- machineconfig/jobs/installer/check_installations.py +0 -248
- machineconfig/jobs/installer/custom/hx.py +0 -140
- 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/jobs/installer/powershell_scripts/openssh-server_add_key.ps1 +0 -7
- machineconfig/jobs/installer/powershell_scripts/openssh-server_copy-ssh-id.ps1 +0 -14
- machineconfig/profile/backup.toml +0 -49
- machineconfig/profile/mapper.toml +0 -256
- 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/other/switch_ip +0 -20
- 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_devops/cli_config.py +0 -120
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +0 -77
- machineconfig/scripts/python/helpers_devops/cli_data.py +0 -25
- machineconfig/scripts/python/helpers_devops/cli_nw.py +0 -73
- machineconfig/scripts/python/helpers_devops/cli_repos.py +0 -181
- machineconfig/scripts/python/helpers_devops/cli_self.py +0 -122
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +0 -104
- machineconfig/scripts/python/helpers_devops/cli_utils.py +0 -221
- machineconfig/scripts/python/helpers_devops/devops_backup_retrieve.py +0 -80
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +0 -3
- 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_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_navigator/command_detail.py +0 -44
- machineconfig/scripts/python/helpers_navigator/command_tree.py +0 -588
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +0 -17
- machineconfig/scripts/python/helpers_repos/entrypoint.py +0 -76
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/mcfg.py +0 -48
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/python/nw/devops_add_identity.py +0 -82
- machineconfig/scripts/python/nw/devops_add_ssh_key.py +0 -134
- machineconfig/scripts/python/nw/ssh_debug_linux.py +0 -391
- machineconfig/scripts/python/nw/ssh_debug_windows.py +0 -338
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
- 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/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- 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_linux/others/mint_keyboard_shortcuts.sh +0 -30
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_mac/apps.sh +0 -73
- machineconfig/setup_mac/ssh/openssh_setup.sh +0 -114
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +0 -29
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/ssh/openssh-server.ps1 +0 -37
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig/utils/tst.py +0 -20
- machineconfig-6.82.dist-info/METADATA +0 -82
- machineconfig-6.82.dist-info/RECORD +0 -441
- machineconfig/jobs/installer/{custom_dev → checks}/__init__.py +0 -0
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- machineconfig/{scripts/python/helpers_cloud → jobs/installer/python_scripts}/__init__.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/android.sh +0 -0
- machineconfig/jobs/{installer/linux_scripts → scripts/bash_scripts}/lid.sh +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
- machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- machineconfig/scripts/python/{helpers_croshell → ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/ai/{solutions/_shared.py → utils/shared.py} +0 -0
- machineconfig/scripts/python/{helpers_devops → graph}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_devops/themes → helpers}/__init__.py +0 -0
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/__init__.py +0 -0
- machineconfig/scripts/python/{env_manager → helpers/helper_env}/path_manager_backend.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/agentic_frameworks/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_help_search.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents}/fire_agents_load_balancer.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers/helpers_agents/templates}/template.ps1 +0 -0
- machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_cloud}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers_cloud → helpers/helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{helpers_sessions → helpers/helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{helpers_croshell → helpers/helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_devops}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → scripts/python/helpers/helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_devops → helpers/helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/scripts/python/{helpers_devops/themes/choose_starship_theme.ps1 → helpers/helpers_fire_command/__init__.py} +0 -0
- /machineconfig/scripts/python/{helpers_fire_command → helpers/helpers_fire_command}/cloud_manager.py +0 -0
- /machineconfig/scripts/python/{helpers_fire_command/fire_jobs_streamlit_helper.py → helpers/helpers_fire_command/f.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/python/helpers/helpers_fire_command/fire_jobs_streamlit_helper.py} +0 -0
- /machineconfig/scripts/python/{helpers_navigator → helpers/helpers_navigator}/search_bar.py +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers/helpers_network/__init__.py} +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers/helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers/helpers_repos}/sync.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/WHEEL +0 -0
- {machineconfig-6.82.dist-info → machineconfig-8.51.dist-info}/top_level.txt +0 -0
machineconfig/scripts/python/{helpers_sessions → helpers/helpers_sessions}/sessions_multiprocess.py
RENAMED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
3
|
from typing import Optional, Annotated
|
|
4
|
-
from pathlib import Path
|
|
5
4
|
import typer
|
|
6
5
|
|
|
7
6
|
|
|
@@ -10,23 +9,23 @@ def create_from_function(
|
|
|
10
9
|
path: Annotated[str, typer.Option(..., "--path", "-p", help="Path to a Python or Shell script file or a directory containing such files")] = ".",
|
|
11
10
|
function: Annotated[Optional[str], typer.Option(..., "--function", "-f", help="Function to run from the Python file. If not provided, you will be prompted to choose.")] = None,
|
|
12
11
|
):
|
|
13
|
-
from machineconfig.utils.ve import
|
|
12
|
+
from machineconfig.utils.ve import get_ve_path_and_ipython_profile
|
|
14
13
|
from machineconfig.utils.options import choose_from_options
|
|
15
14
|
from machineconfig.utils.path_helper import match_file_name, sanitize_path
|
|
16
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
17
15
|
from machineconfig.utils.accessories import get_repo_root
|
|
16
|
+
from pathlib import Path
|
|
18
17
|
|
|
19
18
|
path_obj = sanitize_path(path)
|
|
20
19
|
if not path_obj.exists():
|
|
21
20
|
suffixes = {".py"}
|
|
22
|
-
choice_file = match_file_name(sub_string=path, search_root=
|
|
21
|
+
choice_file = match_file_name(sub_string=path, search_root=Path.cwd(), suffixes=suffixes)
|
|
23
22
|
elif path_obj.is_dir():
|
|
24
|
-
from machineconfig.
|
|
23
|
+
from machineconfig.utils.path_helper import search_for_files_of_interest
|
|
25
24
|
print(f"🔍 Searching recursively for Python, PowerShell and Shell scripts in directory `{path_obj}`")
|
|
26
|
-
files = search_for_files_of_interest(path_obj)
|
|
25
|
+
files = search_for_files_of_interest(path_obj, suffixes={".py", ".sh", ".ps1"})
|
|
27
26
|
print(f"🔍 Got #{len(files)} results.")
|
|
28
|
-
choice_file = choose_from_options(multi=False, options=files,
|
|
29
|
-
choice_file =
|
|
27
|
+
choice_file = choose_from_options(multi=False, options=files, tv=True, msg="Choose one option")
|
|
28
|
+
choice_file = Path(choice_file)
|
|
30
29
|
else:
|
|
31
30
|
choice_file = path_obj
|
|
32
31
|
|
|
@@ -36,14 +35,17 @@ def create_from_function(
|
|
|
36
35
|
ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(choice_file)
|
|
37
36
|
if ipy_profile is None:
|
|
38
37
|
ipy_profile = "default"
|
|
39
|
-
if ve_root_from_file is None:
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
# if ve_root_from_file is None:
|
|
39
|
+
# raise ValueError(f"Could not determine virtual environment for file {choice_file}. Please ensure it is within a recognized project structure.")
|
|
40
|
+
# _activate_ve_line = get_ve_activate_line(ve_root=ve_root_from_file)
|
|
41
|
+
if ve_root_from_file is not None:
|
|
42
|
+
start_dir = Path(ve_root_from_file).parent
|
|
43
|
+
else:
|
|
44
|
+
start_dir = Path.cwd()
|
|
43
45
|
|
|
44
46
|
# ========================= choosing function to run
|
|
45
47
|
if function is None or function.strip() == "":
|
|
46
|
-
from machineconfig.scripts.python.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
|
|
48
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
|
|
47
49
|
choice_function, choice_file, _kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict={})
|
|
48
50
|
else:
|
|
49
51
|
choice_function = function
|
|
@@ -52,7 +54,11 @@ def create_from_function(
|
|
|
52
54
|
from machineconfig.utils.schemas.layouts.layout_types import LayoutConfig
|
|
53
55
|
layout: LayoutConfig = {"layoutName": "fireNprocess", "layoutTabs": []}
|
|
54
56
|
for an_arg in range(num_process):
|
|
55
|
-
layout["layoutTabs"].append({
|
|
57
|
+
layout["layoutTabs"].append({
|
|
58
|
+
"tabName": f"tab{an_arg}",
|
|
59
|
+
"startDir": str(start_dir),
|
|
60
|
+
"command": f"uv run python -m fire {choice_file} {choice_function} --idx={an_arg} --idx_max={num_process}"
|
|
61
|
+
})
|
|
56
62
|
print(layout)
|
|
57
63
|
run_zellij_layout(layout_config=layout)
|
|
58
64
|
|
|
File without changes
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import subprocess
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
_ANSI_ESCAPE_RE = re.compile(
|
|
7
|
+
r"(?:\x1B|\u001B|\033)\[[0-?]*[ -/]*[@-~]|\[[0-9;?]+[ -/]*[@-~]|\[m"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def strip_ansi_codes(text: str) -> str:
|
|
12
|
+
return _ANSI_ESCAPE_RE.sub("", text)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def choose_zellij_session(name: str | None, new_session: bool, kill_all: bool) -> tuple[str, str | None]:
|
|
16
|
+
"""Choose a Zellij session. Returns tuple of (action, script_to_run) where action is 'run_script', 'exit', or 'error'."""
|
|
17
|
+
if name is not None:
|
|
18
|
+
return ("run_script", f"zellij attach {name}")
|
|
19
|
+
if new_session:
|
|
20
|
+
cmd = "zellij --layout st2"
|
|
21
|
+
if kill_all:
|
|
22
|
+
cmd = f"zellij kill-all-sessions --yes\n{cmd}"
|
|
23
|
+
return ("run_script", cmd)
|
|
24
|
+
cmd = "zellij list-sessions"
|
|
25
|
+
try:
|
|
26
|
+
sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
|
|
27
|
+
except subprocess.CalledProcessError:
|
|
28
|
+
sessions = []
|
|
29
|
+
sessions = [s for s in sessions if s.strip()]
|
|
30
|
+
# print(f"Found Zellij sessions: {sessions}")
|
|
31
|
+
sessions.sort(key=lambda s: "EXITED" in s)
|
|
32
|
+
if "current" in sessions:
|
|
33
|
+
return ("error", "Already in a Zellij session, avoiding nesting and exiting.")
|
|
34
|
+
if len(sessions) == 0:
|
|
35
|
+
return ("run_script", "zellij --layout st2")
|
|
36
|
+
if len(sessions) == 1:
|
|
37
|
+
sn = strip_ansi_codes(sessions[0])
|
|
38
|
+
session_name = sn.split(" [Created")[0]
|
|
39
|
+
return ("run_script", f"zellij attach {session_name}")
|
|
40
|
+
from machineconfig.utils.options import choose_from_options
|
|
41
|
+
NEW_SESSION_LABEL = "NEW SESSION"
|
|
42
|
+
KILL_ALL_AND_NEW_LABEL = "KILL ALL SESSIONS & START NEW"
|
|
43
|
+
options = sessions + [NEW_SESSION_LABEL, KILL_ALL_AND_NEW_LABEL]
|
|
44
|
+
try:
|
|
45
|
+
session_name = choose_from_options(msg="Choose a Zellij session to attach to:", multi=False, options=options, tv=True)
|
|
46
|
+
except Exception as e:
|
|
47
|
+
return ("error", f"Error choosing Zellij session: {e}")
|
|
48
|
+
if session_name == NEW_SESSION_LABEL:
|
|
49
|
+
cmd = "zellij --layout st2"
|
|
50
|
+
if kill_all:
|
|
51
|
+
cmd = f"zellij kill-all-sessions --yes\n{cmd}"
|
|
52
|
+
return ("run_script", cmd)
|
|
53
|
+
if session_name == KILL_ALL_AND_NEW_LABEL:
|
|
54
|
+
return ("run_script", "zellij kill-all-sessions --yes\nzellij --layout st2")
|
|
55
|
+
session_name_clean = strip_ansi_codes(session_name)
|
|
56
|
+
session_name_clean = session_name_clean.split(" [Created")[0]
|
|
57
|
+
return ("run_script", f"zellij attach {session_name_clean}")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_session_tabs() -> list[tuple[str, str]]:
|
|
61
|
+
cmd = "zellij list-sessions"
|
|
62
|
+
try:
|
|
63
|
+
sessions: list[str] = subprocess.check_output(cmd, shell=True).decode().strip().split("\n")
|
|
64
|
+
except subprocess.CalledProcessError:
|
|
65
|
+
sessions = []
|
|
66
|
+
sessions = [strip_ansi_codes(s) for s in sessions]
|
|
67
|
+
active_sessions = [s for s in sessions if "EXITED" not in s]
|
|
68
|
+
result: list[tuple[str, str]] = []
|
|
69
|
+
for session_line in active_sessions:
|
|
70
|
+
session_name = session_line.split(" [Created")[0].strip()
|
|
71
|
+
tab_cmd = f"zellij --session {session_name} action query-tab-names"
|
|
72
|
+
try:
|
|
73
|
+
tabs: list[str] = subprocess.check_output(tab_cmd, shell=True).decode().strip().split("\n")
|
|
74
|
+
for tab in tabs:
|
|
75
|
+
if tab.strip():
|
|
76
|
+
result.append((session_name, tab.strip()))
|
|
77
|
+
except subprocess.CalledProcessError:
|
|
78
|
+
continue
|
|
79
|
+
return result
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def start_wt(layout_name: str) -> tuple[str, str | None]:
|
|
83
|
+
"""Start a Windows Terminal layout by name. Returns tuple of (status, message) where status is 'success' or 'error'."""
|
|
84
|
+
import json
|
|
85
|
+
from machineconfig.utils.schemas.layouts.layout_types import LayoutsFile
|
|
86
|
+
from machineconfig.cluster.sessions_managers.wt_local import run_wt_layout
|
|
87
|
+
layouts_file = Path.home().joinpath("dotfiles/machineconfig/layouts.json")
|
|
88
|
+
if not layouts_file.exists():
|
|
89
|
+
return ("error", f"❌ Layouts file not found: {layouts_file}")
|
|
90
|
+
layouts_data: LayoutsFile = json.loads(layouts_file.read_text(encoding="utf-8"))
|
|
91
|
+
chosen_layout = next((a_layout for a_layout in layouts_data["layouts"] if a_layout["layoutName"] == layout_name), None)
|
|
92
|
+
if not chosen_layout:
|
|
93
|
+
available_layouts = [a_layout["layoutName"] for a_layout in layouts_data["layouts"]]
|
|
94
|
+
return ("error", f"❌ Layout '{layout_name}' not found in layouts file.\nAvailable layouts: {', '.join(available_layouts)}")
|
|
95
|
+
run_wt_layout(layout_config=chosen_layout)
|
|
96
|
+
return ("success", None)
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
from typing import Annotated, Optional
|
|
4
|
+
import typer
|
|
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
|
+
output_dir: Annotated[Optional[str], typer.Option("--output-dir", help="Directory to place the downloaded file in.")] = None,
|
|
13
|
+
) -> Optional["Path"]:
|
|
14
|
+
import subprocess
|
|
15
|
+
from urllib.parse import parse_qs, unquote, urlparse
|
|
16
|
+
from requests import Response
|
|
17
|
+
import requests
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
if url is None:
|
|
20
|
+
typer.echo("❌ Error: URL is required.", err=True)
|
|
21
|
+
return None
|
|
22
|
+
if output is not None and output_dir is not None:
|
|
23
|
+
typer.echo("❌ Error: --output and --output-dir cannot be used together.", err=True)
|
|
24
|
+
return None
|
|
25
|
+
typer.echo(f" {url}")
|
|
26
|
+
|
|
27
|
+
def _sanitize_candidate_filename(name: str) -> Optional[str]:
|
|
28
|
+
candidate = Path(name).name.strip()
|
|
29
|
+
if not candidate or candidate in {".", ".."}:
|
|
30
|
+
return None
|
|
31
|
+
return candidate
|
|
32
|
+
|
|
33
|
+
def _filename_from_content_disposition(header_value: Optional[str]) -> Optional[str]:
|
|
34
|
+
if header_value is None:
|
|
35
|
+
return None
|
|
36
|
+
parts = [segment.strip() for segment in header_value.split(";")]
|
|
37
|
+
for part in parts:
|
|
38
|
+
lower = part.lower()
|
|
39
|
+
if lower.startswith("filename*="):
|
|
40
|
+
value = part.split("=", 1)[1]
|
|
41
|
+
value = value.strip().strip('"')
|
|
42
|
+
if "''" in value:
|
|
43
|
+
value = value.split("''", 1)[1]
|
|
44
|
+
decoded = unquote(value)
|
|
45
|
+
sanitized = _sanitize_candidate_filename(decoded)
|
|
46
|
+
if sanitized is not None:
|
|
47
|
+
return sanitized
|
|
48
|
+
if lower.startswith("filename="):
|
|
49
|
+
value = part.split("=", 1)[1].strip().strip('"')
|
|
50
|
+
decoded = unquote(value)
|
|
51
|
+
sanitized = _sanitize_candidate_filename(decoded)
|
|
52
|
+
if sanitized is not None:
|
|
53
|
+
return sanitized
|
|
54
|
+
return None
|
|
55
|
+
|
|
56
|
+
def _filename_from_url(source_url: str) -> Optional[str]:
|
|
57
|
+
parsed = urlparse(source_url)
|
|
58
|
+
url_candidate = _sanitize_candidate_filename(unquote(Path(parsed.path).name))
|
|
59
|
+
if url_candidate is not None:
|
|
60
|
+
return url_candidate
|
|
61
|
+
query_params = parse_qs(parsed.query, keep_blank_values=True)
|
|
62
|
+
for key, values in query_params.items():
|
|
63
|
+
lower_key = key.lower()
|
|
64
|
+
if "name" in lower_key or "file" in lower_key:
|
|
65
|
+
for value in values:
|
|
66
|
+
sanitized = _sanitize_candidate_filename(unquote(value))
|
|
67
|
+
if sanitized is not None:
|
|
68
|
+
return sanitized
|
|
69
|
+
return None
|
|
70
|
+
|
|
71
|
+
def _resolve_download_path(request_url: str, response: Response, requested_output: Optional[str], requested_output_dir: Optional[str]) -> Path:
|
|
72
|
+
if requested_output is not None:
|
|
73
|
+
return Path(requested_output)
|
|
74
|
+
header_candidate = _filename_from_content_disposition(response.headers.get("content-disposition"))
|
|
75
|
+
if header_candidate is None:
|
|
76
|
+
header_candidate = _filename_from_url(response.url)
|
|
77
|
+
if header_candidate is None:
|
|
78
|
+
header_candidate = _filename_from_url(request_url)
|
|
79
|
+
if header_candidate is None:
|
|
80
|
+
header_candidate = "downloaded_file"
|
|
81
|
+
if requested_output_dir is not None:
|
|
82
|
+
return Path(requested_output_dir) / header_candidate
|
|
83
|
+
return Path(header_candidate)
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
with requests.get(url, allow_redirects=True, stream=True, timeout=60) as response:
|
|
87
|
+
response.raise_for_status()
|
|
88
|
+
download_path = _resolve_download_path(url, response, output, output_dir)
|
|
89
|
+
download_path.parent.mkdir(parents=True, exist_ok=True)
|
|
90
|
+
total_size_header = response.headers.get("content-length", "0")
|
|
91
|
+
try:
|
|
92
|
+
total_size = int(total_size_header)
|
|
93
|
+
except (TypeError, ValueError):
|
|
94
|
+
total_size = 0
|
|
95
|
+
if total_size <= 0:
|
|
96
|
+
with open(download_path, "wb") as file_handle:
|
|
97
|
+
file_handle.write(response.content)
|
|
98
|
+
else:
|
|
99
|
+
downloaded = 0
|
|
100
|
+
chunk_size = 8192 * 40
|
|
101
|
+
with open(download_path, "wb") as file_handle:
|
|
102
|
+
for chunk in response.iter_content(chunk_size=chunk_size):
|
|
103
|
+
if not chunk:
|
|
104
|
+
continue
|
|
105
|
+
file_handle.write(chunk)
|
|
106
|
+
downloaded += len(chunk)
|
|
107
|
+
progress = (downloaded / total_size) * 100
|
|
108
|
+
typer.echo(f"\r⏬ Progress: {progress:.1f}% ({downloaded}/{total_size} bytes)", nl=False)
|
|
109
|
+
typer.echo()
|
|
110
|
+
except requests.exceptions.RequestException as exception:
|
|
111
|
+
typer.echo(f"❌ Download failed: {exception}", err=True)
|
|
112
|
+
return None
|
|
113
|
+
except OSError as exception:
|
|
114
|
+
typer.echo(f"❌ File write error: {exception}", err=True)
|
|
115
|
+
return None
|
|
116
|
+
|
|
117
|
+
typer.echo(f"✅ Downloaded to: {download_path}")
|
|
118
|
+
result_path: Path = download_path
|
|
119
|
+
if decompress:
|
|
120
|
+
typer.echo(f"📦 Decompressing: {download_path}")
|
|
121
|
+
base_name = download_path.name.split(".", maxsplit=1)[0] # ouch decompresses all (e.g. .tar.gz) in one go.
|
|
122
|
+
if base_name in {"", ".", ".."}:
|
|
123
|
+
base_name = "extracted"
|
|
124
|
+
extract_dir = download_path.parent / base_name
|
|
125
|
+
extract_dir.mkdir(parents=True, exist_ok=True)
|
|
126
|
+
try:
|
|
127
|
+
subprocess.run(
|
|
128
|
+
["ouch", "decompress", str(download_path), "--dir", str(extract_dir)],
|
|
129
|
+
check=True,
|
|
130
|
+
capture_output=True,
|
|
131
|
+
text=True,
|
|
132
|
+
)
|
|
133
|
+
typer.echo(f"✅ Decompressed to: {extract_dir}")
|
|
134
|
+
if download_path.exists():
|
|
135
|
+
download_path.unlink()
|
|
136
|
+
typer.echo(f"🗑️ Removed archive: {download_path}")
|
|
137
|
+
result_path = extract_dir
|
|
138
|
+
except subprocess.CalledProcessError as exception:
|
|
139
|
+
typer.echo(f"❌ Decompression failed: {exception.stderr}", err=True)
|
|
140
|
+
return None
|
|
141
|
+
except FileNotFoundError:
|
|
142
|
+
typer.echo("❌ Error: ouch command not found. Please install ouch.", err=True)
|
|
143
|
+
typer.echo("💡 Install with: cargo install ouch", err=True)
|
|
144
|
+
return None
|
|
145
|
+
|
|
146
|
+
return result_path.resolve()
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
if __name__ == "__main__":
|
|
150
|
+
pass
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import typer
|
|
4
|
+
from typing import Annotated, Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def merge_pdfs(
|
|
8
|
+
pdfs: Annotated[list[str], typer.Argument(..., help="Paths to the PDF files to merge.")],
|
|
9
|
+
output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output merged PDF file path.")] = None,
|
|
10
|
+
compress: Annotated[bool, typer.Option("--compress", "-c", help="Compress the output PDF.")] = False,
|
|
11
|
+
) -> None:
|
|
12
|
+
def merge_pdfs_internal(pdfs: list[str], output: str | None, compress: bool) -> None:
|
|
13
|
+
from pypdf import PdfReader, PdfWriter
|
|
14
|
+
writer = PdfWriter()
|
|
15
|
+
for pdf_path in pdfs:
|
|
16
|
+
reader = PdfReader(pdf_path)
|
|
17
|
+
for page in reader.pages:
|
|
18
|
+
writer.add_page(page)
|
|
19
|
+
output_path = output if output else "merged.pdf"
|
|
20
|
+
if compress:
|
|
21
|
+
try:
|
|
22
|
+
for p in writer.pages:
|
|
23
|
+
try:
|
|
24
|
+
# PageObject.compress_content_streams exists in pypdf
|
|
25
|
+
p.compress_content_streams()
|
|
26
|
+
except Exception:
|
|
27
|
+
# best-effort: ignore per-page compression failures
|
|
28
|
+
continue
|
|
29
|
+
except Exception:
|
|
30
|
+
pass
|
|
31
|
+
try:
|
|
32
|
+
writer.compress_identical_objects()
|
|
33
|
+
except Exception:
|
|
34
|
+
# non-fatal if this fails
|
|
35
|
+
pass
|
|
36
|
+
writer.write(output_path)
|
|
37
|
+
print(f"✅ Merged PDF saved to: {output_path}")
|
|
38
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
39
|
+
code = lambda_to_python_script(lambda : merge_pdfs_internal(pdfs=pdfs, output=output, compress=compress),
|
|
40
|
+
in_global=True, import_module=False)
|
|
41
|
+
from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
|
|
42
|
+
uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pypdf"], uv_project_dir=None)
|
|
43
|
+
run_shell_script(uv_command, display_script=True, clean_env=False)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def compress_pdf(
|
|
47
|
+
pdf_input: Annotated[str, typer.Argument(..., help="Path to the input PDF file to compress.")],
|
|
48
|
+
output: Annotated[Optional[str], typer.Option("--output", "-o", help="Output compressed PDF file path.")] = None,
|
|
49
|
+
quality: Annotated[int, typer.Option("--quality", "-q", help="JPEG quality for image compression (0-100, 0=no change, 100=best).")] = 85,
|
|
50
|
+
image_dpi: Annotated[int, typer.Option("--image-dpi", "-d", help="Target DPI for image resampling. If set, images above this DPI will be downsampled.")] = 0,
|
|
51
|
+
# remove_images: Annotated[bool, typer.Option("--remove-images", "-r", help="Remove all images from the PDF.")] = False,
|
|
52
|
+
compress_streams: Annotated[bool, typer.Option("--compress-streams", "-c", help="Compress uncompressed streams.")] = True,
|
|
53
|
+
use_objstms: Annotated[bool, typer.Option("--object-streams", "-s", help="Use object streams for additional compression.")] = True,
|
|
54
|
+
) -> None:
|
|
55
|
+
def compress_pdf_internal(pdf_input: str, output: str | None, quality: int, image_dpi: int, compress_streams: bool, use_objstms: bool) -> None:
|
|
56
|
+
import pymupdf
|
|
57
|
+
from pathlib import Path
|
|
58
|
+
output_path = output if output else pdf_input.replace(".pdf", "_compressed.pdf")
|
|
59
|
+
doc = pymupdf.open(pdf_input)
|
|
60
|
+
try:
|
|
61
|
+
# if remove_images:
|
|
62
|
+
# for page in doc:
|
|
63
|
+
# page.remove_images()
|
|
64
|
+
if quality > 0 or image_dpi > 0:
|
|
65
|
+
doc.rewrite_images(
|
|
66
|
+
dpi_threshold=image_dpi if image_dpi > 0 else None,
|
|
67
|
+
dpi_target=max(72, image_dpi - 10) if image_dpi > 72 else 72,
|
|
68
|
+
quality=quality,
|
|
69
|
+
lossy=True,
|
|
70
|
+
lossless=True,
|
|
71
|
+
)
|
|
72
|
+
doc.save(
|
|
73
|
+
output_path,
|
|
74
|
+
deflate=compress_streams,
|
|
75
|
+
garbage=3,
|
|
76
|
+
use_objstms=1 if use_objstms else 0,
|
|
77
|
+
)
|
|
78
|
+
input_size = Path(pdf_input).stat().st_size
|
|
79
|
+
output_size = Path(output_path).stat().st_size
|
|
80
|
+
ratio = (1 - output_size / input_size) * 100
|
|
81
|
+
print(f"✅ Compressed PDF saved to: {output_path}")
|
|
82
|
+
print(f" Original: {input_size / 1024 / 1024:.2f} MB")
|
|
83
|
+
print(f" Compressed: {output_size / 1024 / 1024:.2f} MB")
|
|
84
|
+
print(f" Reduction: {ratio:.1f}%")
|
|
85
|
+
finally:
|
|
86
|
+
doc.close()
|
|
87
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
88
|
+
code = lambda_to_python_script(
|
|
89
|
+
lambda: compress_pdf_internal(pdf_input=pdf_input, output=output, quality=quality, image_dpi=image_dpi, compress_streams=compress_streams, use_objstms=use_objstms),
|
|
90
|
+
in_global=True,
|
|
91
|
+
import_module=False,
|
|
92
|
+
)
|
|
93
|
+
from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
|
|
94
|
+
uv_command, _py_file = get_uv_command_executing_python_script(python_script=code, uv_with=["pymupdf"], uv_project_dir=None)
|
|
95
|
+
run_shell_script(uv_command, display_script=True, clean_env=False)
|
|
96
|
+
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import typer
|
|
2
|
+
from typing import Optional, Annotated, Literal, TypedDict, cast
|
|
3
|
+
from machineconfig.utils.ssh_utils.abc import MACHINECONFIG_VERSION
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def tui_env(which: Annotated[Literal["PATH", "p", "ENV", "e"], typer.Argument(help="Which environment variable to display.")] = "ENV") -> None:
|
|
7
|
+
"""📚 NAVIGATE PATH variable with TUI"""
|
|
8
|
+
from machineconfig.scripts.python.helpers import helper_env as navigator
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
match which:
|
|
12
|
+
case "PATH" | "p":
|
|
13
|
+
path = Path(navigator.__file__).resolve().parent.joinpath("path_manager_tui.py")
|
|
14
|
+
case "ENV" | "e":
|
|
15
|
+
path = Path(navigator.__file__).resolve().parent.joinpath("env_manager_tui.py")
|
|
16
|
+
from machineconfig.utils.code import run_shell_script, get_uv_command_executing_python_script
|
|
17
|
+
|
|
18
|
+
uv_with = ["textual"]
|
|
19
|
+
uv_project_dir = None
|
|
20
|
+
if not Path.home().joinpath("code/machineconfig").exists():
|
|
21
|
+
uv_with.append(MACHINECONFIG_VERSION)
|
|
22
|
+
else:
|
|
23
|
+
uv_project_dir = str(Path.home().joinpath("code/machineconfig"))
|
|
24
|
+
run_shell_script(
|
|
25
|
+
get_uv_command_executing_python_script(python_script=path.read_text(encoding="utf-8"), uv_with=uv_with, uv_project_dir=uv_project_dir)[0],
|
|
26
|
+
display_script=True,
|
|
27
|
+
clean_env=False,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def init_project(
|
|
32
|
+
name: Annotated[Optional[str], typer.Option("--name", "-n", help="Name of the project.")] = None,
|
|
33
|
+
tmp_dir: Annotated[bool, typer.Option("--tmp-dir", "-t", help="Use a temporary directory for the project initialization.")] = False,
|
|
34
|
+
python: Annotated[
|
|
35
|
+
Literal["3.11", "3.12", "3.13", "3.14"], typer.Option("--python", "-p", help="Python sub version for the uv virtual environment.")
|
|
36
|
+
] = "3.13",
|
|
37
|
+
libraries: Annotated[
|
|
38
|
+
Optional[str], typer.Option("--libraries", "-l", help="Additional packages to include in the uv virtual environment (space separated).")
|
|
39
|
+
] = None,
|
|
40
|
+
group: Annotated[
|
|
41
|
+
Optional[str], typer.Option("--group", "-g", help="group of packages names (no separation) p:plot, t:types, l:linting, i:interactive, d:data")
|
|
42
|
+
] = "p,t,l,i,d",
|
|
43
|
+
) -> None:
|
|
44
|
+
if libraries is not None:
|
|
45
|
+
packages_add_line = f"uv add {libraries}"
|
|
46
|
+
else:
|
|
47
|
+
packages_add_line = ""
|
|
48
|
+
from pathlib import Path
|
|
49
|
+
|
|
50
|
+
if not tmp_dir:
|
|
51
|
+
repo_root = Path.cwd()
|
|
52
|
+
if not (repo_root / "pyproject.toml").exists():
|
|
53
|
+
typer.echo(f"❌ Error: pyproject.toml not found in {repo_root}", err=True)
|
|
54
|
+
raise typer.Exit(code=1)
|
|
55
|
+
starting_code = ""
|
|
56
|
+
agents_line = ""
|
|
57
|
+
else:
|
|
58
|
+
agents_line = """agents make-config"""
|
|
59
|
+
if name is not None:
|
|
60
|
+
from machineconfig.utils.accessories import randstr
|
|
61
|
+
|
|
62
|
+
repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{name}")
|
|
63
|
+
else:
|
|
64
|
+
from machineconfig.utils.accessories import randstr
|
|
65
|
+
|
|
66
|
+
repo_root = Path.home().joinpath(f"tmp_results/tmp_projects/{randstr(6)}")
|
|
67
|
+
repo_root.mkdir(parents=True, exist_ok=True)
|
|
68
|
+
print(f"Using temporary directory for project initialization: {repo_root}")
|
|
69
|
+
starting_code = f"""
|
|
70
|
+
cd {repo_root}
|
|
71
|
+
uv init --python {python}
|
|
72
|
+
uv venv
|
|
73
|
+
"""
|
|
74
|
+
print(f"Adding group `{group}` with common data science and plotting packages...")
|
|
75
|
+
total_packages: dict[str, list[str]] = {}
|
|
76
|
+
if group is not None:
|
|
77
|
+
packages = group.split(",")
|
|
78
|
+
if "t" in packages or "types" in packages:
|
|
79
|
+
total_packages["types"] = [
|
|
80
|
+
"types-python-dateutil",
|
|
81
|
+
"types-pyyaml",
|
|
82
|
+
"types-requests",
|
|
83
|
+
"types-tqdm",
|
|
84
|
+
"types-mysqlclient",
|
|
85
|
+
"types-paramiko",
|
|
86
|
+
"types-pytz",
|
|
87
|
+
"types-sqlalchemy",
|
|
88
|
+
"types-toml",
|
|
89
|
+
"types-urllib3",
|
|
90
|
+
]
|
|
91
|
+
if "l" in packages:
|
|
92
|
+
total_packages["linting"] = ["mypy", "pyright", "ruff", "pylint", "pyrefly", "cleanpy", "ipdb", "pudb"]
|
|
93
|
+
if "i" in packages:
|
|
94
|
+
total_packages["interactive"] = ["ipython", "ipykernel", "jupyterlab", "nbformat", "marimo"]
|
|
95
|
+
if "p" in packages:
|
|
96
|
+
total_packages["plot"] = ["python-magic", "matplotlib", "plotly", "kaleido"]
|
|
97
|
+
if "d" in packages:
|
|
98
|
+
total_packages["data"] = ["numpy", "pandas", "polars", "duckdb-engine", "sqlalchemy", "psycopg2-binary", "pyarrow", "tqdm", "openpyxl"]
|
|
99
|
+
from machineconfig.utils.ve import get_ve_activate_line
|
|
100
|
+
groups_packages_lines = "\n".join(
|
|
101
|
+
[f"uv add --group {group_name} {' '.join(packages)}" for group_name, packages in total_packages.items()]
|
|
102
|
+
)
|
|
103
|
+
script = f"""
|
|
104
|
+
{starting_code}
|
|
105
|
+
{packages_add_line}
|
|
106
|
+
{groups_packages_lines}
|
|
107
|
+
{get_ve_activate_line(ve_root=str(repo_root.joinpath(".venv")))}
|
|
108
|
+
{agents_line}
|
|
109
|
+
ls
|
|
110
|
+
"""
|
|
111
|
+
from machineconfig.utils.code import exit_then_run_shell_script, run_shell_script
|
|
112
|
+
exit_then_run_shell_script(script)
|
|
113
|
+
_ = exit_then_run_shell_script, run_shell_script
|
|
114
|
+
# run_shell_script(script)
|
|
115
|
+
# if tempdir:
|
|
116
|
+
# from machineconfig.scripts.python.ai.initai import add_ai_configs
|
|
117
|
+
# add_ai_configs(repo_root=repo_root)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def edit_file_with_hx(
|
|
121
|
+
path: Annotated[Optional[str], typer.Argument(..., help="The root directory of the project to edit, or a file path.")] = None,
|
|
122
|
+
) -> None:
|
|
123
|
+
from pathlib import Path
|
|
124
|
+
|
|
125
|
+
if path is None:
|
|
126
|
+
root_path = Path.cwd()
|
|
127
|
+
print(f"No path provided. Using current working directory: {root_path}")
|
|
128
|
+
else:
|
|
129
|
+
root_path = Path(path).expanduser().resolve()
|
|
130
|
+
print(f"Using provided path: {root_path}")
|
|
131
|
+
from machineconfig.utils.accessories import get_repo_root
|
|
132
|
+
|
|
133
|
+
repo_root = get_repo_root(root_path)
|
|
134
|
+
if repo_root is not None and repo_root.joinpath("pyproject.toml").exists():
|
|
135
|
+
code = f"""
|
|
136
|
+
cd {repo_root}
|
|
137
|
+
uv add --dev pylsp-mypy python-lsp-server[all] pyright ruff-lsp # for helix editor.
|
|
138
|
+
source ./.venv/bin/activate
|
|
139
|
+
"""
|
|
140
|
+
else:
|
|
141
|
+
code = ""
|
|
142
|
+
if root_path.is_file():
|
|
143
|
+
code += f"hx {root_path}"
|
|
144
|
+
else:
|
|
145
|
+
code += "hx"
|
|
146
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
147
|
+
|
|
148
|
+
exit_then_run_shell_script(code)
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class MachineSpecs(TypedDict):
|
|
152
|
+
system: Literal["Windows", "Linux", "Darwin"]
|
|
153
|
+
distro: str
|
|
154
|
+
home_dir: str
|
|
155
|
+
hostname: str
|
|
156
|
+
release: str
|
|
157
|
+
version: str
|
|
158
|
+
machine: str
|
|
159
|
+
processor: str
|
|
160
|
+
python_version: str
|
|
161
|
+
user: str
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def get_machine_specs(hardware: Annotated[bool, typer.Option(..., "--hardware", "-h", help="Show compute capability")] = False) -> MachineSpecs:
|
|
165
|
+
"""Write print and return the local machine specs."""
|
|
166
|
+
if hardware:
|
|
167
|
+
from machineconfig.scripts.python.helpers.helpers_utils.specs import main
|
|
168
|
+
main()
|
|
169
|
+
import sys
|
|
170
|
+
sys.exit()
|
|
171
|
+
|
|
172
|
+
import platform
|
|
173
|
+
from machineconfig.utils.code import get_uv_command
|
|
174
|
+
|
|
175
|
+
uv_cmd = get_uv_command(platform=platform.system()) # type: ignore
|
|
176
|
+
command = f"""{uv_cmd} run --with distro python -c "import distro; print(distro.name(pretty=True))" """
|
|
177
|
+
import subprocess
|
|
178
|
+
from pathlib import Path
|
|
179
|
+
import socket
|
|
180
|
+
import os
|
|
181
|
+
|
|
182
|
+
distro = subprocess.run(command, shell=True, capture_output=True, text=True).stdout.strip()
|
|
183
|
+
system = platform.system()
|
|
184
|
+
if system not in {"Windows", "Linux", "Darwin"}:
|
|
185
|
+
system = "Linux"
|
|
186
|
+
specs: MachineSpecs = {
|
|
187
|
+
"system": cast(Literal["Windows", "Linux", "Darwin"], system),
|
|
188
|
+
"distro": distro,
|
|
189
|
+
"home_dir": str(Path.home()),
|
|
190
|
+
"hostname": socket.gethostname(),
|
|
191
|
+
"release": platform.release(),
|
|
192
|
+
"version": platform.version(),
|
|
193
|
+
"machine": platform.machine(),
|
|
194
|
+
"processor": platform.processor() or "Unknown",
|
|
195
|
+
"python_version": platform.python_version(),
|
|
196
|
+
"user": os.getenv("USER") or os.getenv("USERNAME") or "Unknown",
|
|
197
|
+
}
|
|
198
|
+
print(specs)
|
|
199
|
+
from machineconfig.utils.source_of_truth import CONFIG_ROOT
|
|
200
|
+
|
|
201
|
+
path = CONFIG_ROOT.joinpath("machine_specs.json")
|
|
202
|
+
CONFIG_ROOT.mkdir(parents=True, exist_ok=True)
|
|
203
|
+
import json
|
|
204
|
+
|
|
205
|
+
path.write_text(json.dumps(specs, indent=4), encoding="utf-8")
|
|
206
|
+
return specs
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
if __name__ == "__main__":
|
|
210
|
+
get_machine_specs()
|