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,67 @@
|
|
|
1
|
+
import typer
|
|
2
|
+
from typing import Annotated, Optional, Literal
|
|
3
|
+
from machineconfig.profile.create_links_export import REPO_LOOSE
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def sync(
|
|
7
|
+
direction: Annotated[Literal["up", "u", "down", "d"], typer.Argument(..., help="Direction of sync: backup or retrieve")],
|
|
8
|
+
cloud: Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Cloud configuration name (rclone config name)")] = None,
|
|
9
|
+
which: Annotated[
|
|
10
|
+
Optional[str], typer.Option("--which", "-w", help="📝 Comma-separated list of items to BACKUP (from backup.toml), or 'all' for all items")
|
|
11
|
+
] = None,
|
|
12
|
+
repo: Annotated[REPO_LOOSE, typer.Option("--repo", "-r", help="📁 Which backup configuration to use: 'library' or 'user'")] = "all",
|
|
13
|
+
# interactive: Annotated[bool, typer.Option("--interactive", "-i", help="🤔 Prompt the selection of which items to process")] = False,
|
|
14
|
+
):
|
|
15
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_backup_retrieve import main_backup_retrieve
|
|
16
|
+
match direction:
|
|
17
|
+
case "up" | "u":
|
|
18
|
+
direction_resolved = "BACKUP"
|
|
19
|
+
case "down" | "d":
|
|
20
|
+
direction_resolved = "RETRIEVE"
|
|
21
|
+
main_backup_retrieve(direction=direction_resolved, which=which, cloud=cloud, repo=repo)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def register_data(
|
|
25
|
+
path_local: Annotated[str, typer.Argument(..., help="Local file/folder path to back up.")],
|
|
26
|
+
group: Annotated[str, typer.Option("--group", "-g", help="Group section name in backup.toml.")] = "default",
|
|
27
|
+
name: Annotated[Optional[str], typer.Option("--name", "-n", help="Entry name inside the group in backup.toml.")] = None,
|
|
28
|
+
path_cloud: Annotated[Optional[str], typer.Option("--path-cloud", "-C", help="Cloud path override (optional).")] = None,
|
|
29
|
+
zip_: Annotated[bool, typer.Option("--zip/--no-zip", "-z/-nz", help="Zip before uploading.")] = False,
|
|
30
|
+
encrypt: Annotated[bool, typer.Option("--encrypt/--no-encrypt", "-e/-ne", help="Encrypt before uploading.")] = False,
|
|
31
|
+
rel2home: Annotated[Optional[bool], typer.Option("--rel2home/--no-rel2home", "-r/-nr", help="Treat the local path as relative to home.")] = None,
|
|
32
|
+
os: Annotated[str, typer.Option("--os", "-o", help="OS filter for this backup entry (comma-separated, or 'any').")] = "any",
|
|
33
|
+
) -> None:
|
|
34
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_backup_retrieve import register_backup_entry
|
|
35
|
+
|
|
36
|
+
try:
|
|
37
|
+
backup_path, entry_name, replaced = register_backup_entry(
|
|
38
|
+
path_local=path_local, group=group, entry_name=name, path_cloud=path_cloud, zip=zip_, encrypt=encrypt, rel2home=rel2home, os=os
|
|
39
|
+
)
|
|
40
|
+
except ValueError as exc:
|
|
41
|
+
msg = typer.style("Error: ", fg=typer.colors.RED) + str(exc)
|
|
42
|
+
typer.echo(msg)
|
|
43
|
+
raise typer.Exit(code=1)
|
|
44
|
+
action = "Updated" if replaced else "Added"
|
|
45
|
+
typer.echo(f"{action} backup entry '{entry_name}' in {backup_path}")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def get_app() -> typer.Typer:
|
|
49
|
+
app = typer.Typer(
|
|
50
|
+
name="data",
|
|
51
|
+
help="🗄️ [d] Backup and retrieve configuration files and directories to/from cloud storage using rclone.",
|
|
52
|
+
no_args_is_help=True,
|
|
53
|
+
add_help_option=True,
|
|
54
|
+
add_completion=False,
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
app.command(name="sync", no_args_is_help=True, hidden=False, help="🔄 [s] Sync (backup) files and directories to cloud storage using rclone.")(
|
|
58
|
+
sync
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
app.command(name="s", no_args_is_help=True, hidden=True)(sync)
|
|
62
|
+
|
|
63
|
+
app.command(name="register", no_args_is_help=True, hidden=False, help="📝 [r] Register a new backup entry in user backup.toml.")(register_data)
|
|
64
|
+
|
|
65
|
+
app.command(name="r", no_args_is_help=True, hidden=True)(register_data)
|
|
66
|
+
|
|
67
|
+
return app
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
|
|
2
|
+
import machineconfig.scripts.python.helpers.helpers_devops.cli_share_file
|
|
3
|
+
import machineconfig.scripts.python.helpers.helpers_devops.cli_share_terminal as cli_share_terminal
|
|
4
|
+
import machineconfig.scripts.python.helpers.helpers_devops.cli_share_server as cli_share_server
|
|
5
|
+
import machineconfig.scripts.python.helpers.helpers_devops.cli_ssh as cli_ssh
|
|
6
|
+
import typer
|
|
7
|
+
from typing import Annotated
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def switch_public_ip_address(
|
|
11
|
+
wait_seconds: Annotated[float, typer.Option(..., "--wait", "-w", help="Seconds to wait between steps")] = 2.0,
|
|
12
|
+
max_trials: Annotated[int, typer.Option(..., "--max-trials", "-m", help="Max number of switch attempts")] = 10,
|
|
13
|
+
) -> None:
|
|
14
|
+
"""🔁 Switch public IP address (Cloudflare WARP)"""
|
|
15
|
+
import machineconfig.scripts.python.helpers.helpers_network.address_switch as helper
|
|
16
|
+
helper.switch_public_ip_address(max_trials=max_trials, wait_seconds=wait_seconds)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def show_address() -> None:
|
|
20
|
+
"""📌 Show this computer addresses on network"""
|
|
21
|
+
import machineconfig.scripts.python.helpers.helpers_network.address as helper
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
loaded_json = helper.get_public_ip_address()
|
|
25
|
+
from rich import print_json
|
|
26
|
+
print_json(data=loaded_json)
|
|
27
|
+
except Exception as e:
|
|
28
|
+
print(f"⚠️ Could not fetch public IP address: {e}")
|
|
29
|
+
loaded_json = {}
|
|
30
|
+
|
|
31
|
+
from rich.table import Table
|
|
32
|
+
from rich.console import Console
|
|
33
|
+
res = helper.get_all_ipv4_addresses()
|
|
34
|
+
res.append( ("Public IP", loaded_json.get("ip", "N/A")))
|
|
35
|
+
|
|
36
|
+
# loc = loaded_json["loc"]
|
|
37
|
+
# cmd = f"""curl "https://maps.geoapify.com/v1/staticmap?style=osm-bright&width=600&height=300¢er=lonlat:{loc}&zoom=6&marker=lonlat:{loc};color:%23ff0000;size:medium&apiKey=$GEOAPIFY_API_KEY" -o map.png && chafa map.png"""
|
|
38
|
+
# from machineconfig.utils.code import run_shell_script
|
|
39
|
+
# run_shell_script(script=cmd)
|
|
40
|
+
|
|
41
|
+
table = Table(title="Network Interfaces")
|
|
42
|
+
table.add_column("Interface", style="cyan")
|
|
43
|
+
table.add_column("IP Address", style="green")
|
|
44
|
+
|
|
45
|
+
for iface, ip in res:
|
|
46
|
+
table.add_row(iface, ip)
|
|
47
|
+
|
|
48
|
+
console = Console()
|
|
49
|
+
console.print(table)
|
|
50
|
+
|
|
51
|
+
res = helper.select_lan_ipv4(prefer_vpn=False)
|
|
52
|
+
if res is not None:
|
|
53
|
+
# ip, iface = res
|
|
54
|
+
# print(f"Selected IP: {ip} on interface: {iface}")
|
|
55
|
+
print(f"LAN IPv4: {res}")
|
|
56
|
+
else:
|
|
57
|
+
print("No network interfaces found.")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def bind_wsl_port(port: Annotated[int, typer.Option(..., "--port", "-p", help="Port number to bind")]):
|
|
62
|
+
code = f"""
|
|
63
|
+
|
|
64
|
+
$wsl_ip = (wsl.exe hostname -I).Trim().Split(' ')[0]
|
|
65
|
+
netsh interface portproxy add v4tov4 listenport={port} listenaddress=0.0.0.0 connectport={port} connectaddress=$wsl_ip
|
|
66
|
+
|
|
67
|
+
"""
|
|
68
|
+
from machineconfig.utils.code import exit_then_run_shell_script
|
|
69
|
+
exit_then_run_shell_script(code)
|
|
70
|
+
def open_wsl_port(ports: Annotated[str, typer.Argument(..., help="Comma-separated ports or port ranges (e.g., '8080,3000-3005,443')")]):
|
|
71
|
+
"""🔥 Open Windows firewall ports for WSL (Windows only)."""
|
|
72
|
+
import machineconfig.utils.ssh_utils.wsl as wsl_utils
|
|
73
|
+
wsl_utils.open_wsl_port(ports)
|
|
74
|
+
def link_wsl_and_windows_home(windows_username: Annotated[str | None, typer.Option("--windows-username", "-u", help="Windows username to use (optional, auto-detected if not provided)")] = None):
|
|
75
|
+
"""🔗 Link WSL home and Windows home directories."""
|
|
76
|
+
import machineconfig.utils.ssh_utils.wsl as wsl_utils
|
|
77
|
+
wsl_utils.link_wsl_and_windows(windows_username)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def wifi_select(
|
|
81
|
+
ssid: Annotated[str, typer.Option("-n", "--ssid", help="🔗 SSID of WiFi (from config)")] = "MyPhoneHotSpot",
|
|
82
|
+
manual: Annotated[bool, typer.Option("-m", "--manual", help="🔍 Manual network selection mode")] = False,
|
|
83
|
+
list_: Annotated[bool, typer.Option("-l", "--list", help="📡 List available networks only")] = False,
|
|
84
|
+
) -> None:
|
|
85
|
+
"""Main function with fallback network selection"""
|
|
86
|
+
from rich.panel import Panel
|
|
87
|
+
from rich.prompt import Confirm
|
|
88
|
+
from rich.console import Console
|
|
89
|
+
from machineconfig.scripts.python.helpers.helpers_network.wifi_conn import try_config_connection, manual_network_selection, display_available_networks
|
|
90
|
+
console = Console()
|
|
91
|
+
console.print(Panel("📶 Welcome to the WiFi Connector Tool", title="[bold blue]WiFi Connection[/bold blue]", border_style="blue"))
|
|
92
|
+
|
|
93
|
+
# If user just wants to list networks
|
|
94
|
+
if list_:
|
|
95
|
+
display_available_networks()
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
# If user wants manual mode, skip config and go straight to selection
|
|
99
|
+
if manual:
|
|
100
|
+
console.print("[blue]🔍 Manual network selection mode[/blue]")
|
|
101
|
+
if manual_network_selection():
|
|
102
|
+
console.print("[green]🎉 Successfully connected![/green]")
|
|
103
|
+
else:
|
|
104
|
+
console.print("[red]❌ Failed to connect[/red]")
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
# Try to connect using configuration first
|
|
108
|
+
console.print(f"[blue]🔍 Attempting to connect to configured network: {ssid}[/blue]")
|
|
109
|
+
|
|
110
|
+
if try_config_connection(ssid):
|
|
111
|
+
console.print("[green]🎉 Successfully connected using configuration![/green]")
|
|
112
|
+
return
|
|
113
|
+
|
|
114
|
+
# Configuration failed, offer fallback options
|
|
115
|
+
console.print("\n[yellow]⚠️ Configuration connection failed or not available[/yellow]")
|
|
116
|
+
|
|
117
|
+
if Confirm.ask("[blue]Would you like to manually select a network?[/blue]", default=True):
|
|
118
|
+
if manual_network_selection():
|
|
119
|
+
console.print("[green]🎉 Successfully connected![/green]")
|
|
120
|
+
else:
|
|
121
|
+
console.print("[red]❌ Failed to connect[/red]")
|
|
122
|
+
else:
|
|
123
|
+
console.print("[blue]👋 Goodbye![/blue]")
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def reset_cloudflare_tunnel():
|
|
128
|
+
code = """
|
|
129
|
+
# cloudflared tunnel route dns glenn # creates CNAMES in Cloudflare dashboard
|
|
130
|
+
# sudo systemctl stop cloudflared
|
|
131
|
+
# test: cloudflared tunnel run glenn
|
|
132
|
+
home_dir=$HOME
|
|
133
|
+
cloudflared_path="$home_dir/.local/bin/cloudflared"
|
|
134
|
+
sudo $cloudflared_path service uninstall
|
|
135
|
+
sudo rm /etc/cloudflared/config.yml || true
|
|
136
|
+
sudo $cloudflared_path --config $home_dir/.cloudflared/config.yml service install
|
|
137
|
+
"""
|
|
138
|
+
print(code)
|
|
139
|
+
print("NOTE: Please run the above commands in your terminal to apply the changes.")
|
|
140
|
+
|
|
141
|
+
def add_ip_exclusion_to_warp(ip: Annotated[str, typer.Option(..., "--ip", help="IP address(es) to exclude from WARP (Comma separated)")]):
|
|
142
|
+
ips = ip.split(",")
|
|
143
|
+
res = ""
|
|
144
|
+
for an_ip in ips:
|
|
145
|
+
res += f'sudo warp-cli tunnel ip add {an_ip}\n'
|
|
146
|
+
print(f"Adding IP exclusion to WARP for: {an_ip}")
|
|
147
|
+
code = f"""
|
|
148
|
+
{res}
|
|
149
|
+
echo "Restarting WARP connection..."
|
|
150
|
+
sudo warp-cli disconnect
|
|
151
|
+
echo "Waiting for 2 seconds..."
|
|
152
|
+
sleep 2
|
|
153
|
+
echo "Reconnecting WARP..."
|
|
154
|
+
sudo warp-cli connect
|
|
155
|
+
"""
|
|
156
|
+
print(code)
|
|
157
|
+
print("NOTE: Please run the above commands in your terminal to apply the changes.")
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def get_app():
|
|
161
|
+
nw_apps = typer.Typer(help="🔐 [n] Network subcommands", no_args_is_help=True, add_help_option=True, add_completion=False)
|
|
162
|
+
nw_apps.command(name="share-terminal", help="📡 [t] Share terminal via web browser")(cli_share_terminal.share_terminal)
|
|
163
|
+
nw_apps.command(name="t", help="Share terminal via web browser", hidden=True)(cli_share_terminal.share_terminal)
|
|
164
|
+
|
|
165
|
+
nw_apps.command(name="share-server", help="🌐 [s] Start local/global server to share files/folders via web browser", no_args_is_help=True)(cli_share_server.web_file_explorer)
|
|
166
|
+
nw_apps.command(name="s", help="Start local/global server to share files/folders via web browser", hidden=True, no_args_is_help=True)(cli_share_server.web_file_explorer)
|
|
167
|
+
|
|
168
|
+
# app = cli_share_server.get_share_file_app()
|
|
169
|
+
# nw_apps.add_typer(app, name="share-file", help="📁 [f] Share a file via relay server", no_args_is_help=True)
|
|
170
|
+
# nw_apps.add_typer(app, name="f", help="Share a file via relay server", hidden=True, no_args_is_help=True)
|
|
171
|
+
nw_apps.command(name="send", no_args_is_help=True, hidden=False, help="📁 [sx] send files from here.")(machineconfig.scripts.python.helpers.helpers_devops.cli_share_file.share_file_send)
|
|
172
|
+
nw_apps.command(name="sx", no_args_is_help=True, hidden=True, help="📁 [sx] send files from here.")(machineconfig.scripts.python.helpers.helpers_devops.cli_share_file.share_file_send)
|
|
173
|
+
nw_apps.command(name="receive", no_args_is_help=True, hidden=False, help="📁 [rx] receive files to here.")(machineconfig.scripts.python.helpers.helpers_devops.cli_share_file.share_file_receive)
|
|
174
|
+
nw_apps.command(name="rx", no_args_is_help=True, hidden=True, help="📁 [rx] receive files to here.")(machineconfig.scripts.python.helpers.helpers_devops.cli_share_file.share_file_receive)
|
|
175
|
+
|
|
176
|
+
nw_apps.add_typer(cli_ssh.get_app(), name="ssh", help="🔐 [S] SSH subcommands")
|
|
177
|
+
nw_apps.add_typer(cli_ssh.get_app(), name="S", help="SSH subcommands", hidden=True)
|
|
178
|
+
|
|
179
|
+
nw_apps.command(name="show-address", help="📌 [a] Show this computer addresses on network")(show_address)
|
|
180
|
+
nw_apps.command(name="a", help="Show this computer addresses on network", hidden=True)(show_address)
|
|
181
|
+
|
|
182
|
+
nw_apps.command(name="switch-public-ip", help="🔁 [c] Switch public IP address (Cloudflare WARP)")(switch_public_ip_address)
|
|
183
|
+
nw_apps.command(name="c", help="Switch public IP address (Cloudflare WARP)", hidden=True)(switch_public_ip_address)
|
|
184
|
+
|
|
185
|
+
nw_apps.command(name="wifi-select", no_args_is_help=True, help="📶 [w] WiFi connection utility.")(wifi_select)
|
|
186
|
+
nw_apps.command(name="w", no_args_is_help=True, hidden=True)(wifi_select)
|
|
187
|
+
|
|
188
|
+
nw_apps.command(name="bind-wsl-port", help="🔌 [b] Bind WSL port to Windows host", no_args_is_help=True)(bind_wsl_port)
|
|
189
|
+
nw_apps.command(name="b", help="Bind WSL port to Windows host", hidden=True, no_args_is_help=True)(bind_wsl_port)
|
|
190
|
+
nw_apps.command(name="open-wsl-port", no_args_is_help=True, help="🔥 [o] Open Windows firewall ports for WSL.", hidden=False)(open_wsl_port)
|
|
191
|
+
nw_apps.command(name="o", no_args_is_help=True, help="Open Windows firewall ports for WSL.", hidden=True)(open_wsl_port)
|
|
192
|
+
nw_apps.command(name="link-wsl-windows", no_args_is_help=False, help="🔗 [l] Link WSL home and Windows home directories.", hidden=False)(link_wsl_and_windows_home)
|
|
193
|
+
nw_apps.command(name="l", no_args_is_help=False, help="Link WSL home and Windows home directories.", hidden=True)(link_wsl_and_windows_home)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
nw_apps.command(name="reset-cloudflare-tunnel", help="☁️ [r] Reset Cloudflare tunnel service")(reset_cloudflare_tunnel)
|
|
197
|
+
nw_apps.command(name="r", help="Reset Cloudflare tunnel service", hidden=True)(reset_cloudflare_tunnel)
|
|
198
|
+
nw_apps.command(name="add-ip-exclusion-to-warp", help="🚫 [p] Add IP exclusion to WARP")(add_ip_exclusion_to_warp)
|
|
199
|
+
nw_apps.command(name="p", help="Add IP exclusion to WARP", hidden=True)(add_ip_exclusion_to_warp)
|
|
200
|
+
|
|
201
|
+
return nw_apps
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"""Repos CLI powered by Typer.
|
|
2
|
+
|
|
3
|
+
# TODO use gh api user --jq '.login' to get the username and use it to clone the repos.
|
|
4
|
+
in the event that username@github.com is not mentioned in the remote url.
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import Annotated, Optional
|
|
10
|
+
import typer
|
|
11
|
+
from machineconfig.scripts.python.helpers.helpers_repos.cloud_repo_sync import main as secure_repo_main
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def _resolve_directory(directory: Optional[str]) -> Path:
|
|
15
|
+
if directory is None:
|
|
16
|
+
directory = Path.cwd().as_posix()
|
|
17
|
+
typer.echo(f"📁 Using directory: {directory}")
|
|
18
|
+
return Path(directory).expanduser().absolute().resolve()
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def push(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
|
|
22
|
+
"""🚀 Push changes across repositories."""
|
|
23
|
+
repos_root = _resolve_directory(directory)
|
|
24
|
+
from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
|
|
25
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
26
|
+
perform_git_operations(repos_root=PathExtended(repos_root), pull=False, commit=False, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def pull(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
|
|
30
|
+
"""⬇️ Pull changes across repositories."""
|
|
31
|
+
repos_root = _resolve_directory(directory)
|
|
32
|
+
from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
|
|
33
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
34
|
+
perform_git_operations(repos_root=PathExtended(repos_root), pull=True, commit=False, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def commit(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
|
|
38
|
+
"""💾 Commit changes across repositories."""
|
|
39
|
+
repos_root = _resolve_directory(directory)
|
|
40
|
+
from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
|
|
41
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
42
|
+
perform_git_operations(repos_root=PathExtended(repos_root), pull=False, commit=True, push=False, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def sync(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False, auto_uv_sync: Annotated[bool, typer.Option("--uv-sync/--no-uv-sync", "-u/-ns", help="Automatic uv sync after pulls.")] = False) -> None:
|
|
46
|
+
"""🔄 Pull, commit, and push changes across repositories."""
|
|
47
|
+
repos_root = _resolve_directory(directory)
|
|
48
|
+
from machineconfig.scripts.python.helpers.helpers_repos.action import perform_git_operations
|
|
49
|
+
from machineconfig.utils.path_extended import PathExtended
|
|
50
|
+
perform_git_operations(repos_root=PathExtended(repos_root), pull=True, commit=True, push=True, recursive=recursive, auto_uv_sync=auto_uv_sync)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def capture(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
|
|
54
|
+
"""📝 Record repositories into a repos.json specification."""
|
|
55
|
+
from machineconfig.scripts.python.helpers.helpers_repos.record import main_record as record_repos
|
|
56
|
+
save_path = record_repos(repos_root_str=directory)
|
|
57
|
+
print(f"\n✅ Saved repository specification to {save_path}")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def clone(directory: Annotated[str, typer.Argument(help="📁 Directory containing repo(s).")] = ".",
|
|
61
|
+
specs_path: Annotated[Optional[str], typer.Option("--specs-path", "-s", help="Path to repos.json specification file.")] = None,
|
|
62
|
+
interactive: Annotated[bool, typer.Option("--interactive/--no-interactive", "-i/-ni", help="Select interactively.")]=False
|
|
63
|
+
) -> None:
|
|
64
|
+
"""📥 Clone repositories described by a repos.json specification."""
|
|
65
|
+
if interactive:
|
|
66
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import BACKUP_ROOT_PRIVATE, BACKUP_ROOT_PUBLIC, get_original_path_from_backup_path
|
|
67
|
+
results_public = list(BACKUP_ROOT_PUBLIC.rglob("repos.json"))
|
|
68
|
+
results_private = list(BACKUP_ROOT_PRIVATE.rglob("repos.json"))
|
|
69
|
+
if len(results_public) + len(results_private) == 0:
|
|
70
|
+
print("❌ No repos.json specifications found in backup directories.")
|
|
71
|
+
return
|
|
72
|
+
from machineconfig.utils.options import choose_from_options
|
|
73
|
+
chosen_files: list[str] = choose_from_options(options=[str(p) for p in results_public + results_private], msg="Select a repos.json specification to clone from:", multi=True, tv=True)
|
|
74
|
+
for file in chosen_files:
|
|
75
|
+
if str(file).startswith(str(BACKUP_ROOT_PRIVATE)):
|
|
76
|
+
original_path = get_original_path_from_backup_path(Path(file), sensitivity="private", destination=None, shared=False)
|
|
77
|
+
else:
|
|
78
|
+
original_path = get_original_path_from_backup_path(Path(file), sensitivity="public", destination=None, shared=False)
|
|
79
|
+
typer.echo("\n📥 Cloning or checking out repositories...")
|
|
80
|
+
dir_obj = _resolve_directory(str(original_path))
|
|
81
|
+
spec_path_default = dir_obj.joinpath("repos.json")
|
|
82
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
|
|
83
|
+
spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
|
|
84
|
+
from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
|
|
85
|
+
clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=False)
|
|
86
|
+
return
|
|
87
|
+
if specs_path is not None:
|
|
88
|
+
spec_path_self_managed = Path(specs_path).expanduser().absolute()
|
|
89
|
+
else:
|
|
90
|
+
dir_obj = _resolve_directory(directory)
|
|
91
|
+
spec_path_default = dir_obj.joinpath("repos.json")
|
|
92
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
|
|
93
|
+
spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
|
|
94
|
+
if not spec_path_self_managed.exists():
|
|
95
|
+
print(f"❌ Specification file not found: {spec_path_self_managed}. Ensure this file exists or provide it explicitly using --specs-path.")
|
|
96
|
+
return
|
|
97
|
+
from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
|
|
98
|
+
clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=False)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def checkout_command(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
|
|
102
|
+
"""🔀 Check out specific commits listed in the specification."""
|
|
103
|
+
typer.echo("\n📥 Cloning or checking out repositories...")
|
|
104
|
+
dir_obj = _resolve_directory(directory)
|
|
105
|
+
spec_path_default = dir_obj.joinpath("repos.json")
|
|
106
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
|
|
107
|
+
spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
|
|
108
|
+
from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
|
|
109
|
+
clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=False, checkout_commit_flag=True)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def checkout_to_branch_command(directory: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None) -> None:
|
|
113
|
+
"""🔀 Check out to the main branch defined in the specification."""
|
|
114
|
+
typer.echo("\n📥 Cloning or checking out repositories...")
|
|
115
|
+
dir_obj = _resolve_directory(directory)
|
|
116
|
+
spec_path_default = dir_obj.joinpath("repos.json")
|
|
117
|
+
from machineconfig.scripts.python.helpers.helpers_devops.cli_config_dotfile import get_backup_path
|
|
118
|
+
spec_path_self_managed = get_backup_path(orig_path=spec_path_default, sensitivity="private", destination=None, shared=False)
|
|
119
|
+
from machineconfig.scripts.python.helpers.helpers_repos.clone import clone_repos
|
|
120
|
+
clone_repos(spec_path=spec_path_self_managed, preferred_remote=None, checkout_branch_flag=True, checkout_commit_flag=False)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def count_lines_in_repo(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
|
|
124
|
+
# def func(repo_path: str):
|
|
125
|
+
# from machineconfig.scripts.python.helpers.helpers_repos import repo_analyzer_1
|
|
126
|
+
# repo_analyzer_1.count_historical_line_edits(repo_path=repo_path)
|
|
127
|
+
# from machineconfig.utils.code import run_lambda_function
|
|
128
|
+
# run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig>=8.51"])
|
|
129
|
+
from machineconfig.scripts.python.helpers.helpers_repos import repo_analyzer_1
|
|
130
|
+
try:
|
|
131
|
+
repo_analyzer_1.count_historical_line_edits(repo_path=repo_path)
|
|
132
|
+
except Exception as e:
|
|
133
|
+
typer.echo(f"❌ Error counting lines in repo {repo_path}: {e}")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def print_python_files_by_size(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
|
|
137
|
+
# def func(repo_path: str):
|
|
138
|
+
# from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import print_python_files_by_size_impl
|
|
139
|
+
# print_python_files_by_size_impl(repo_path=repo_path)
|
|
140
|
+
# from machineconfig.utils.code import run_lambda_function
|
|
141
|
+
# run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.51"])
|
|
142
|
+
from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import print_python_files_by_size_impl
|
|
143
|
+
print_python_files_by_size_impl(repo_path=repo_path)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def analyze_repo_development(repo_path: Annotated[str, typer.Argument(..., help="Path to the git repository")]):
|
|
147
|
+
# def func(repo_path: str):
|
|
148
|
+
# from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import analyze_over_time
|
|
149
|
+
# analyze_over_time(repo_path=repo_path)
|
|
150
|
+
# from machineconfig.utils.code import run_lambda_function
|
|
151
|
+
# run_lambda_function(lambda: func(repo_path=repo_path), uv_project_dir=None, uv_with=["machineconfig[plot]>=8.51"])
|
|
152
|
+
from machineconfig.scripts.python.helpers.helpers_repos.repo_analyzer_2 import analyze_over_time
|
|
153
|
+
analyze_over_time(repo_path=repo_path)
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def gource_viz(
|
|
157
|
+
repo: Annotated[str, typer.Option(..., "--repo", "-r", help="Path to git repository to visualize")] = ".",
|
|
158
|
+
output_file: Annotated[Optional[Path], typer.Option(..., "--output", "-o", help="Output video file (e.g., output.mp4). If specified, gource will render to video.")] = None,
|
|
159
|
+
resolution: Annotated[str, typer.Option(..., "--resolution", "-res", help="Video resolution (e.g., 1920x1080, 1280x720)")] = "1920x1080",
|
|
160
|
+
seconds_per_day: Annotated[float, typer.Option(..., "--seconds-per-day", "-spd", help="Speed of simulation (lower = faster)")] = 0.1,
|
|
161
|
+
auto_skip_seconds: Annotated[float, typer.Option(..., "--auto-skip-seconds", "-as", help="Skip to next entry if nothing happens for X seconds")] = 1.0,
|
|
162
|
+
title: Annotated[Optional[str], typer.Option(..., "--title", "-t", help="Title for the visualization")] = None,
|
|
163
|
+
hide_items: Annotated[list[str], typer.Option(..., "--hide", "-h", help="Items to hide: bloom, date, dirnames, files, filenames, mouse, progress, root, tree, users, usernames")] = [],
|
|
164
|
+
key_items: Annotated[bool, typer.Option(..., "--key", "-k", help="Show file extension key")] = False,
|
|
165
|
+
fullscreen: Annotated[bool, typer.Option(..., "--fullscreen", "-f", help="Run in fullscreen mode")] = False,
|
|
166
|
+
viewport: Annotated[Optional[str], typer.Option(..., "--viewport", "-v", help="Camera viewport (e.g., '1000x1000')")] = None,
|
|
167
|
+
start_date: Annotated[Optional[str], typer.Option(..., "--start-date", help="Start date (YYYY-MM-DD)")] = None,
|
|
168
|
+
stop_date: Annotated[Optional[str], typer.Option(..., "--stop-date", help="Stop date (YYYY-MM-DD)")] = None,
|
|
169
|
+
user_image_dir: Annotated[Optional[Path], typer.Option(..., "--user-image-dir", help="Directory with user avatar images")] = None,
|
|
170
|
+
max_files: Annotated[int, typer.Option(..., "--max-files", help="Maximum number of files to show (0 = no limit)")] = 0,
|
|
171
|
+
max_file_lag: Annotated[float, typer.Option(..., "--max-file-lag", help="Max time files remain on screen after last change")] = 5.0,
|
|
172
|
+
file_idle_time: Annotated[int, typer.Option(..., "--file-idle-time", help="Time in seconds files remain idle before being removed")] = 0,
|
|
173
|
+
framerate: Annotated[int, typer.Option(..., "--framerate", help="Frames per second for video output")] = 60,
|
|
174
|
+
background_color: Annotated[str, typer.Option(..., "--background-color", help="Background color in hex (e.g., 000000 for black)")] = "000000",
|
|
175
|
+
font_size: Annotated[int, typer.Option(..., "--font-size", help="Font size")] = 22,
|
|
176
|
+
camera_mode: Annotated[str, typer.Option(..., "--camera-mode", help="Camera mode: overview or track")] = "overview",
|
|
177
|
+
self: Annotated[bool, typer.Option(..., "--self", help="Clone machineconfig repository and act on it")] = False,
|
|
178
|
+
) -> None:
|
|
179
|
+
"""🎬 Visualize repository activity using Gource."""
|
|
180
|
+
from machineconfig.scripts.python.helpers.helpers_repos.grource import visualize
|
|
181
|
+
if self:
|
|
182
|
+
repo_path = Path.home().joinpath("machineconfig")
|
|
183
|
+
if not repo_path.exists():
|
|
184
|
+
import git
|
|
185
|
+
repo_url = "https://github.com/thisismygitrepo/machineconfig.git"
|
|
186
|
+
git.Repo.clone_from(repo_url, to_path=repo_path.as_posix())
|
|
187
|
+
repo = repo_path.as_posix()
|
|
188
|
+
visualize(repo=repo, output_file=output_file, resolution=resolution, seconds_per_day=seconds_per_day,
|
|
189
|
+
auto_skip_seconds=auto_skip_seconds, title=title, hide_items=hide_items, key_items=key_items,
|
|
190
|
+
fullscreen=fullscreen, viewport=viewport, start_date=start_date, stop_date=stop_date,
|
|
191
|
+
user_image_dir=user_image_dir, max_files=max_files, max_file_lag=max_file_lag,
|
|
192
|
+
file_idle_time=file_idle_time, framerate=framerate, background_color=background_color,
|
|
193
|
+
font_size=font_size, camera_mode=camera_mode)
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def cleanup(repo: Annotated[Optional[str], typer.Argument(help="📁 Directory containing repo(s).")] = None, recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recurse into nested repositories.")] = False) -> None:
|
|
197
|
+
"""🧹 Clean repository directories from cache files."""
|
|
198
|
+
if repo is None:
|
|
199
|
+
repo = Path.cwd().as_posix()
|
|
200
|
+
|
|
201
|
+
arg_path = Path(repo).expanduser().absolute()
|
|
202
|
+
from git import Repo, InvalidGitRepositoryError
|
|
203
|
+
if not recursive:
|
|
204
|
+
# Check if the directory is a git repo
|
|
205
|
+
try:
|
|
206
|
+
Repo(str(arg_path), search_parent_directories=False)
|
|
207
|
+
except InvalidGitRepositoryError:
|
|
208
|
+
typer.echo(f"❌ {arg_path} is not a git repository. Use -r flag for recursive cleanup.")
|
|
209
|
+
return
|
|
210
|
+
# Run cleanup on this repo
|
|
211
|
+
repos_to_clean = [arg_path]
|
|
212
|
+
else:
|
|
213
|
+
# Find all git repos recursively under the directory
|
|
214
|
+
git_dirs = list(arg_path.rglob('.git'))
|
|
215
|
+
repos_to_clean = [git_dir.parent for git_dir in git_dirs if git_dir.is_dir()]
|
|
216
|
+
if not repos_to_clean:
|
|
217
|
+
typer.echo(f"❌ No git repositories found under {arg_path}")
|
|
218
|
+
return
|
|
219
|
+
|
|
220
|
+
for repo_path in repos_to_clean:
|
|
221
|
+
typer.echo(f"🧹 Cleaning {repo_path}")
|
|
222
|
+
script = fr"""
|
|
223
|
+
cd "{repo_path}"
|
|
224
|
+
uv run --with cleanpy cleanpy .
|
|
225
|
+
# mcinit .
|
|
226
|
+
# find "." -type f \( -name "*.py" -o -name "*.md" -o -name "*.json" \) -not -path "*/\.*" -not -path "*/__pycache__/*" -print0 | xargs -0 sed -i 's/[[:space:]]*$//'
|
|
227
|
+
"""
|
|
228
|
+
from machineconfig.utils.code import run_shell_script
|
|
229
|
+
run_shell_script(script, display_script=True, clean_env=False)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def get_app():
|
|
233
|
+
repos_apps = typer.Typer(help="📁 [r] Manage development repositories", no_args_is_help=True, add_help_option=True, add_completion=False)
|
|
234
|
+
mirror_app = typer.Typer(help="🔄 [m] Manage repository specifications and syncing", no_args_is_help=True, add_help_option=True, add_completion=False)
|
|
235
|
+
repos_apps.add_typer(mirror_app, name="mirror", help="🔄 [m] mirror repositories using saved specs")
|
|
236
|
+
repos_apps.add_typer(mirror_app, name="m", help="mirror repositories using saved specs", hidden=True)
|
|
237
|
+
|
|
238
|
+
repos_apps.command(name="push", help="🚀 [p] Push changes across repositories")(push)
|
|
239
|
+
repos_apps.command(name="p", help="Push changes across repositories", hidden=True)(push)
|
|
240
|
+
repos_apps.command(name="pull", help="⬇️ [P] Pull changes across repositories")(pull)
|
|
241
|
+
repos_apps.command(name="P", help="Pull changes across repositories", hidden=True)(pull)
|
|
242
|
+
repos_apps.command(name="commit", help="💾 [c] Commit changes across repositories")(commit)
|
|
243
|
+
repos_apps.command(name="c", help="Commit changes across repositories", hidden=True)(commit)
|
|
244
|
+
repos_apps.command(name="sync", help="🔄 [y] Pull, commit, and push changes across repositories")(sync)
|
|
245
|
+
repos_apps.command(name="y", help="Pull, commit, and push changes across repositories", hidden=True)(sync)
|
|
246
|
+
repos_apps.command(name="analyze", help="📊 [a] Analyze repository development over time")(analyze_repo_development)
|
|
247
|
+
repos_apps.command(name="a", help="Analyze repository development over time", hidden=True)(analyze_repo_development)
|
|
248
|
+
|
|
249
|
+
repos_apps.command(name="secure", help="🔐 [s] Securely sync git repository to/from cloud with encryption")(secure_repo_main)
|
|
250
|
+
repos_apps.command(name="s", help="Securely sync git repository to/from cloud with encryption", hidden=True)(secure_repo_main)
|
|
251
|
+
|
|
252
|
+
repos_apps.command(name="viz", help="🎬 [v] Visualize repository activity using Gource")(gource_viz)
|
|
253
|
+
repos_apps.command(name="v", help="Visualize repository activity using Gource", hidden=True)(gource_viz)
|
|
254
|
+
|
|
255
|
+
repos_apps.command(name="count-lines", help="📄 [l] Count python lines of code in current repo + historical edits.")(count_lines_in_repo)
|
|
256
|
+
repos_apps.command(name="l", help="Count python lines of code in current repo + historical edits.", hidden=True)(count_lines_in_repo)
|
|
257
|
+
|
|
258
|
+
repos_apps.command(name="cleanup", help="🧹 [n] Clean repository directories from cache files")(cleanup)
|
|
259
|
+
repos_apps.command(name="n", help="Clean repository directories from cache files", hidden=True)(cleanup)
|
|
260
|
+
|
|
261
|
+
mirror_app.command(name="capture", help="📝 [cap] Record repositories into a repos.json specification")(capture)
|
|
262
|
+
mirror_app.command(name="cap", help="Record repositories into a repos.json specification", hidden=True)(capture)
|
|
263
|
+
|
|
264
|
+
mirror_app.command(name="clone", help="📥 [clo] Clone repositories described by a repos.json specification")(clone)
|
|
265
|
+
mirror_app.command(name="clo", help="Clone repositories described by a repos.json specification", hidden=True)(clone)
|
|
266
|
+
|
|
267
|
+
mirror_app.command(name="checkout-to-commit", help="🔀 [ctc] Check out specific commits listed in the specification")(checkout_command)
|
|
268
|
+
mirror_app.command(name="ctc", help="Check out specific commits listed in the specification", hidden=True)(checkout_command)
|
|
269
|
+
|
|
270
|
+
mirror_app.command(name="checkout-to-branch", help="🔀 [ctb] Check out to the main branch defined in the specification")(checkout_to_branch_command)
|
|
271
|
+
mirror_app.command(name="ctb", help="Check out to the main branch defined in the specification", hidden=True)(checkout_to_branch_command)
|
|
272
|
+
|
|
273
|
+
return repos_apps
|
|
274
|
+
|