machineconfig 3.99__py3-none-any.whl → 7.66__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.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +1 -2
- machineconfig/cluster/sessions_managers/{enhanced_command_runner.py → helpers/enhanced_command_runner.py} +4 -6
- machineconfig/cluster/sessions_managers/helpers/load_balancer_helper.py +145 -0
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +53 -0
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +128 -330
- machineconfig/cluster/sessions_managers/wt_local_manager.py +53 -187
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- 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_reporter.py +4 -2
- 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 +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -172
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -16
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/gh.py +69 -53
- machineconfig/jobs/installer/custom/hx.py +77 -20
- machineconfig/jobs/installer/custom_dev/alacritty.py +45 -30
- machineconfig/jobs/installer/custom_dev/brave.py +43 -35
- machineconfig/jobs/installer/custom_dev/bypass_paywall.py +31 -20
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +33 -21
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/espanso.py +64 -41
- machineconfig/jobs/installer/custom_dev/goes.py +41 -36
- machineconfig/jobs/installer/custom_dev/lvim.py +49 -33
- machineconfig/jobs/installer/custom_dev/nerdfont.py +71 -47
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +32 -26
- machineconfig/jobs/installer/custom_dev/redis.py +51 -33
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +55 -39
- machineconfig/jobs/installer/custom_dev/winget.py +1 -0
- machineconfig/jobs/installer/installer_data.json +3406 -0
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/ngrok.sh +6 -0
- machineconfig/jobs/installer/linux_scripts/q.sh +9 -0
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +255 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +198 -0
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +117 -181
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -124
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +106 -244
- machineconfig/scripts/python/ftpx.py +125 -68
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +110 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_load_balancer.py +22 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +11 -19
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +3 -3
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +17 -7
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
- machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
- machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/helpers_devops/cli_terminal.py +156 -0
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
- machineconfig/scripts/python/helpers_devops/devops_update_repos.py +269 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -87
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +145 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +110 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +6 -7
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/helpers_repos/count_lines.py +348 -0
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/helpers_repos/entrypoint.py +77 -0
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +7 -4
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +79 -160
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +1 -3
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +74 -44
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +19 -16
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +7 -8
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +6 -5
- machineconfig/scripts/python/sessions.py +167 -0
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
- machineconfig/settings/broot/br.sh +0 -4
- 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 +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -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/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_mac/__init__.py +16 -0
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
- machineconfig/setup_mac/uv.sh +36 -0
- machineconfig/setup_windows/__init__.py +8 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -9
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +37 -23
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +140 -93
- machineconfig/utils/files/art/fat_croco.txt +10 -0
- machineconfig/utils/files/art/halfwit_croco.txt +9 -0
- machineconfig/utils/files/art/happy_croco.txt +22 -0
- machineconfig/utils/files/art/water_croco.txt +11 -0
- machineconfig/utils/files/ascii_art.py +118 -0
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +68 -0
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +95 -0
- machineconfig/utils/installer_utils/github_release_bulk.py +2 -12
- machineconfig/utils/installer_utils/installer_class.py +68 -126
- machineconfig/utils/installer_utils/installer_cli.py +181 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +38 -85
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +69 -69
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +309 -100
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +10 -25
- machineconfig/utils/path_extended.py +94 -104
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -74
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +5 -17
- machineconfig/utils/schemas/installer/installer_types.py +0 -1
- machineconfig/utils/schemas/layouts/layout_types.py +2 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -254
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +3 -140
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +13 -5
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/templates/utils.py +0 -51
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/installer/packages_custom_dev.json +0 -226
- machineconfig/jobs/installer/packages_custom_essential.json +0 -39
- machineconfig/jobs/installer/packages_github_dev.json +0 -1110
- machineconfig/jobs/installer/packages_github_essential.json +0 -804
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -37
- machineconfig/jobs/python/create_bootable_media.py +0 -16
- machineconfig/jobs/python/python_cargo_build_share.py +0 -59
- machineconfig/jobs/python/python_ve_symlink.py +0 -29
- machineconfig/jobs/python/tasks.py +0 -3
- machineconfig/jobs/python/vscode/api.py +0 -49
- machineconfig/jobs/python/vscode/sync_code.py +0 -58
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -170
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/fire_agents +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/programs +0 -21
- machineconfig/scripts/linux/repos +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -186
- machineconfig/scripts/python/devops_devapps_install.py +0 -159
- machineconfig/scripts/python/devops_update_repos.py +0 -180
- machineconfig/scripts/python/dotfile.py +0 -52
- machineconfig/scripts/python/fire_agents.py +0 -175
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -143
- machineconfig/scripts/python/fire_agents_load_balancer.py +0 -50
- machineconfig/scripts/python/fire_jobs_args_helper.py +0 -75
- machineconfig/scripts/python/fire_jobs_layout_helper.py +0 -74
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -114
- machineconfig/scripts/python/repos.py +0 -80
- machineconfig/scripts/python/repos_helper_action.py +0 -335
- machineconfig/scripts/python/share_terminal.py +0 -104
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/repos.ps1 +0 -1
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/ascii_art.sh +0 -93
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig-3.99.dist-info/METADATA +0 -167
- machineconfig-3.99.dist-info/RECORD +0 -409
- machineconfig-3.99.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/{templates → remote}/run_cloud.py +0 -0
- machineconfig/cluster/{templates → remote}/run_cluster.py +0 -0
- machineconfig/cluster/{templates → remote}/run_remote.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
- {machineconfig-3.99.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
2
|
-
from machineconfig.utils.terminal import Terminal
|
|
3
|
-
from machineconfig.scripts.python.get_zellij_cmd import get_zellij_cmd
|
|
4
|
-
from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
|
|
5
|
-
from machineconfig.utils.io import read_ini
|
|
6
|
-
from machineconfig.utils.code import write_shell_script_to_file
|
|
7
|
-
import platform
|
|
8
|
-
from rich.console import Console
|
|
9
|
-
from rich.panel import Panel
|
|
10
|
-
|
|
11
|
-
console = Console()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def delete_remote_repo_copy_and_push_local(remote_repo: str, local_repo: str, cloud: str):
|
|
15
|
-
console.print(Panel("🗑️ Deleting remote repo copy and pushing local copy", title="[bold blue]Repo Sync[/bold blue]", border_style="blue"))
|
|
16
|
-
repo_sync_root = PathExtended(remote_repo).expanduser().absolute()
|
|
17
|
-
repo_root_path = PathExtended(local_repo).expanduser().absolute()
|
|
18
|
-
repo_sync_root.delete(sure=True)
|
|
19
|
-
print("🧹 Removed temporary remote copy")
|
|
20
|
-
from git.remote import Remote
|
|
21
|
-
from git.repo import Repo
|
|
22
|
-
|
|
23
|
-
try:
|
|
24
|
-
Remote.remove(Repo(repo_root_path), "originEnc")
|
|
25
|
-
console.print(Panel("🔗 Removed originEnc remote reference", border_style="blue"))
|
|
26
|
-
except Exception:
|
|
27
|
-
pass # type: ignore
|
|
28
|
-
console.print(Panel("📈 Deleting remote repository copy and pushing local changes", width=150, border_style="blue"))
|
|
29
|
-
|
|
30
|
-
repo_root_path.to_cloud(cloud=cloud, zip=True, encrypt=True, rel2home=True, os_specific=False)
|
|
31
|
-
|
|
32
|
-
console.print(Panel("✅ Repository successfully pushed to cloud", title="[bold green]Repo Sync[/bold green]", border_style="green"))
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# import sys
|
|
36
|
-
# import subprocess
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
def get_wt_cmd(wd1: PathExtended, wd2: PathExtended) -> str:
|
|
40
|
-
lines = [
|
|
41
|
-
f"""wt --window 0 new-tab --profile pwsh --title "gitdiff" --tabColor `#3b04d1 --startingDirectory {wd1} ` --colorScheme "Solarized Dark" """,
|
|
42
|
-
f"""split-pane --horizontal --profile pwsh --startingDirectory {wd2} --size 0.5 --colorScheme "Tango Dark" -- pwsh -Interactive """,
|
|
43
|
-
]
|
|
44
|
-
return " `; ".join(lines)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def inspect_repos(repo_local_root: str, repo_remote_root: str):
|
|
48
|
-
console.print(Panel(f"📂 Local: {repo_local_root}\n📂 Remote: {repo_remote_root}", title="[bold blue]🔍 Inspecting Repositories[/bold blue]", border_style="blue"))
|
|
49
|
-
|
|
50
|
-
if platform.system() == "Windows":
|
|
51
|
-
program = get_wt_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_local_root))
|
|
52
|
-
write_shell_script_to_file(shell_script=program)
|
|
53
|
-
return None
|
|
54
|
-
elif platform.system() in ["Linux", "Darwin"]:
|
|
55
|
-
program = get_zellij_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_remote_root))
|
|
56
|
-
write_shell_script_to_file(shell_script=program)
|
|
57
|
-
return None
|
|
58
|
-
else:
|
|
59
|
-
raise NotImplementedError(f"Platform {platform.system()} not implemented.")
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def fetch_dotfiles():
|
|
63
|
-
console.print(Panel("📁 Fetching Dotfiles", title="[bold blue]Dotfiles[/bold blue]", border_style="blue"))
|
|
64
|
-
|
|
65
|
-
cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
|
|
66
|
-
console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", width=150, border_style="yellow"))
|
|
67
|
-
|
|
68
|
-
dotfiles_local = PathExtended.home().joinpath("dotfiles")
|
|
69
|
-
CONFIG_PATH.joinpath("remote").mkdir(parents=True, exist_ok=True)
|
|
70
|
-
dotfiles_remote = PathExtended(CONFIG_PATH).joinpath("remote", dotfiles_local.rel2home())
|
|
71
|
-
remote_path = dotfiles_local.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
|
|
72
|
-
|
|
73
|
-
console.print(Panel("📥 Downloading dotfiles from cloud...", width=150, border_style="blue"))
|
|
74
|
-
|
|
75
|
-
dotfiles_remote.from_cloud(remotepath=remote_path, cloud=cloud_resolved, unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=None)
|
|
76
|
-
|
|
77
|
-
console.print(Panel("🗑️ Removing old dotfiles and replacing with cloud version...", width=150, border_style="blue"))
|
|
78
|
-
|
|
79
|
-
dotfiles_local.delete(sure=True)
|
|
80
|
-
dotfiles_remote.move(folder=PathExtended.home())
|
|
81
|
-
script = f"""
|
|
82
|
-
# rm -rf {dotfiles_local}
|
|
83
|
-
# mv {dotfiles_remote} {dotfiles_local}
|
|
84
|
-
"""
|
|
85
|
-
if platform.system() == "Linux":
|
|
86
|
-
script += """
|
|
87
|
-
sudo chmod 600 $HOME/.ssh/*
|
|
88
|
-
sudo chmod 700 $HOME/.ssh
|
|
89
|
-
sudo chmod +x $HOME/dotfiles/scripts/linux -R
|
|
90
|
-
"""
|
|
91
|
-
shell_path = write_shell_script_to_file(shell_script=script)
|
|
92
|
-
Terminal().run(f". {shell_path}", shell="bash").capture().print()
|
|
93
|
-
|
|
94
|
-
console.print(Panel("✅ Dotfiles successfully fetched and installed", title="[bold green]Dotfiles[/bold green]", border_style="green"))
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
def check_dotfiles_version_is_beyond(commit_dtm: str, update: bool) -> bool:
|
|
98
|
-
dotfiles_path = str(PathExtended.home().joinpath("dotfiles"))
|
|
99
|
-
from git import Repo
|
|
100
|
-
|
|
101
|
-
repo = Repo(path=dotfiles_path)
|
|
102
|
-
last_commit = repo.head.commit
|
|
103
|
-
dtm = last_commit.committed_datetime
|
|
104
|
-
from datetime import datetime # make it tz unaware
|
|
105
|
-
|
|
106
|
-
dtm = datetime(dtm.year, dtm.month, dtm.day, dtm.hour, dtm.minute, dtm.second)
|
|
107
|
-
res = dtm > datetime.fromisoformat(commit_dtm)
|
|
108
|
-
if res is False and update is True:
|
|
109
|
-
console = Console()
|
|
110
|
-
console.print(Panel(f"🔄 UPDATE REQUIRED | Updating dotfiles because {dtm} < {datetime.fromisoformat(commit_dtm)}", border_style="bold blue", expand=False))
|
|
111
|
-
from machineconfig.scripts.python.cloud_repo_sync import main
|
|
112
|
-
|
|
113
|
-
main(cloud=None, path=dotfiles_path)
|
|
114
|
-
return res
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
"""Repos
|
|
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 machineconfig.utils.io import read_ini
|
|
9
|
-
from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
|
|
10
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
11
|
-
from machineconfig.scripts.python.repos_helper_record import main as record_repos
|
|
12
|
-
from machineconfig.scripts.python.repos_helper_clone import clone_repos
|
|
13
|
-
from machineconfig.scripts.python.repos_helper_action import perform_git_operations
|
|
14
|
-
|
|
15
|
-
import typer
|
|
16
|
-
from typing import Annotated, Optional
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def main(
|
|
20
|
-
directory: Annotated[str, typer.Argument(help="📁 Folder containing repos to record or a specs JSON file to follow.")] = "",
|
|
21
|
-
push: Annotated[bool, typer.Option("--push", help="🚀 Push changes.")] = False,
|
|
22
|
-
pull: Annotated[bool, typer.Option("--pull", help="⬇️ Pull changes.")] = False,
|
|
23
|
-
commit: Annotated[bool, typer.Option("--commit", help="💾 Commit changes.")] = False,
|
|
24
|
-
all: Annotated[bool, typer.Option("--all", help="🔄 Pull, commit, and push changes.")] = False,
|
|
25
|
-
record: Annotated[bool, typer.Option("--record", help="📝 Record repositories.")] = False,
|
|
26
|
-
clone: Annotated[bool, typer.Option("--clone", help="📥 Clone repositories from record.")] = False,
|
|
27
|
-
checkout: Annotated[bool, typer.Option("--checkout", help="🔀 Check out to versions provided in a JSON file.")] = False,
|
|
28
|
-
checkout_to_branch: Annotated[bool, typer.Option("--checkout-to-branch", help="🔀 Check out to the main branch.")] = False,
|
|
29
|
-
recursive: Annotated[bool, typer.Option("--recursive", "-r", help="🔍 Recursive flag.")] = False,
|
|
30
|
-
no_sync: Annotated[bool, typer.Option("--no-sync", help="🚫 Disable automatic uv sync after pulls.")] = False,
|
|
31
|
-
cloud: Annotated[Optional[str], typer.Option("--cloud", "-c", help="☁️ Cloud storage option.")] = None,
|
|
32
|
-
) -> None:
|
|
33
|
-
print("\n" + "=" * 50)
|
|
34
|
-
print("📂 Welcome to the Repository Manager")
|
|
35
|
-
print("=" * 50 + "\n")
|
|
36
|
-
|
|
37
|
-
if directory == "":
|
|
38
|
-
repos_root = PathExtended.home().joinpath("code") # it is a positional argument, can never be empty.
|
|
39
|
-
else:
|
|
40
|
-
repos_root = PathExtended(directory).expanduser().absolute()
|
|
41
|
-
auto_sync = not no_sync # Enable auto sync by default, disable with --no-sync
|
|
42
|
-
if record:
|
|
43
|
-
save_path = record_repos(repos_root=repos_root)
|
|
44
|
-
if cloud is not None:
|
|
45
|
-
PathExtended(save_path).to_cloud(rel2home=True, cloud=cloud)
|
|
46
|
-
|
|
47
|
-
elif clone or checkout or checkout_to_branch:
|
|
48
|
-
print("\n📥 Cloning or checking out repositories...")
|
|
49
|
-
if not repos_root.exists() or repos_root.name != "repos.json":
|
|
50
|
-
repos_root = PathExtended(CONFIG_PATH).joinpath("repos").joinpath(repos_root.rel2home()).joinpath("repos.json")
|
|
51
|
-
if not repos_root.exists():
|
|
52
|
-
if cloud is None:
|
|
53
|
-
cloud_name: str = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
|
|
54
|
-
print(f"⚠️ Using default cloud: {cloud_name}")
|
|
55
|
-
else:
|
|
56
|
-
cloud_name = cloud
|
|
57
|
-
assert cloud_name is not None, f"Path {repos_root} does not exist and cloud was not passed. You can't clone without one of them."
|
|
58
|
-
repos_root.from_cloud(cloud=cloud_name, rel2home=True)
|
|
59
|
-
assert (repos_root.exists() and repos_root.name == "repos.json") or cloud is not None, f"Path {repos_root} does not exist and cloud was not passed. You can't clone without one of them."
|
|
60
|
-
clone_repos(spec_path=repos_root, preferred_remote=None, checkout_branch_flag=checkout_to_branch, checkout_commit_flag=checkout)
|
|
61
|
-
|
|
62
|
-
elif all or commit or pull or push:
|
|
63
|
-
perform_git_operations(
|
|
64
|
-
repos_root=repos_root,
|
|
65
|
-
pull=pull or all,
|
|
66
|
-
commit=commit or all,
|
|
67
|
-
push=push or all,
|
|
68
|
-
recursive=recursive,
|
|
69
|
-
auto_sync=auto_sync
|
|
70
|
-
)
|
|
71
|
-
else:
|
|
72
|
-
print("❌ No action specified. Try passing --push, --pull, --commit, or --all.")
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def main_from_parser() -> None:
|
|
76
|
-
typer.run(main)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if __name__ == "__main__":
|
|
80
|
-
main_from_parser()
|
|
@@ -1,335 +0,0 @@
|
|
|
1
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
2
|
-
from machineconfig.utils.accessories import randstr
|
|
3
|
-
from machineconfig.scripts.python.repos_helper_update import update_repository
|
|
4
|
-
|
|
5
|
-
from typing import Optional
|
|
6
|
-
from dataclasses import dataclass
|
|
7
|
-
from enum import Enum
|
|
8
|
-
|
|
9
|
-
from rich import print as pprint
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class GitAction(Enum):
|
|
13
|
-
commit = "commit"
|
|
14
|
-
push = "push"
|
|
15
|
-
pull = "pull"
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@dataclass
|
|
19
|
-
class GitOperationResult:
|
|
20
|
-
"""Result of a git operation on a single repository."""
|
|
21
|
-
repo_path: PathExtended
|
|
22
|
-
action: str
|
|
23
|
-
success: bool
|
|
24
|
-
message: str
|
|
25
|
-
is_git_repo: bool = True
|
|
26
|
-
had_changes: bool = False
|
|
27
|
-
remote_count: int = 0
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@dataclass
|
|
31
|
-
class GitOperationSummary:
|
|
32
|
-
"""Summary of all git operations performed."""
|
|
33
|
-
# Basic statistics
|
|
34
|
-
total_paths_processed: int = 0
|
|
35
|
-
git_repos_found: int = 0
|
|
36
|
-
non_git_paths: int = 0
|
|
37
|
-
|
|
38
|
-
# Per-operation statistics
|
|
39
|
-
commits_attempted: int = 0
|
|
40
|
-
commits_successful: int = 0
|
|
41
|
-
commits_no_changes: int = 0
|
|
42
|
-
commits_failed: int = 0
|
|
43
|
-
|
|
44
|
-
pulls_attempted: int = 0
|
|
45
|
-
pulls_successful: int = 0
|
|
46
|
-
pulls_failed: int = 0
|
|
47
|
-
|
|
48
|
-
pushes_attempted: int = 0
|
|
49
|
-
pushes_successful: int = 0
|
|
50
|
-
pushes_failed: int = 0
|
|
51
|
-
|
|
52
|
-
def __post_init__(self):
|
|
53
|
-
self.failed_operations: list[GitOperationResult] = []
|
|
54
|
-
self.repos_without_remotes: list[PathExtended] = []
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
def git_action(path: PathExtended, action: GitAction, mess: Optional[str] = None, r: bool = False, auto_sync: bool = True) -> GitOperationResult:
|
|
58
|
-
"""Perform git actions using Python instead of shell scripts. Returns detailed operation result."""
|
|
59
|
-
from git.exc import InvalidGitRepositoryError
|
|
60
|
-
from git.repo import Repo
|
|
61
|
-
|
|
62
|
-
try:
|
|
63
|
-
repo = Repo(str(path), search_parent_directories=False)
|
|
64
|
-
except InvalidGitRepositoryError:
|
|
65
|
-
pprint(f"⚠️ Skipping {path} because it is not a git repository.")
|
|
66
|
-
if r:
|
|
67
|
-
results = [git_action(path=sub_path, action=action, mess=mess, r=r, auto_sync=auto_sync) for sub_path in path.search()]
|
|
68
|
-
# For recursive calls, we need to aggregate results somehow
|
|
69
|
-
# For now, return success if all recursive operations succeeded
|
|
70
|
-
all_successful = all(result.success for result in results)
|
|
71
|
-
return GitOperationResult(
|
|
72
|
-
repo_path=path,
|
|
73
|
-
action=action.value,
|
|
74
|
-
success=all_successful,
|
|
75
|
-
message=f"Recursive operation: {len([r for r in results if r.success])}/{len(results)} succeeded",
|
|
76
|
-
is_git_repo=False
|
|
77
|
-
)
|
|
78
|
-
else:
|
|
79
|
-
return GitOperationResult(
|
|
80
|
-
repo_path=path,
|
|
81
|
-
action=action.value,
|
|
82
|
-
success=False,
|
|
83
|
-
message="Not a git repository",
|
|
84
|
-
is_git_repo=False
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
print(f">>>>>>>>> 🔧{action} - {path}")
|
|
88
|
-
remote_count = len(repo.remotes)
|
|
89
|
-
|
|
90
|
-
try:
|
|
91
|
-
if action == GitAction.commit:
|
|
92
|
-
if mess is None:
|
|
93
|
-
mess = "auto_commit_" + randstr()
|
|
94
|
-
|
|
95
|
-
# Check if there are changes to commit
|
|
96
|
-
if repo.is_dirty() or repo.untracked_files:
|
|
97
|
-
repo.git.add(A=True) # Stage all changes
|
|
98
|
-
repo.index.commit(mess)
|
|
99
|
-
print(f"✅ Committed changes with message: {mess}")
|
|
100
|
-
return GitOperationResult(
|
|
101
|
-
repo_path=path,
|
|
102
|
-
action=action.value,
|
|
103
|
-
success=True,
|
|
104
|
-
message=f"Committed changes with message: {mess}",
|
|
105
|
-
had_changes=True,
|
|
106
|
-
remote_count=remote_count
|
|
107
|
-
)
|
|
108
|
-
else:
|
|
109
|
-
print("ℹ️ No changes to commit")
|
|
110
|
-
return GitOperationResult(
|
|
111
|
-
repo_path=path,
|
|
112
|
-
action=action.value,
|
|
113
|
-
success=True,
|
|
114
|
-
message="No changes to commit",
|
|
115
|
-
had_changes=False,
|
|
116
|
-
remote_count=remote_count
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
elif action == GitAction.push:
|
|
120
|
-
if not repo.remotes:
|
|
121
|
-
print("⚠️ No remotes configured for push")
|
|
122
|
-
return GitOperationResult(
|
|
123
|
-
repo_path=path,
|
|
124
|
-
action=action.value,
|
|
125
|
-
success=False,
|
|
126
|
-
message="No remotes configured",
|
|
127
|
-
remote_count=0
|
|
128
|
-
)
|
|
129
|
-
|
|
130
|
-
success = True
|
|
131
|
-
failed_remotes = []
|
|
132
|
-
for remote in repo.remotes:
|
|
133
|
-
try:
|
|
134
|
-
print(f"🚀 Pushing to {remote.url}")
|
|
135
|
-
remote.push(repo.active_branch.name)
|
|
136
|
-
print(f"✅ Pushed to {remote.name}")
|
|
137
|
-
except Exception as e:
|
|
138
|
-
print(f"❌ Failed to push to {remote.name}: {e}")
|
|
139
|
-
failed_remotes.append(f"{remote.name}: {str(e)}")
|
|
140
|
-
success = False
|
|
141
|
-
|
|
142
|
-
message = "Push successful" if success else f"Push failed for: {', '.join(failed_remotes)}"
|
|
143
|
-
return GitOperationResult(
|
|
144
|
-
repo_path=path,
|
|
145
|
-
action=action.value,
|
|
146
|
-
success=success,
|
|
147
|
-
message=message,
|
|
148
|
-
remote_count=remote_count
|
|
149
|
-
)
|
|
150
|
-
|
|
151
|
-
elif action == GitAction.pull:
|
|
152
|
-
# Use the enhanced update function with uv sync support
|
|
153
|
-
try:
|
|
154
|
-
update_repository(repo, auto_sync=auto_sync, allow_password_prompt=False)
|
|
155
|
-
print("✅ Pull completed")
|
|
156
|
-
return GitOperationResult(
|
|
157
|
-
repo_path=path,
|
|
158
|
-
action=action.value,
|
|
159
|
-
success=True,
|
|
160
|
-
message="Pull completed successfully",
|
|
161
|
-
remote_count=remote_count
|
|
162
|
-
)
|
|
163
|
-
except Exception as e:
|
|
164
|
-
print(f"❌ Pull failed: {e}")
|
|
165
|
-
return GitOperationResult(
|
|
166
|
-
repo_path=path,
|
|
167
|
-
action=action.value,
|
|
168
|
-
success=False,
|
|
169
|
-
message=f"Pull failed: {str(e)}",
|
|
170
|
-
remote_count=remote_count
|
|
171
|
-
)
|
|
172
|
-
|
|
173
|
-
except Exception as e:
|
|
174
|
-
print(f"❌ Error performing {action} on {path}: {e}")
|
|
175
|
-
return GitOperationResult(
|
|
176
|
-
repo_path=path,
|
|
177
|
-
action=action.value,
|
|
178
|
-
success=False,
|
|
179
|
-
message=f"Error: {str(e)}",
|
|
180
|
-
remote_count=remote_count
|
|
181
|
-
)
|
|
182
|
-
|
|
183
|
-
# This should never be reached, but just in case
|
|
184
|
-
return GitOperationResult(
|
|
185
|
-
repo_path=path,
|
|
186
|
-
action=action.value,
|
|
187
|
-
success=False,
|
|
188
|
-
message="Unknown error",
|
|
189
|
-
remote_count=remote_count
|
|
190
|
-
)
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
def print_git_operations_summary(summary: GitOperationSummary, operations_performed: list[str]) -> None:
|
|
194
|
-
"""Print a detailed summary of git operations similar to repos_helper_record.py."""
|
|
195
|
-
print("\n📊 Git Operations Summary:")
|
|
196
|
-
print(f" Total paths processed: {summary.total_paths_processed}")
|
|
197
|
-
print(f" Git repositories found: {summary.git_repos_found}")
|
|
198
|
-
print(f" Non-git paths skipped: {summary.non_git_paths}")
|
|
199
|
-
|
|
200
|
-
# Show per-operation statistics
|
|
201
|
-
if "commit" in operations_performed:
|
|
202
|
-
print("\n💾 Commit Operations:")
|
|
203
|
-
print(f" Attempted: {summary.commits_attempted}")
|
|
204
|
-
print(f" Successful: {summary.commits_successful}")
|
|
205
|
-
print(f" No changes: {summary.commits_no_changes}")
|
|
206
|
-
print(f" Failed: {summary.commits_failed}")
|
|
207
|
-
|
|
208
|
-
if "pull" in operations_performed:
|
|
209
|
-
print("\n⬇️ Pull Operations:")
|
|
210
|
-
print(f" Attempted: {summary.pulls_attempted}")
|
|
211
|
-
print(f" Successful: {summary.pulls_successful}")
|
|
212
|
-
print(f" Failed: {summary.pulls_failed}")
|
|
213
|
-
|
|
214
|
-
if "push" in operations_performed:
|
|
215
|
-
print("\n🚀 Push Operations:")
|
|
216
|
-
print(f" Attempted: {summary.pushes_attempted}")
|
|
217
|
-
print(f" Successful: {summary.pushes_successful}")
|
|
218
|
-
print(f" Failed: {summary.pushes_failed}")
|
|
219
|
-
|
|
220
|
-
# Show repositories without remotes (important for push operations)
|
|
221
|
-
if summary.repos_without_remotes:
|
|
222
|
-
print(f"\n⚠️ WARNING: {len(summary.repos_without_remotes)} repositories have no remote configurations:")
|
|
223
|
-
for repo_path in summary.repos_without_remotes:
|
|
224
|
-
print(f" • {repo_path.name} ({repo_path})")
|
|
225
|
-
print(" These repositories cannot be pushed to remote servers.")
|
|
226
|
-
else:
|
|
227
|
-
if "push" in operations_performed:
|
|
228
|
-
print("\n✅ All repositories have remote configurations.")
|
|
229
|
-
|
|
230
|
-
# Show failed operations
|
|
231
|
-
if summary.failed_operations:
|
|
232
|
-
print(f"\n❌ FAILED OPERATIONS ({len(summary.failed_operations)} total):")
|
|
233
|
-
|
|
234
|
-
# Group failed operations by type
|
|
235
|
-
failed_by_action = {}
|
|
236
|
-
for failed_op in summary.failed_operations:
|
|
237
|
-
if failed_op.action not in failed_by_action:
|
|
238
|
-
failed_by_action[failed_op.action] = []
|
|
239
|
-
failed_by_action[failed_op.action].append(failed_op)
|
|
240
|
-
|
|
241
|
-
for action, failures in failed_by_action.items():
|
|
242
|
-
print(f"\n {action.upper()} failures ({len(failures)}):")
|
|
243
|
-
for failure in failures:
|
|
244
|
-
if not failure.is_git_repo:
|
|
245
|
-
print(f" • {failure.repo_path.name} ({failure.repo_path}) - Not a git repository")
|
|
246
|
-
else:
|
|
247
|
-
print(f" • {failure.repo_path.name} ({failure.repo_path}) - {failure.message}")
|
|
248
|
-
else:
|
|
249
|
-
print("\n✅ All git operations completed successfully!")
|
|
250
|
-
|
|
251
|
-
# Overall success assessment
|
|
252
|
-
total_failed = len(summary.failed_operations)
|
|
253
|
-
total_operations = (summary.commits_attempted + summary.pulls_attempted +
|
|
254
|
-
summary.pushes_attempted)
|
|
255
|
-
|
|
256
|
-
if total_failed == 0 and total_operations > 0:
|
|
257
|
-
print(f"\n🎉 SUCCESS: All {total_operations} operations completed successfully!")
|
|
258
|
-
elif total_operations == 0:
|
|
259
|
-
print("\n📝 No git operations were performed.")
|
|
260
|
-
else:
|
|
261
|
-
success_rate = ((total_operations - total_failed) / total_operations * 100) if total_operations > 0 else 0
|
|
262
|
-
print(f"\n⚖️ SUMMARY: {total_operations - total_failed}/{total_operations} operations succeeded ({success_rate:.1f}% success rate)")
|
|
263
|
-
if total_failed > 0:
|
|
264
|
-
print(" Review the failed operations above for details on what needs attention.")
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
def perform_git_operations(repos_root: PathExtended, pull: bool, commit: bool, push: bool, recursive: bool, auto_sync: bool) -> None:
|
|
268
|
-
"""Perform git operations on all repositories and provide detailed summary."""
|
|
269
|
-
print(f"\n🔄 Performing Git actions on repositories @ `{repos_root}`...")
|
|
270
|
-
|
|
271
|
-
# Initialize summary tracking
|
|
272
|
-
summary = GitOperationSummary()
|
|
273
|
-
operations_performed = []
|
|
274
|
-
|
|
275
|
-
# Determine which operations to perform
|
|
276
|
-
if pull:
|
|
277
|
-
operations_performed.append("pull")
|
|
278
|
-
if commit:
|
|
279
|
-
operations_performed.append("commit")
|
|
280
|
-
if push:
|
|
281
|
-
operations_performed.append("push")
|
|
282
|
-
|
|
283
|
-
for a_path in repos_root.search("*"):
|
|
284
|
-
print(f"{('Handling ' + str(a_path)).center(80, '-')}")
|
|
285
|
-
summary.total_paths_processed += 1
|
|
286
|
-
|
|
287
|
-
# Check if this is a git repository first
|
|
288
|
-
from git.exc import InvalidGitRepositoryError
|
|
289
|
-
from git.repo import Repo
|
|
290
|
-
|
|
291
|
-
try:
|
|
292
|
-
repo = Repo(str(a_path), search_parent_directories=False)
|
|
293
|
-
summary.git_repos_found += 1
|
|
294
|
-
|
|
295
|
-
# Track repos without remotes
|
|
296
|
-
if len(repo.remotes) == 0:
|
|
297
|
-
summary.repos_without_remotes.append(a_path)
|
|
298
|
-
|
|
299
|
-
# Now perform the actual operations
|
|
300
|
-
if pull:
|
|
301
|
-
result = git_action(path=a_path, action=GitAction.pull, r=recursive, auto_sync=auto_sync)
|
|
302
|
-
summary.pulls_attempted += 1
|
|
303
|
-
if result.success:
|
|
304
|
-
summary.pulls_successful += 1
|
|
305
|
-
else:
|
|
306
|
-
summary.pulls_failed += 1
|
|
307
|
-
summary.failed_operations.append(result)
|
|
308
|
-
|
|
309
|
-
if commit:
|
|
310
|
-
result = git_action(a_path, action=GitAction.commit, r=recursive, auto_sync=auto_sync)
|
|
311
|
-
summary.commits_attempted += 1
|
|
312
|
-
if result.success:
|
|
313
|
-
if result.had_changes:
|
|
314
|
-
summary.commits_successful += 1
|
|
315
|
-
else:
|
|
316
|
-
summary.commits_no_changes += 1
|
|
317
|
-
else:
|
|
318
|
-
summary.commits_failed += 1
|
|
319
|
-
summary.failed_operations.append(result)
|
|
320
|
-
|
|
321
|
-
if push:
|
|
322
|
-
result = git_action(a_path, action=GitAction.push, r=recursive, auto_sync=auto_sync)
|
|
323
|
-
summary.pushes_attempted += 1
|
|
324
|
-
if result.success:
|
|
325
|
-
summary.pushes_successful += 1
|
|
326
|
-
else:
|
|
327
|
-
summary.pushes_failed += 1
|
|
328
|
-
summary.failed_operations.append(result)
|
|
329
|
-
|
|
330
|
-
except InvalidGitRepositoryError:
|
|
331
|
-
summary.non_git_paths += 1
|
|
332
|
-
pprint(f"⚠️ Skipping {a_path} because it is not a git repository.")
|
|
333
|
-
|
|
334
|
-
# Print the detailed summary
|
|
335
|
-
print_git_operations_summary(summary, operations_performed)
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
from typing import Optional, Annotated
|
|
5
|
-
import typer
|
|
6
|
-
from rich.console import Console
|
|
7
|
-
from rich.panel import Panel
|
|
8
|
-
from rich.text import Text
|
|
9
|
-
from rich.align import Align
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
"""
|
|
13
|
-
uv run --python 3.13 --with machineconfig
|
|
14
|
-
reference:
|
|
15
|
-
# https://github.com/tsl0922/ttyd/wiki/Serving-web-fonts
|
|
16
|
-
# -t "fontFamily=CaskaydiaCove" bash
|
|
17
|
-
# --terminal-type xterm-kitty
|
|
18
|
-
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def display_terminal_url(local_ip_v4: str, port: int) -> None:
|
|
23
|
-
"""Display a flashy, unmissable terminal URL announcement."""
|
|
24
|
-
console = Console()
|
|
25
|
-
|
|
26
|
-
# Create the main message with styling
|
|
27
|
-
url_text = Text(f"http://{local_ip_v4}:{port}", style="bold bright_cyan underline")
|
|
28
|
-
message = Text.assemble(
|
|
29
|
-
("🚀 ", "bright_red"),
|
|
30
|
-
("Terminal is now accessible at: ", "bright_white bold"),
|
|
31
|
-
url_text,
|
|
32
|
-
(" 🚀", "bright_red")
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
# Create a fancy panel with borders and styling
|
|
36
|
-
panel = Panel(
|
|
37
|
-
Align.center(message),
|
|
38
|
-
title="[bold bright_green]🌐 WEB TERMINAL READY 🌐[/bold bright_green]",
|
|
39
|
-
subtitle="[italic bright_yellow]⚡ Click the link above to access your terminal! ⚡[/italic bright_yellow]",
|
|
40
|
-
border_style="bright_magenta",
|
|
41
|
-
padding=(1, 2),
|
|
42
|
-
expand=False
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
# Print with extra spacing and attention-grabbing elements
|
|
46
|
-
# console.print("\n" + "🔥" * 60 + "\n", style="bright_red bold")
|
|
47
|
-
console.print(panel)
|
|
48
|
-
# console.print("🔥" * 60 + "\n", style="bright_red bold")
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
def install_ttyd():
|
|
52
|
-
# uv run --python 3.13 --with machineconfig devops install ttyd
|
|
53
|
-
from machineconfig.utils.installer_utils.installer_abc import check_tool_exists
|
|
54
|
-
exists = check_tool_exists("ttyd")
|
|
55
|
-
if exists:
|
|
56
|
-
print("✅ ttyd is already installed.")
|
|
57
|
-
return
|
|
58
|
-
print("⏳ ttyd not found. Installing...")
|
|
59
|
-
from machineconfig.scripts.python.devops_devapps_install import main
|
|
60
|
-
main(which="ttyd")
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
def main(
|
|
65
|
-
port: Annotated[Optional[int], typer.Option("--port", "-p", help="Port to run the terminal server on (default: 7681)")] = None,
|
|
66
|
-
username: Annotated[Optional[str], typer.Option("--username", "-u", help="Username for terminal access (default: current user)")] = None,
|
|
67
|
-
password: Annotated[Optional[str], typer.Option("--password", "-w", help="Password for terminal access (default: from ~/dotfiles/creds/passwords/quick_password)")] = None
|
|
68
|
-
) -> None:
|
|
69
|
-
install_ttyd()
|
|
70
|
-
if username is None:
|
|
71
|
-
import getpass
|
|
72
|
-
username = getpass.getuser()
|
|
73
|
-
if password is None:
|
|
74
|
-
pwd_path = Path.home().joinpath("dotfiles/creds/passwords/quick_password")
|
|
75
|
-
if pwd_path.exists():
|
|
76
|
-
password = pwd_path.read_text(encoding="utf-8").strip()
|
|
77
|
-
else:
|
|
78
|
-
raise ValueError("Password not provided and default password file does not exist.")
|
|
79
|
-
|
|
80
|
-
if port is None:
|
|
81
|
-
port = 7681 # Default port for ttyd
|
|
82
|
-
|
|
83
|
-
import socket
|
|
84
|
-
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
85
|
-
s.connect(('8.8.8.8',80))
|
|
86
|
-
local_ip_v4 = s.getsockname()[0]
|
|
87
|
-
s.close()
|
|
88
|
-
|
|
89
|
-
# Display the flashy terminal announcement
|
|
90
|
-
display_terminal_url(local_ip_v4, port)
|
|
91
|
-
|
|
92
|
-
code = f"""#!/bin/bash
|
|
93
|
-
ttyd --writable -t enableSixel=true --port {port} --credential "{username}:{password}" -t 'theme={{"background": "black"}}' bash
|
|
94
|
-
"""
|
|
95
|
-
import subprocess
|
|
96
|
-
subprocess.run(code, shell=True, check=True)
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def main_with_parser():
|
|
100
|
-
typer.run(main)
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if __name__ == "__main__":
|
|
104
|
-
pass
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# def main():
|
|
2
|
-
# print("\n" + "=" * 50)
|
|
3
|
-
# print("📸 Welcome to the Snapshot Tool")
|
|
4
|
-
# print("=" * 50 + "\n")
|
|
5
|
-
|
|
6
|
-
# parser = argparse.ArgumentParser(description='📷 Capture snapshots using your webcam.')
|
|
7
|
-
# parser.add_argument("--to_text", "-t", help="📝 Convert the snapshot to text using OCR.", action="store_true")
|
|
8
|
-
# args = parser.parse_args()
|
|
9
|
-
|
|
10
|
-
# print("📷 Capturing image from webcam...")
|
|
11
|
-
# img_path = capture_from_webcam(show=False, wait=False, save=True)
|
|
12
|
-
# print(f"✅ Image captured and saved at: {img_path}\n")
|
|
13
|
-
|
|
14
|
-
# if args.to_text:
|
|
15
|
-
# print("🔍 Converting image to text using Tesseract OCR...")
|
|
16
|
-
# q = Terminal().run(f"cd ~/AppData/Local/Tesseract-OCR; pytesseract '{img_path}'", shell="pwsh").capture().op
|
|
17
|
-
# print("📝 Extracted Text:")
|
|
18
|
-
# print("-" * 50)
|
|
19
|
-
# print(q)
|
|
20
|
-
# print("-" * 50 + "\n")
|
|
21
|
-
# else:
|
|
22
|
-
# print("📂 Image saved successfully. No text extraction requested.\n")
|
|
23
|
-
|
|
24
|
-
# if __name__ == '__main__':
|
|
25
|
-
# main()
|