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
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
"""run python/shell scripts from pre-defined directorys, or, run command/file in the machineconfig environment
|
|
4
|
+
|
|
5
|
+
Recursively Searched Predefined Directories:
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
* 'private' : $HOME/dotfiles/scripts
|
|
9
|
+
|
|
10
|
+
* 'public' : $HOME/.config/machineconfig/scripts
|
|
11
|
+
|
|
12
|
+
* 'library' : $MACHINECONFIG_LIBRARY_ROOT/jobs/scripts
|
|
13
|
+
|
|
14
|
+
* 'dynamic' : fetched from GitHub repository on the fly (relies on latest commit, rather than the version currently installed)
|
|
15
|
+
|
|
16
|
+
* 'custom' : custom directories from comma separated entry 'scripts' under 'general' section @ ~/dotfiles/machineconfig/defaults.ini
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
import typer
|
|
22
|
+
from typing import Annotated, Optional, Literal
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def run_py_script(ctx: typer.Context,
|
|
26
|
+
name: Annotated[str, typer.Argument(help="Name of script to run, e.g., 'a' for a.py, or command to execute")] = "",
|
|
27
|
+
where: Annotated[Literal["all", "a", "private", "p", "public", "b", "library", "l", "dynamic", "d", "custom", "c"], typer.Option("--where", "-w", help="Where to look for the script")] = "all",
|
|
28
|
+
interactive: Annotated[bool, typer.Option(..., "--interactive", "-i", help="Interactive selection of scripts to run")] = False,
|
|
29
|
+
command: Annotated[Optional[bool], typer.Option(..., "--command", "-c", help="Run as command")] = False,
|
|
30
|
+
list_scripts: Annotated[bool, typer.Option(..., "--list", "-l", help="List available scripts in all locations")] = False,
|
|
31
|
+
) -> None:
|
|
32
|
+
if command:
|
|
33
|
+
exec(name)
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
from pathlib import Path
|
|
37
|
+
if list_scripts:
|
|
38
|
+
from machineconfig.scripts.python.helpers.helpers_search.script_help import list_available_scripts
|
|
39
|
+
list_available_scripts(where=where)
|
|
40
|
+
return
|
|
41
|
+
|
|
42
|
+
if not interactive and not name:
|
|
43
|
+
typer.echo("❌ ERROR: You must provide a script name or use --interactive option to select a script.")
|
|
44
|
+
raise typer.Exit(code=1)
|
|
45
|
+
target_file: Optional[Path] = None
|
|
46
|
+
|
|
47
|
+
if where in ["dynamic", "d"]:
|
|
48
|
+
# src/machineconfig/jobs/scripts/python_scripts/a.py
|
|
49
|
+
if "." in name: resolved_names: list[str] = [name]
|
|
50
|
+
else: resolved_names = [f"{name}{a_suffix}" for a_suffix in [".py", ".sh", "", ".ps1", ".bat", ".cmd"]]
|
|
51
|
+
urls = [f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/jobs/scripts_dynamic/{a_resolved_name}""" for a_resolved_name in resolved_names]
|
|
52
|
+
for a_url in urls:
|
|
53
|
+
try:
|
|
54
|
+
print(f"Fetching temporary script from {a_url} ...")
|
|
55
|
+
import requests
|
|
56
|
+
response = requests.get(a_url)
|
|
57
|
+
if response.status_code != 200:
|
|
58
|
+
print(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}")
|
|
59
|
+
raise RuntimeError(f"Could not fetch script '{name}.py' from repository.")
|
|
60
|
+
script_content = response.text
|
|
61
|
+
target_file = Path.home().joinpath("tmp_results", "tmp_scripts", "python", f"{name}.py")
|
|
62
|
+
target_file.parent.mkdir(parents=True, exist_ok=True)
|
|
63
|
+
target_file.write_text(script_content, encoding="utf-8")
|
|
64
|
+
except Exception as _e:
|
|
65
|
+
pass
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
if target_file is None and Path(name).is_file():
|
|
69
|
+
if name.endswith(".py"):
|
|
70
|
+
import machineconfig
|
|
71
|
+
import subprocess
|
|
72
|
+
import sys
|
|
73
|
+
subprocess.run([sys.executable, name], cwd=machineconfig.__path__[0])
|
|
74
|
+
return
|
|
75
|
+
else:
|
|
76
|
+
if Path(name).suffix in [".sh", ".ps1", ".bat", ".cmd", ""]:
|
|
77
|
+
target_file = Path(name)
|
|
78
|
+
else:
|
|
79
|
+
print(f"❌ Error: File '{name}' is not a recognized script type. Supported types are {'.py', '.sh', '.ps1', '.bat', '.cmd', ''}.")
|
|
80
|
+
raise typer.Exit(code=1)
|
|
81
|
+
|
|
82
|
+
from machineconfig.utils.source_of_truth import CONFIG_ROOT, LIBRARY_ROOT, DEFAULTS_PATH
|
|
83
|
+
private_root = Path.home().joinpath("dotfiles/scripts") # local directory
|
|
84
|
+
public_root = CONFIG_ROOT.joinpath("scripts") # local machineconfig directory
|
|
85
|
+
library_root = LIBRARY_ROOT.joinpath("jobs", "scripts")
|
|
86
|
+
|
|
87
|
+
def get_custom_roots() -> list[Path]:
|
|
88
|
+
custom_roots: list[Path] = []
|
|
89
|
+
if DEFAULTS_PATH.is_file():
|
|
90
|
+
from configparser import ConfigParser
|
|
91
|
+
config = ConfigParser()
|
|
92
|
+
config.read(DEFAULTS_PATH)
|
|
93
|
+
if config.has_section("general") and config.has_option("general", "scripts"):
|
|
94
|
+
custom_dirs = config.get("general", "scripts").split(",")
|
|
95
|
+
for custom_dir in custom_dirs:
|
|
96
|
+
custom_path = Path(custom_dir.strip()).expanduser().resolve()
|
|
97
|
+
if custom_path.is_dir():
|
|
98
|
+
custom_roots.append(custom_path)
|
|
99
|
+
return custom_roots
|
|
100
|
+
|
|
101
|
+
roots: list[Path] = []
|
|
102
|
+
match where:
|
|
103
|
+
case "all" | "a":
|
|
104
|
+
roots = [private_root, public_root, library_root] + get_custom_roots()
|
|
105
|
+
case "private" | "p":
|
|
106
|
+
roots = [private_root]
|
|
107
|
+
case "public" | "b":
|
|
108
|
+
roots = [public_root]
|
|
109
|
+
case "library" | "l":
|
|
110
|
+
roots = [library_root]
|
|
111
|
+
case "dynamic" | "d":
|
|
112
|
+
roots = []
|
|
113
|
+
case "custom" | "c":
|
|
114
|
+
roots = get_custom_roots()
|
|
115
|
+
|
|
116
|
+
suffixes: list[str]
|
|
117
|
+
if "." in name:
|
|
118
|
+
suffixes = [""]
|
|
119
|
+
else:
|
|
120
|
+
import platform
|
|
121
|
+
if platform.system() == "Windows":
|
|
122
|
+
suffixes = [".py", ".bat", ".cmd", ".ps1"]
|
|
123
|
+
elif platform.system() == "Darwin" or platform.system() == "Linux":
|
|
124
|
+
suffixes = [""] # files without suffix could be shell scripts, and that already cover files with .sh suffix without duplications
|
|
125
|
+
else:
|
|
126
|
+
suffixes = [".py"]
|
|
127
|
+
|
|
128
|
+
# Finding target file
|
|
129
|
+
potential_matches: list[Path] = []
|
|
130
|
+
if target_file is None:
|
|
131
|
+
for a_root in roots:
|
|
132
|
+
for a_suffix in suffixes:
|
|
133
|
+
if a_root.joinpath(f"{name}{a_suffix}").is_file():
|
|
134
|
+
target_file = a_root.joinpath(f"{name}{a_suffix}")
|
|
135
|
+
break # perfect match
|
|
136
|
+
potential_matches += [a_file for a_file in a_root.rglob(f"*{name}*{a_suffix}") if a_file.is_file()]
|
|
137
|
+
|
|
138
|
+
if target_file is None:
|
|
139
|
+
if len(potential_matches) == 1:
|
|
140
|
+
target_file = potential_matches[0]
|
|
141
|
+
elif len(potential_matches) == 0:
|
|
142
|
+
typer.echo(ctx.get_help())
|
|
143
|
+
typer.echo()
|
|
144
|
+
typer.echo(typer.style(f"❌ ERROR: Could not find script '{name}'.", fg=typer.colors.RED, bold=True))
|
|
145
|
+
typer.echo("Searched in:")
|
|
146
|
+
for r in roots:
|
|
147
|
+
typer.echo(f" - {r}")
|
|
148
|
+
raise typer.Exit(code=1)
|
|
149
|
+
else:
|
|
150
|
+
typer.echo(typer.style(f"Warning: Could not find script '{name}'. Checked {len(potential_matches)} candidate files, trying interactively:", fg=typer.colors.YELLOW))
|
|
151
|
+
from machineconfig.utils.options import choose_from_options
|
|
152
|
+
options = [str(p) for p in potential_matches]
|
|
153
|
+
chosen_file_part = choose_from_options(options, multi=False, msg="Select the script to run:", tv=True, preview="bat")
|
|
154
|
+
target_file = Path(chosen_file_part)
|
|
155
|
+
|
|
156
|
+
typer.echo(typer.style(f"✅ Found script at: {target_file}", fg=typer.colors.GREEN))
|
|
157
|
+
if target_file.suffix == ".py":
|
|
158
|
+
from machineconfig.utils.code import get_uv_command_executing_python_file, exit_then_run_shell_script
|
|
159
|
+
shell_script = get_uv_command_executing_python_file(python_file=str(target_file), uv_project_dir=None, uv_with=None, prepend_print=False)
|
|
160
|
+
exit_then_run_shell_script(script=shell_script)
|
|
161
|
+
else:
|
|
162
|
+
from machineconfig.utils.code import exit_then_run_shell_file
|
|
163
|
+
exit_then_run_shell_file(script_path=str(target_file), strict=True)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def copy_script_to_local(ctx: typer.Context,
|
|
167
|
+
name: Annotated[str, typer.Argument(help="Name of the temporary python script to copy, e.g., 'a' for a.py")],
|
|
168
|
+
alias: Annotated[Optional[str], typer.Option("--alias", "-a", help="Whether to create call it a different name locally")] = None
|
|
169
|
+
) -> None:
|
|
170
|
+
"""
|
|
171
|
+
Copy a temporary python script stored in machineconfig/scripts/python/helpers/tmp_py_scripts to the local machine.
|
|
172
|
+
"""
|
|
173
|
+
url = f"""https://raw.githubusercontent.com/thisismygitrepo/machineconfig/refs/heads/main/src/machineconfig/scripts/python/helpers/tmp_py_scripts/{name}.py"""
|
|
174
|
+
import requests
|
|
175
|
+
response = requests.get(url)
|
|
176
|
+
if response.status_code != 200:
|
|
177
|
+
typer.echo(ctx.get_help())
|
|
178
|
+
typer.echo()
|
|
179
|
+
typer.echo(typer.style(f"❌ ERROR: Could not fetch script '{name}.py' from repository. Status Code: {response.status_code}", fg=typer.colors.RED, bold=True))
|
|
180
|
+
raise typer.Exit(code=1)
|
|
181
|
+
script_content = response.text
|
|
182
|
+
from machineconfig.utils.source_of_truth import CONFIG_ROOT
|
|
183
|
+
local_path = CONFIG_ROOT.joinpath(f"scripts_python/{alias or name}.py")
|
|
184
|
+
with open(local_path, "w") as f:
|
|
185
|
+
f.write(script_content)
|
|
186
|
+
typer.echo(typer.style(f"✅ Script '{name}.py' has been copied to '{local_path}'.", fg=typer.colors.GREEN))
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def get_app():
|
|
190
|
+
app = typer.Typer(
|
|
191
|
+
name="run-tmp-script",
|
|
192
|
+
help="Helper to run temporary python scripts stored in machineconfig/scripts/python/helpers/tmp_py_scripts",
|
|
193
|
+
no_args_is_help=True,
|
|
194
|
+
)
|
|
195
|
+
from machineconfig.jobs.scripts_dynamic import a
|
|
196
|
+
app.command()(a.main)
|
|
197
|
+
return app
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
$presets = @{
|
|
2
|
+
"nerd-font-symbols" = "Changes the symbols for each module to use Nerd Font symbols."
|
|
3
|
+
"no-nerd-font" = "Changes the symbols so that no Nerd Font symbols are used."
|
|
4
|
+
"bracketed-segments" = "Changes the format to show segments in brackets."
|
|
5
|
+
"plain-text-symbols" = "Changes the symbols for each module into plain text."
|
|
6
|
+
"no-runtime-versions" = "Hides the version of language runtimes."
|
|
7
|
+
"no-empty-icons" = "Does not show icons if the toolset is not found."
|
|
8
|
+
"pure-preset" = "Emulates the look and behavior of Pure."
|
|
9
|
+
"pastel-powerline" = "Inspired by M365Princess."
|
|
10
|
+
"tokyo-night" = "Inspired by tokyo-night-vscode-theme."
|
|
11
|
+
"gruvbox-rainbow" = "Inspired by Pastel Powerline and Tokyo Night."
|
|
12
|
+
"jetpack" = "Pseudo minimalist preset inspired by geometry and spaceship."
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
$input_list = $presets.Keys | ForEach-Object { "$_`t$($presets[$_])" }
|
|
16
|
+
|
|
17
|
+
$preview_config = "$env:TEMP/starship_preview.toml"
|
|
18
|
+
|
|
19
|
+
# Preview command for PowerShell
|
|
20
|
+
# We need to split the line and get the first part.
|
|
21
|
+
# tv replaces {} with the line.
|
|
22
|
+
# We use powershell -c for the preview command to be safe and consistent.
|
|
23
|
+
|
|
24
|
+
$preview_cmd = "powershell -c `"`$preset = '{}'.Split('`t')[0]; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`""
|
|
25
|
+
|
|
26
|
+
if (Get-Command "tv" -ErrorAction SilentlyContinue) {
|
|
27
|
+
$selected_line = $input_list | tv --preview-command $preview_cmd --preview-size 50
|
|
28
|
+
} elseif (Get-Command "fzf" -ErrorAction SilentlyContinue) {
|
|
29
|
+
# fzf fallback
|
|
30
|
+
$selected_line = $input_list | fzf --ansi --delimiter "`t" --with-nth 1,2 --preview "powershell -c `"`$preset = {1}; starship preset `$preset > $preview_config; `$env:STARSHIP_CONFIG='$preview_config'; `$env:STARSHIP_SHELL='powershell'; starship prompt`"" --preview-window bottom:50%
|
|
31
|
+
} else {
|
|
32
|
+
Write-Host "Error: 'tv' or 'fzf' not found."
|
|
33
|
+
exit 1
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if ($selected_line) {
|
|
37
|
+
$selected_preset = $selected_line.Split("`t")[0]
|
|
38
|
+
Write-Host "Applying $selected_preset..."
|
|
39
|
+
starship preset $selected_preset -o "$HOME/.config/starship.toml"
|
|
40
|
+
Write-Host "Done!"
|
|
41
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Ensure UTF-8 encoding for symbols and CLI tools
|
|
4
|
+
export LANG=C.UTF-8
|
|
5
|
+
export LC_ALL=C.UTF-8
|
|
6
|
+
export LC_CTYPE=C.UTF-8
|
|
7
|
+
export PYTHONIOENCODING=utf-8
|
|
8
|
+
|
|
9
|
+
# Presets
|
|
10
|
+
presets=(
|
|
11
|
+
"nerd-font-symbols Changes the symbols for each module to use Nerd Font symbols."
|
|
12
|
+
"no-nerd-font Changes the symbols so that no Nerd Font symbols are used."
|
|
13
|
+
"bracketed-segments Changes the format to show segments in brackets."
|
|
14
|
+
"plain-text-symbols Changes the symbols for each module into plain text."
|
|
15
|
+
"no-runtime-versions Hides the version of language runtimes."
|
|
16
|
+
"no-empty-icons Does not show icons if the toolset is not found."
|
|
17
|
+
"pure-preset Emulates the look and behavior of Pure."
|
|
18
|
+
"pastel-powerline Inspired by M365Princess."
|
|
19
|
+
"tokyo-night Inspired by tokyo-night-vscode-theme."
|
|
20
|
+
"gruvbox-rainbow Inspired by Pastel Powerline and Tokyo Night."
|
|
21
|
+
"jetpack Pseudo minimalist preset inspired by geometry and spaceship."
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
# Join presets with newlines
|
|
25
|
+
input_data=$(printf "%s\n" "${presets[@]}")
|
|
26
|
+
|
|
27
|
+
preview_config="/tmp/starship_preview.toml"
|
|
28
|
+
# Preview command needs to extract the first column (preset name) from the line
|
|
29
|
+
# {} will be replaced by the selected line
|
|
30
|
+
# We use awk to handle multiple spaces as delimiter
|
|
31
|
+
preview_cmd="preset=\$(echo '{}' | awk '{print \$1}'); starship preset \"\$preset\" > $preview_config && LANG=C.UTF-8 LC_ALL=C.UTF-8 STARSHIP_CONFIG=$preview_config STARSHIP_SHELL=fish starship prompt"
|
|
32
|
+
|
|
33
|
+
if command -v tv &> /dev/null; then
|
|
34
|
+
# tv requires input from stdin if no source-command is given
|
|
35
|
+
selected_line=$(printf "%s" "$input_data" | LANG=C.UTF-8 LC_ALL=C.UTF-8 tv --ansi --preview-command "$preview_cmd" --preview-size 50)
|
|
36
|
+
elif command -v fzf &> /dev/null; then
|
|
37
|
+
selected_line=$(printf "%s" "$input_data" | LANG=C.UTF-8 LC_ALL=C.UTF-8 fzf --ansi --preview "preset=\$(echo {} | awk '{print \$1}'); starship preset \$preset > $preview_config && LANG=C.UTF-8 LC_ALL=C.UTF-8 STARSHIP_CONFIG=$preview_config STARSHIP_SHELL=fish starship prompt" --preview-window bottom:30%)
|
|
38
|
+
else
|
|
39
|
+
echo "Error: 'tv' or 'fzf' not found."
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
if [ -n "$selected_line" ]; then
|
|
44
|
+
selected_preset=$(echo "$selected_line" | awk '{print $1}')
|
|
45
|
+
echo "Applying $selected_preset..."
|
|
46
|
+
starship preset "$selected_preset" -o ~/.config/starship.toml
|
|
47
|
+
echo "Done!"
|
|
48
|
+
fi
|
|
@@ -3,7 +3,7 @@ Choose a theme for Wezterm
|
|
|
3
3
|
"""
|
|
4
4
|
|
|
5
5
|
from machineconfig.utils.options import choose_from_options
|
|
6
|
-
from
|
|
6
|
+
from pathlib import Path
|
|
7
7
|
from typing import Any
|
|
8
8
|
import time
|
|
9
9
|
from rich.panel import Panel
|
|
@@ -45,21 +45,21 @@ 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
|
|
|
52
52
|
|
|
53
53
|
def set_theme(theme: str):
|
|
54
54
|
print(f"🔄 Setting WezTerm theme to: {theme}")
|
|
55
|
-
txt_lines =
|
|
55
|
+
txt_lines = Path.home().joinpath(".config/wezterm/wezterm.lua").expanduser().read_text(encoding="utf-8").splitlines()
|
|
56
56
|
res_lines = []
|
|
57
57
|
for line in txt_lines:
|
|
58
58
|
if "config.color_scheme = " in line:
|
|
59
59
|
res_lines.append(f"config.color_scheme = '{theme}'")
|
|
60
60
|
else:
|
|
61
61
|
res_lines.append(line)
|
|
62
|
-
|
|
62
|
+
Path.home().joinpath(".config/wezterm/wezterm.lua").expanduser().write_text("\n".join(res_lines), encoding="utf-8")
|
|
63
63
|
time.sleep(0.1)
|
|
64
64
|
print("💾 Configuration saved")
|
|
65
65
|
|
|
@@ -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,57 @@ 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
|
+
from pathlib import Path
|
|
106
|
+
sys.path.append(str(Path(pyfile).parent))
|
|
107
|
+
if repo_root is not None:
|
|
108
|
+
sys.path.append(repo_root)
|
|
109
|
+
exec(f"from {Path(pyfile).stem} import *")
|
|
110
|
+
print(fr"✅ Successfully imported `{pyfile}`")
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def add_to_path(path_variable: str, directory: str) -> str:
|
|
114
|
+
"""
|
|
115
|
+
Generate shell script to add directory to path_variable.
|
|
116
|
+
Handles both Windows (cmd) and Unix-like systems (bash/zsh).
|
|
117
|
+
Checks if variable exists before appending, otherwise creates it.
|
|
118
|
+
"""
|
|
119
|
+
system = platform.system()
|
|
120
|
+
|
|
121
|
+
if system == "Windows":
|
|
122
|
+
script = f"""# Check if {path_variable} is defined
|
|
123
|
+
if (Test-Path env:{path_variable}) {{
|
|
124
|
+
Write-Host "Adding {directory} to existing {path_variable}"
|
|
125
|
+
$currentValue = [Environment]::GetEnvironmentVariable("{path_variable}", "User")
|
|
126
|
+
$newValue = "$currentValue;{directory}"
|
|
127
|
+
[Environment]::SetEnvironmentVariable("{path_variable}", $newValue, "User")
|
|
128
|
+
$env:{path_variable} = $newValue
|
|
129
|
+
}} else {{
|
|
130
|
+
Write-Host "Creating new {path_variable} variable"
|
|
131
|
+
[Environment]::SetEnvironmentVariable("{path_variable}", "{directory}", "User")
|
|
132
|
+
$env:{path_variable} = "{directory}"
|
|
133
|
+
}}
|
|
134
|
+
Write-Host "{path_variable} is now: $env:{path_variable}\""""
|
|
135
|
+
return script
|
|
136
|
+
else:
|
|
137
|
+
script = f"""#!/bin/bash
|
|
138
|
+
# Check if {path_variable} is defined and not empty
|
|
139
|
+
if [ -z "${{{path_variable}}}" ]; then
|
|
140
|
+
echo "Creating new {path_variable} variable"
|
|
141
|
+
export {path_variable}="{directory}"
|
|
142
|
+
else
|
|
143
|
+
echo "Adding {directory} to existing {path_variable}"
|
|
144
|
+
export {path_variable}="${{{path_variable}}}:{directory}"
|
|
145
|
+
fi
|
|
146
|
+
echo "{path_variable} is now: ${{{path_variable}}}"
|
|
147
|
+
"""
|
|
148
|
+
return script
|
|
149
|
+
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
"""Pure Python implementation for fire_jobs route command - no typer dependencies."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Callable
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_args_helper import FireJobArgs
|
|
6
|
+
|
|
7
|
+
RandStrFunc = Callable[[int], str]
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def route(args: FireJobArgs, fire_args: str) -> None:
|
|
11
|
+
"""Route execution based on args configuration."""
|
|
12
|
+
from machineconfig.utils.path_helper import get_choice_file
|
|
13
|
+
from machineconfig.utils.accessories import get_repo_root, randstr
|
|
14
|
+
|
|
15
|
+
choice_file = get_choice_file(args.path, suffixes=None)
|
|
16
|
+
repo_root = get_repo_root(choice_file)
|
|
17
|
+
print(f"💾 Selected file: {choice_file}.\nRepo root: {repo_root}")
|
|
18
|
+
|
|
19
|
+
if args.marimo:
|
|
20
|
+
_handle_marimo(choice_file=choice_file, repo_root=repo_root, randstr_func=randstr)
|
|
21
|
+
return
|
|
22
|
+
|
|
23
|
+
kwargs_dict = _prepare_kwargs(args=args, choice_file=choice_file)
|
|
24
|
+
choice_function = _choose_function(args=args, choice_file=choice_file, kwargs_dict=kwargs_dict)
|
|
25
|
+
if isinstance(choice_function, tuple):
|
|
26
|
+
choice_function, choice_file, kwargs_dict = choice_function
|
|
27
|
+
|
|
28
|
+
command = _build_command(args=args, choice_file=choice_file, choice_function=choice_function, kwargs_dict=kwargs_dict, repo_root=repo_root, fire_args=fire_args, randstr_func=randstr)
|
|
29
|
+
command = _apply_command_modifiers(args=args, command=command, choice_file=choice_file, repo_root=repo_root, randstr_func=randstr)
|
|
30
|
+
|
|
31
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
32
|
+
exit_then_run_shell_script(script=command, strict=False)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _handle_marimo(choice_file: Path, repo_root: Optional[Path], randstr_func: RandStrFunc) -> None:
|
|
36
|
+
"""Handle marimo notebook launch."""
|
|
37
|
+
print(f"🧽 Preparing to launch Marimo notebook for `{choice_file}`...")
|
|
38
|
+
tmp_dir = Path.home().joinpath(f"tmp_results/tmp_scripts/marimo/{choice_file.stem}_{randstr_func(10)}")
|
|
39
|
+
tmp_dir.mkdir(parents=True, exist_ok=True)
|
|
40
|
+
script = f"""
|
|
41
|
+
cd {tmp_dir}
|
|
42
|
+
uv run --python 3.14 --with marimo marimo convert {choice_file} -o marimo_nb.py
|
|
43
|
+
uv run --project {repo_root} --with marimo marimo edit --host 0.0.0.0 marimo_nb.py
|
|
44
|
+
"""
|
|
45
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
46
|
+
print(f"🚀 Launching Marimo notebook for `{choice_file}`...")
|
|
47
|
+
exit_then_run_shell_script(script)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _prepare_kwargs(args: FireJobArgs, choice_file: Path) -> dict[str, object]:
|
|
51
|
+
"""Prepare kwargs dict from args."""
|
|
52
|
+
if choice_file.suffix == ".py":
|
|
53
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_args_helper import extract_kwargs
|
|
54
|
+
return extract_kwargs(args)
|
|
55
|
+
return {}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _choose_function(args: FireJobArgs, choice_file: Path, kwargs_dict: dict[str, object]) -> Optional[str] | tuple[Optional[str], Path, dict[str, object]]:
|
|
59
|
+
"""Choose function to run, possibly interactively."""
|
|
60
|
+
if args.choose_function:
|
|
61
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import choose_function_or_lines
|
|
62
|
+
choice_function, choice_file, kwargs_dict = choose_function_or_lines(choice_file, kwargs_dict)
|
|
63
|
+
return (choice_function, choice_file, kwargs_dict)
|
|
64
|
+
return args.function
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _build_command(args: FireJobArgs, choice_file: Path, choice_function: Optional[str], kwargs_dict: dict[str, object], repo_root: Optional[Path], fire_args: str, randstr_func: RandStrFunc) -> str:
|
|
68
|
+
"""Build the execution command."""
|
|
69
|
+
if choice_file.suffix == ".py":
|
|
70
|
+
exe_line = _build_python_exe_line(args=args, choice_file=choice_file, repo_root=repo_root)
|
|
71
|
+
choice_file_adjusted = _adjust_choice_file(args=args, choice_file=choice_file, repo_root=repo_root)
|
|
72
|
+
|
|
73
|
+
if args.script or (args.debug and args.choose_function):
|
|
74
|
+
choice_file = _create_import_script(choice_file=choice_file, choice_function=choice_function, kwargs_dict=kwargs_dict, repo_root=repo_root, randstr_func=randstr_func)
|
|
75
|
+
choice_file_adjusted = str(choice_file)
|
|
76
|
+
|
|
77
|
+
return _build_final_command(args=args, exe_line=exe_line, choice_file=choice_file, choice_file_adjusted=choice_file_adjusted, choice_function=choice_function, fire_args=fire_args)
|
|
78
|
+
elif choice_file.suffix in (".ps1", ".sh"):
|
|
79
|
+
return f". {choice_file}"
|
|
80
|
+
elif choice_file.suffix == "":
|
|
81
|
+
return str(choice_file)
|
|
82
|
+
else:
|
|
83
|
+
raise NotImplementedError(f"File type {choice_file.suffix} not supported, in the sense that I don't know how to fire it.")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _build_python_exe_line(args: FireJobArgs, choice_file: Path, repo_root: Optional[Path]) -> str:
|
|
87
|
+
"""Build Python execution line."""
|
|
88
|
+
module_line = "-m" if args.module else ""
|
|
89
|
+
with_project = f"--project {repo_root} " if repo_root is not None else ""
|
|
90
|
+
interactive_line = "-i" if args.interactive else ""
|
|
91
|
+
|
|
92
|
+
if args.interactive:
|
|
93
|
+
from machineconfig.utils.ve import get_ve_path_and_ipython_profile
|
|
94
|
+
_ve_root_from_file, ipy_profile = get_ve_path_and_ipython_profile(init_path=choice_file)
|
|
95
|
+
if ipy_profile is None:
|
|
96
|
+
ipy_profile = "default"
|
|
97
|
+
ipython_line = f"--no-banner --profile {ipy_profile} "
|
|
98
|
+
else:
|
|
99
|
+
ipython_line = ""
|
|
100
|
+
|
|
101
|
+
if args.streamlit:
|
|
102
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.fire_jobs_route_helper import get_command_streamlit
|
|
103
|
+
interpreter_line = get_command_streamlit(choice_file=choice_file, environment=args.environment, repo_root=repo_root)
|
|
104
|
+
elif args.jupyter:
|
|
105
|
+
interpreter_line = "jupyter-lab"
|
|
106
|
+
else:
|
|
107
|
+
interpreter_line = "python" if not args.interactive else "ipython"
|
|
108
|
+
|
|
109
|
+
return f"uv run {with_project} {interpreter_line} {interactive_line} {module_line} {ipython_line}"
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _adjust_choice_file(args: FireJobArgs, choice_file: Path, repo_root: Optional[Path]) -> str:
|
|
113
|
+
"""Adjust choice file path for module mode."""
|
|
114
|
+
if args.module and choice_file.suffix == ".py":
|
|
115
|
+
if repo_root is not None:
|
|
116
|
+
return ".".join(Path(choice_file).relative_to(repo_root).parts).replace(".py", "")
|
|
117
|
+
else:
|
|
118
|
+
return ".".join(Path(choice_file).relative_to(Path.cwd()).parts).replace(".py", "")
|
|
119
|
+
return str(choice_file)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def _create_import_script(choice_file: Path, choice_function: Optional[str], kwargs_dict: dict[str, object], repo_root: Optional[Path], randstr_func: RandStrFunc) -> Path:
|
|
123
|
+
"""Create a script that imports the module and calls the function."""
|
|
124
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.file_wrangler import get_import_module_code, wrap_import_in_try_except
|
|
125
|
+
from machineconfig.utils.meta import lambda_to_python_script
|
|
126
|
+
from machineconfig.utils.code import print_code
|
|
127
|
+
|
|
128
|
+
import_code = get_import_module_code(str(choice_file))
|
|
129
|
+
import_code_robust = lambda_to_python_script(
|
|
130
|
+
lambda: wrap_import_in_try_except(
|
|
131
|
+
import_line=import_code, pyfile=str(choice_file), repo_root=str(repo_root) if repo_root is not None else None
|
|
132
|
+
),
|
|
133
|
+
in_global=True,
|
|
134
|
+
import_module=False,
|
|
135
|
+
)
|
|
136
|
+
code_printing = lambda_to_python_script(
|
|
137
|
+
lambda: print_code(code=import_code_robust, lexer="python", desc="import as module code"),
|
|
138
|
+
in_global=True, import_module=False
|
|
139
|
+
)
|
|
140
|
+
print(f"🧩 Preparing import code for module import:\n{import_code}")
|
|
141
|
+
if choice_function is not None:
|
|
142
|
+
calling = f"""res = {choice_function}({("**" + str(kwargs_dict)) if kwargs_dict else ""})"""
|
|
143
|
+
else:
|
|
144
|
+
calling = """# No function selected to call. You can add your code here."""
|
|
145
|
+
new_choice_file = Path.home().joinpath(f"tmp_results/tmp_scripts/python/{Path(choice_file).parent.name}_{Path(choice_file).stem}_{randstr_func(10)}.py")
|
|
146
|
+
new_choice_file.parent.mkdir(parents=True, exist_ok=True)
|
|
147
|
+
new_choice_file.write_text(import_code_robust + "\n" + code_printing + "\n" + calling, encoding="utf-8")
|
|
148
|
+
return new_choice_file
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _build_final_command(args: FireJobArgs, exe_line: str, choice_file: Path, choice_file_adjusted: str, choice_function: Optional[str], fire_args: str) -> str:
|
|
152
|
+
"""Build the final command string."""
|
|
153
|
+
if args.debug:
|
|
154
|
+
import platform
|
|
155
|
+
if platform.system() == "Windows":
|
|
156
|
+
return f"{exe_line} -m ipdb {choice_file_adjusted} "
|
|
157
|
+
elif platform.system() in ["Linux", "Darwin"]:
|
|
158
|
+
return f"{exe_line} -m pudb {choice_file_adjusted} "
|
|
159
|
+
else:
|
|
160
|
+
raise NotImplementedError(f"Platform {platform.system()} not supported.")
|
|
161
|
+
elif args.module:
|
|
162
|
+
return f"{exe_line} {choice_file_adjusted} "
|
|
163
|
+
elif choice_function is not None and choice_file.suffix == ".py":
|
|
164
|
+
return f"{exe_line} -m fire {choice_file_adjusted} {choice_function} {fire_args}"
|
|
165
|
+
elif args.streamlit:
|
|
166
|
+
if args.holdDirectory:
|
|
167
|
+
return f"{exe_line} {choice_file}"
|
|
168
|
+
else:
|
|
169
|
+
return f"cd {choice_file.parent}\n{exe_line} {choice_file.name}\ncd {Path.cwd()}"
|
|
170
|
+
elif args.cmd:
|
|
171
|
+
return rf""" cd /d {choice_file.parent} & {exe_line} {choice_file.name} """
|
|
172
|
+
elif choice_file.suffix == "":
|
|
173
|
+
return f"{exe_line} {choice_file} {fire_args}"
|
|
174
|
+
else:
|
|
175
|
+
return f"{exe_line} {choice_file} "
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
def _apply_command_modifiers(args: FireJobArgs, command: str, choice_file: Path, repo_root: Optional[Path], randstr_func: RandStrFunc) -> str:
|
|
179
|
+
"""Apply various command modifiers based on args."""
|
|
180
|
+
from rich.panel import Panel
|
|
181
|
+
from rich.console import Console
|
|
182
|
+
from rich.syntax import Syntax
|
|
183
|
+
|
|
184
|
+
console = Console()
|
|
185
|
+
|
|
186
|
+
if args.cmd:
|
|
187
|
+
new_line = "\n"
|
|
188
|
+
command = rf"""start cmd -Argument "/k {command.replace(new_line, " & ")} " """
|
|
189
|
+
|
|
190
|
+
if args.submit_to_cloud:
|
|
191
|
+
command = f"""uv run python -m machineconfig.cluster.templates.cli_click --file {choice_file} """
|
|
192
|
+
if args.function is not None:
|
|
193
|
+
command += f"--function {args.function} "
|
|
194
|
+
|
|
195
|
+
if args.optimized:
|
|
196
|
+
command = command.replace("python ", "python -OO ")
|
|
197
|
+
|
|
198
|
+
if args.zellij_tab is not None:
|
|
199
|
+
comman_path__ = Path.home().joinpath(f"tmp_results/tmp_scripts/zellij_commands/{choice_file.stem}_{randstr_func(10)}.sh")
|
|
200
|
+
comman_path__.parent.mkdir(parents=True, exist_ok=True)
|
|
201
|
+
comman_path__.write_text(command, encoding="utf-8")
|
|
202
|
+
console.print(Panel(Syntax(command, lexer="shell"), title=f"🔥 fire command @ {comman_path__}: "), style="bold red")
|
|
203
|
+
import subprocess
|
|
204
|
+
|
|
205
|
+
existing_tab_names = subprocess.run(["zellij", "action", "query-tab-names"], capture_output=True, text=True, check=True).stdout.splitlines()
|
|
206
|
+
if args.zellij_tab in existing_tab_names:
|
|
207
|
+
print(f"⚠️ Tab name `{args.zellij_tab}` already exists. Please choose a different name.")
|
|
208
|
+
args.zellij_tab += f"_{randstr_func(3)}"
|
|
209
|
+
from machineconfig.cluster.sessions_managers.zellij_local import run_command_in_zellij_tab
|
|
210
|
+
|
|
211
|
+
command = run_command_in_zellij_tab(command=str(comman_path__), tab_name=args.zellij_tab, cwd=None)
|
|
212
|
+
|
|
213
|
+
if args.watch:
|
|
214
|
+
command = "watchexec --restart --exts py,sh,ps1 " + command
|
|
215
|
+
|
|
216
|
+
if args.git_pull:
|
|
217
|
+
command = f"\ngit -C {choice_file.parent} pull\n" + command
|
|
218
|
+
|
|
219
|
+
if args.PathExport:
|
|
220
|
+
from machineconfig.scripts.python.helpers.helpers_fire_command.file_wrangler import add_to_path
|
|
221
|
+
export_line = add_to_path(path_variable="PYTHONPATH", directory=str(repo_root))
|
|
222
|
+
command = export_line + "\n" + command
|
|
223
|
+
|
|
224
|
+
if args.loop:
|
|
225
|
+
import platform
|
|
226
|
+
if platform.system() in ["Linux", "Darwin"]:
|
|
227
|
+
command = command + "\nsleep 0.5"
|
|
228
|
+
elif platform.system() == "Windows":
|
|
229
|
+
command = "$ErrorActionPreference = 'SilentlyContinue';\n" + command + "\nStart-Sleep -Seconds 0.5"
|
|
230
|
+
else:
|
|
231
|
+
raise NotImplementedError(f"Platform {platform.system()} not supported.")
|
|
232
|
+
|
|
233
|
+
return command
|