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,186 +0,0 @@
|
|
|
1
|
-
"""utils"""
|
|
2
|
-
|
|
3
|
-
from pathlib import Path
|
|
4
|
-
import git
|
|
5
|
-
from machineconfig.utils.io import read_ini
|
|
6
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
7
|
-
from machineconfig.utils.terminal import Terminal
|
|
8
|
-
|
|
9
|
-
from machineconfig.scripts.python.helpers.repo_sync_helpers import fetch_dotfiles
|
|
10
|
-
from machineconfig.utils.source_of_truth import CONFIG_PATH, DEFAULTS_PATH
|
|
11
|
-
from machineconfig.utils.options import choose_from_options
|
|
12
|
-
from machineconfig.utils.code import get_shell_file_executing_python_script, write_shell_script_to_file
|
|
13
|
-
import platform
|
|
14
|
-
from typing import Optional, Literal
|
|
15
|
-
from rich.console import Console
|
|
16
|
-
from rich.panel import Panel
|
|
17
|
-
|
|
18
|
-
console = Console()
|
|
19
|
-
|
|
20
|
-
_ = fetch_dotfiles
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def main(cloud: Optional[str] = None, path: Optional[str] = None, message: Optional[str] = None, action: Literal["ask", "pushLocalMerge", "overwriteLocal", "InspectRepos", "RemoveLocalRclone"] = "ask", pwd: Optional[str] = None):
|
|
24
|
-
if cloud is None:
|
|
25
|
-
try:
|
|
26
|
-
cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
|
|
27
|
-
console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", title="Default Cloud", border_style="yellow"))
|
|
28
|
-
except FileNotFoundError:
|
|
29
|
-
console.print(Panel(f"❌ ERROR: No cloud profile found\nLocation: {DEFAULTS_PATH}\nPlease set one up or provide one via the --cloud flag.", title="Error", border_style="red"))
|
|
30
|
-
return ""
|
|
31
|
-
else:
|
|
32
|
-
cloud_resolved = cloud
|
|
33
|
-
|
|
34
|
-
# repo_root = PathExtended(args.repo).expanduser().absolute()
|
|
35
|
-
repo_local_root = PathExtended.cwd() if path is None else PathExtended(path).expanduser().absolute()
|
|
36
|
-
repo_local_obj = git.Repo(repo_local_root, search_parent_directories=True)
|
|
37
|
-
repo_local_root = PathExtended(repo_local_obj.working_dir) # cwd might have been in a sub directory of repo_root, so its better to redefine it.
|
|
38
|
-
PathExtended(CONFIG_PATH).joinpath("remote").mkdir(parents=True, exist_ok=True)
|
|
39
|
-
repo_remote_root = PathExtended(CONFIG_PATH).joinpath("remote", repo_local_root.rel2home()) # .delete(sure=True)
|
|
40
|
-
|
|
41
|
-
try:
|
|
42
|
-
console.print(Panel("📥 DOWNLOADING REMOTE REPOSITORY", title_align="left", border_style="blue"))
|
|
43
|
-
remote_path = repo_local_root.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
|
|
44
|
-
repo_remote_root.from_cloud(remotepath=remote_path, cloud=cloud_resolved, unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=pwd)
|
|
45
|
-
except AssertionError:
|
|
46
|
-
console.print(Panel("🆕 Remote repository doesn't exist\n📤 Creating new remote and exiting...", title_align="left", border_style="green"))
|
|
47
|
-
repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
|
|
48
|
-
return ""
|
|
49
|
-
|
|
50
|
-
repo_remote_obj = git.Repo(repo_remote_root)
|
|
51
|
-
if repo_remote_obj.is_dirty():
|
|
52
|
-
console.print(Panel(f"⚠️ WARNING: REMOTE REPOSITORY IS DIRTY\nLocation: {repo_remote_root}\nPlease commit or stash changes before proceeding.", title="Warning", border_style="yellow"))
|
|
53
|
-
|
|
54
|
-
script = f"""
|
|
55
|
-
echo ""
|
|
56
|
-
echo 'echo -e "\\033[1;34m═════ COMMITTING LOCAL CHANGES ═════\\033[0m"'
|
|
57
|
-
cd {repo_local_root}
|
|
58
|
-
git status
|
|
59
|
-
git add .
|
|
60
|
-
git commit -am "{message}"
|
|
61
|
-
echo ""
|
|
62
|
-
echo ""
|
|
63
|
-
echo 'echo -e "\\033[1;34m═════ PULLING LATEST FROM REMOTE ═════\\033[0m"'
|
|
64
|
-
cd {repo_local_root}
|
|
65
|
-
echo '-> Trying to removing originEnc remote from local repo if it exists.'
|
|
66
|
-
# git remote remove originEnc
|
|
67
|
-
git remote remove originEnc 2>/dev/null || true
|
|
68
|
-
echo '-> Adding originEnc remote to local repo'
|
|
69
|
-
git remote add originEnc {repo_remote_root}
|
|
70
|
-
echo '-> Fetching originEnc remote.'
|
|
71
|
-
git pull originEnc master
|
|
72
|
-
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
shell_path = write_shell_script_to_file(shell_script=script)
|
|
76
|
-
res = Terminal().run(f". {shell_path}", shell="powershell").capture().print()
|
|
77
|
-
|
|
78
|
-
if res.is_successful(strict_err=True, strict_returcode=True):
|
|
79
|
-
console.print(Panel("✅ Pull succeeded!\n🧹 Removing originEnc remote and local copy\n📤 Pushing merged repository to cloud storage", title="Success", border_style="green"))
|
|
80
|
-
repo_remote_root.delete(sure=True)
|
|
81
|
-
from git.remote import Remote
|
|
82
|
-
|
|
83
|
-
Remote.remove(repo_local_obj, "originEnc")
|
|
84
|
-
repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
|
|
85
|
-
return "success"
|
|
86
|
-
else:
|
|
87
|
-
console.print(Panel(f"⚠️ MERGE FAILED\n💾 Keeping local copy of remote at:\n📂 {repo_remote_root}", title="Merge Failed", border_style="red"))
|
|
88
|
-
|
|
89
|
-
# ================================================================================
|
|
90
|
-
option1 = "Delete remote copy and push local:"
|
|
91
|
-
program_1_py = f"""
|
|
92
|
-
from machineconfig.scripts.python.helpers.repo_sync_helpers import delete_remote_repo_copy_and_push_local as func
|
|
93
|
-
func(remote_repo=r'{str(repo_remote_root)}', local_repo=r'{str(repo_local_root)}', cloud=r'{cloud_resolved}')
|
|
94
|
-
"""
|
|
95
|
-
shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
|
|
96
|
-
# ================================================================================
|
|
97
|
-
|
|
98
|
-
option2 = "Delete local repo and replace it with remote copy:"
|
|
99
|
-
program_2 = f"""
|
|
100
|
-
rm -rfd {repo_local_root}
|
|
101
|
-
mv {repo_remote_root} {repo_local_root}
|
|
102
|
-
"""
|
|
103
|
-
if platform.system() in ["Linux", "Darwin"]:
|
|
104
|
-
program_2 += """
|
|
105
|
-
sudo chmod 600 $HOME/.ssh/*
|
|
106
|
-
sudo chmod 700 $HOME/.ssh
|
|
107
|
-
sudo chmod +x $HOME/dotfiles/scripts/linux -R
|
|
108
|
-
"""
|
|
109
|
-
|
|
110
|
-
shell_file_2 = write_shell_script_to_file(shell_script=program_2)
|
|
111
|
-
|
|
112
|
-
# ================================================================================
|
|
113
|
-
option3 = "Inspect repos:"
|
|
114
|
-
program_3_py = f"""
|
|
115
|
-
from machineconfig.scripts.python.helper.repo_sync_helpers import inspect_repos as func
|
|
116
|
-
func(repo_local_root=r'{str(repo_local_root)}', repo_remote_root=r'{str(repo_remote_root)}')
|
|
117
|
-
"""
|
|
118
|
-
shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
|
|
119
|
-
# ================================================================================
|
|
120
|
-
|
|
121
|
-
option4 = "Remove problematic rclone file from repo and replace with remote:"
|
|
122
|
-
program_4 = f"""
|
|
123
|
-
rm $HOME/dotfiles/creds/rclone/rclone.conf
|
|
124
|
-
cp $HOME/.config/machineconfig/remote/dotfiles/creds/rclone/rclone.conf $HOME/dotfiles/creds/rclone
|
|
125
|
-
cd $HOME/dotfiles
|
|
126
|
-
git commit -am "finished merging"
|
|
127
|
-
. {shell_file_1}
|
|
128
|
-
"""
|
|
129
|
-
shell_file_4 = write_shell_script_to_file(shell_script=program_4)
|
|
130
|
-
# ================================================================================
|
|
131
|
-
|
|
132
|
-
console.print(Panel("🔄 RESOLVE MERGE CONFLICT\nChoose an option to resolve the conflict:", title_align="left", border_style="blue"))
|
|
133
|
-
|
|
134
|
-
print(f"• 1️⃣ {option1:75} 👉 {shell_file_1}")
|
|
135
|
-
print(f"• 2️⃣ {option2:75} 👉 {shell_file_2}")
|
|
136
|
-
print(f"• 3️⃣ {option3:75} 👉 {shell_file_3}")
|
|
137
|
-
print(f"• 4️⃣ {option4:75} 👉 {shell_file_4}")
|
|
138
|
-
|
|
139
|
-
program_content = None
|
|
140
|
-
match action:
|
|
141
|
-
case "ask":
|
|
142
|
-
choice = choose_from_options(multi=False, msg="Choose one option", options=[option1, option2, option3, option4], fzf=False)
|
|
143
|
-
if choice == option1:
|
|
144
|
-
program_content = shell_file_1.read_text(encoding="utf-8")
|
|
145
|
-
elif choice == option2:
|
|
146
|
-
program_content = program_2
|
|
147
|
-
elif choice == option3:
|
|
148
|
-
program_content = shell_file_3.read_text(encoding="utf-8")
|
|
149
|
-
elif choice == option4:
|
|
150
|
-
program_content = program_4
|
|
151
|
-
else:
|
|
152
|
-
raise NotImplementedError(f"Choice {choice} not implemented.")
|
|
153
|
-
case "pushLocalMerge":
|
|
154
|
-
program_content = shell_file_1.read_text(encoding="utf-8")
|
|
155
|
-
case "overwriteLocal":
|
|
156
|
-
program_content = program_2
|
|
157
|
-
case "InspectRepos":
|
|
158
|
-
program_content = shell_file_3.read_text(encoding="utf-8")
|
|
159
|
-
case "RemoveLocalRclone":
|
|
160
|
-
program_content = program_4
|
|
161
|
-
case _:
|
|
162
|
-
raise ValueError(f"Unknown action: {action}")
|
|
163
|
-
# PROGRAM_PATH.write_text(program_content, encoding="utf-8")
|
|
164
|
-
import subprocess
|
|
165
|
-
|
|
166
|
-
subprocess.run(program_content, shell=True, check=True)
|
|
167
|
-
|
|
168
|
-
return program_content
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
def args_parser():
|
|
172
|
-
# console.print(Panel("🔄 Repository Synchronization Utility", title_align="left", border_style="blue"))
|
|
173
|
-
# parser = argparse.ArgumentParser(description="Secure Repo CLI.")
|
|
174
|
-
# parser.add_argument("path", nargs="?", type=str, help="Repository path, defaults to cwd.", default=None)
|
|
175
|
-
# parser.add_argument("--cloud", "-c", help="rclone cloud profile name.", default=None)
|
|
176
|
-
# parser.add_argument("--message", "-m", help="Commit Message", default=f"new message {randstr()}")
|
|
177
|
-
# parser.add_argument("--pwd", "-p", help="Password for encryption", default=None)
|
|
178
|
-
# parser.add_argument("--action", "-a", help="Action to take if merge fails.", choices=["ask", "pushLocalMerge", "overwriteLocal", "InspectRepos", "RemoveLocalRclone"], default="ask")
|
|
179
|
-
# args = parser.parse_args()
|
|
180
|
-
# main(cloud=args.cloud, path=args.path, message=args.message, action=args.action)
|
|
181
|
-
import typer
|
|
182
|
-
typer.run(main)
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
if __name__ == "__main__":
|
|
186
|
-
args_parser()
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
"""Devops Devapps Install"""
|
|
2
|
-
|
|
3
|
-
import typer
|
|
4
|
-
from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
5
|
-
from platform import system
|
|
6
|
-
from typing import Optional, Literal, TypeAlias, cast, get_args, Annotated
|
|
7
|
-
|
|
8
|
-
WHICH_CAT: TypeAlias = Literal["essentials", "essentialsDev", "systymPackages", "precheckedPackages", "ia"]
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def main_with_parser():
|
|
12
|
-
import typer
|
|
13
|
-
app = typer.Typer()
|
|
14
|
-
app.command()(main)
|
|
15
|
-
app()
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def main(which: Annotated[Optional[str], typer.Argument(help=f"Choose a category or program to install, {list(get_args(WHICH_CAT))} or <program_name> or list of programs names separated by comma.")]) -> None:
|
|
19
|
-
if which in get_args(WHICH_CAT): # install by category
|
|
20
|
-
return get_programs_by_category(program_name=which) # type: ignore
|
|
21
|
-
from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
|
|
22
|
-
from machineconfig.utils.installer import get_installers
|
|
23
|
-
if which != "ia" and which is not None: # install by name
|
|
24
|
-
total_messages: list[str] = []
|
|
25
|
-
for a_which in which.split(",") if type(which) == str else which:
|
|
26
|
-
all_installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL", "GITHUB_DEV", "CUSTOM_DEV"])
|
|
27
|
-
|
|
28
|
-
# Find installer by exe_name or name
|
|
29
|
-
selected_installer = None
|
|
30
|
-
for installer in all_installers:
|
|
31
|
-
exe_name = installer.installer_data.get("exeName", "")
|
|
32
|
-
app_name = installer.installer_data.get("appName", "")
|
|
33
|
-
if exe_name == a_which or app_name == a_which:
|
|
34
|
-
selected_installer = installer
|
|
35
|
-
break
|
|
36
|
-
|
|
37
|
-
if selected_installer is None:
|
|
38
|
-
available_names = [f"{inst.installer_data.get('exeName', 'unknown')} ({inst.installer_data.get('appName', 'unknown')})" for inst in all_installers[:10]] # Show first 10
|
|
39
|
-
raise ValueError(f"{a_which=} not found. Available installers include: {available_names}")
|
|
40
|
-
|
|
41
|
-
print(f"""
|
|
42
|
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
43
|
-
┃ 🔧 Installing: {a_which}
|
|
44
|
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
45
|
-
print(selected_installer)
|
|
46
|
-
message = selected_installer.install_robust(version=None) # finish the task
|
|
47
|
-
total_messages.append(message)
|
|
48
|
-
for a_message in total_messages:
|
|
49
|
-
print(a_message)
|
|
50
|
-
return None
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def install_interactively():
|
|
55
|
-
from machineconfig.utils.options import choose_from_options
|
|
56
|
-
from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
|
|
57
|
-
from machineconfig.utils.installer import get_installers
|
|
58
|
-
installers = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL", "GITHUB_DEV", "CUSTOM_DEV"])
|
|
59
|
-
# Check installed programs with progress indicator
|
|
60
|
-
with Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}")) as progress:
|
|
61
|
-
task = progress.add_task("✅ Checking installed programs...", total=len(installers))
|
|
62
|
-
installer_options = []
|
|
63
|
-
for x in installers:
|
|
64
|
-
installer_options.append(x.get_description())
|
|
65
|
-
progress.update(task, advance=1)
|
|
66
|
-
|
|
67
|
-
# Add category options at the beginning for better visibility
|
|
68
|
-
category_options = [f"📦 {cat}" for cat in get_args(WHICH_CAT)]
|
|
69
|
-
options = category_options + ["─" * 50] + installer_options
|
|
70
|
-
|
|
71
|
-
program_names = choose_from_options(multi=True, msg="Categories are prefixed with 📦", options=options, header="🚀 CHOOSE DEV APP OR CATEGORY", default="📦 essentials", fzf=True)
|
|
72
|
-
|
|
73
|
-
total_commands = ""
|
|
74
|
-
installation_messages: list[str] = []
|
|
75
|
-
for _an_idx, a_program_name in enumerate(program_names):
|
|
76
|
-
# Skip separator lines
|
|
77
|
-
if a_program_name.startswith("─"):
|
|
78
|
-
continue
|
|
79
|
-
|
|
80
|
-
print(f"""
|
|
81
|
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
82
|
-
┃ 🔄 Processing: {a_program_name}
|
|
83
|
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
84
|
-
|
|
85
|
-
# Handle category options (remove emoji prefix)
|
|
86
|
-
if a_program_name.startswith("📦 "):
|
|
87
|
-
category_name = a_program_name[2:] # Remove "📦 " prefix
|
|
88
|
-
if category_name in get_args(WHICH_CAT):
|
|
89
|
-
get_programs_by_category(program_name=cast(WHICH_CAT, category_name))
|
|
90
|
-
else:
|
|
91
|
-
# Handle individual installer options
|
|
92
|
-
installer_idx = installer_options.index(a_program_name)
|
|
93
|
-
an_installer = installers[installer_idx]
|
|
94
|
-
status_message = an_installer.install_robust(version=None) # finish the task - this returns a status message, not a command
|
|
95
|
-
installation_messages.append(status_message)
|
|
96
|
-
|
|
97
|
-
# Print all installation status messages
|
|
98
|
-
print("\n📊 INSTALLATION SUMMARY:")
|
|
99
|
-
print("=" * 50)
|
|
100
|
-
for message in installation_messages:
|
|
101
|
-
print(message)
|
|
102
|
-
|
|
103
|
-
# Only run shell commands if there are any (from category installations)
|
|
104
|
-
if total_commands.strip():
|
|
105
|
-
import subprocess
|
|
106
|
-
|
|
107
|
-
print("\n🚀 Running additional shell commands...")
|
|
108
|
-
subprocess.run(total_commands, shell=True, check=True)
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def get_programs_by_category(program_name: WHICH_CAT):
|
|
112
|
-
print(f"""
|
|
113
|
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
114
|
-
┃ 📦 Installing Category: {program_name}
|
|
115
|
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
116
|
-
from machineconfig.utils.source_of_truth import LIBRARY_ROOT
|
|
117
|
-
from machineconfig.utils.installer import get_installers, install_all
|
|
118
|
-
from machineconfig.utils.installer_utils.installer_abc import parse_apps_installer_linux, parse_apps_installer_windows
|
|
119
|
-
from machineconfig.utils.schemas.installer.installer_types import get_normalized_arch, get_os_name
|
|
120
|
-
from machineconfig.utils.options import choose_from_options
|
|
121
|
-
match program_name:
|
|
122
|
-
case "essentials":
|
|
123
|
-
installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL"])
|
|
124
|
-
install_all(installers=installers_)
|
|
125
|
-
case "essentialsDev":
|
|
126
|
-
installers_ = get_installers(os=get_os_name(), arch=get_normalized_arch(), which_cats=["GITHUB_DEV", "CUSTOM_DEV", "GITHUB_ESSENTIAL", "CUSTOM_ESSENTIAL"])
|
|
127
|
-
install_all(installers=installers_)
|
|
128
|
-
case "systymPackages":
|
|
129
|
-
if system() == "Windows":
|
|
130
|
-
options_system = parse_apps_installer_windows(LIBRARY_ROOT.joinpath("setup_windows/apps.ps1").read_text(encoding="utf-8"))
|
|
131
|
-
elif system() == "Linux":
|
|
132
|
-
options_system_1 = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps_dev.sh").read_text(encoding="utf-8"))
|
|
133
|
-
options_system_2 = parse_apps_installer_linux(LIBRARY_ROOT.joinpath("setup_linux/apps.sh").read_text(encoding="utf-8"))
|
|
134
|
-
options_system = {**options_system_1, **options_system_2}
|
|
135
|
-
else:
|
|
136
|
-
raise NotImplementedError(f"❌ System {system()} not supported")
|
|
137
|
-
program_names = choose_from_options(multi=True, msg="", options=sorted(list(options_system.keys())), header="🚀 CHOOSE DEV APP", fzf=True)
|
|
138
|
-
program = ""
|
|
139
|
-
for name in program_names:
|
|
140
|
-
print(f"""
|
|
141
|
-
┌────────────────────────────────────────────────────
|
|
142
|
-
│ ⚙️ Installing: {name}
|
|
143
|
-
└────────────────────────────────────────────────────""")
|
|
144
|
-
sub_program = options_system[name]
|
|
145
|
-
if sub_program.startswith("#winget"):
|
|
146
|
-
sub_program = sub_program[1:]
|
|
147
|
-
program += "\n" + sub_program
|
|
148
|
-
case "ia":
|
|
149
|
-
install_interactively()
|
|
150
|
-
case "precheckedPackages":
|
|
151
|
-
# from machineconfig.jobs.python.check_installations import precheckedPackages
|
|
152
|
-
# ci = precheckedPackages()
|
|
153
|
-
# ci.download_safe_apps(name="essentials")
|
|
154
|
-
# program = ""
|
|
155
|
-
raise NotImplementedError("precheckedPackages is not implemented yet.")
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
if __name__ == "__main__":
|
|
159
|
-
pass
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
"""Update repositories with fancy output"""
|
|
2
|
-
|
|
3
|
-
import git
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from machineconfig.scripts.python.repos_helper_update import RepositoryUpdateResult, run_uv_sync, update_repository
|
|
6
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
7
|
-
from machineconfig.utils.source_of_truth import DEFAULTS_PATH
|
|
8
|
-
from machineconfig.utils.io import read_ini
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def _display_summary(results: list[RepositoryUpdateResult]) -> None:
|
|
12
|
-
"""Display a comprehensive summary of all repository update operations."""
|
|
13
|
-
print("\n" + "=" * 80)
|
|
14
|
-
print("📊 REPOSITORY UPDATE SUMMARY")
|
|
15
|
-
print("=" * 80)
|
|
16
|
-
|
|
17
|
-
# Calculate statistics
|
|
18
|
-
total_repos = len(results)
|
|
19
|
-
successful_repos = sum(1 for r in results if r["status"] == "success")
|
|
20
|
-
error_repos = sum(1 for r in results if r["status"] == "error")
|
|
21
|
-
skipped_repos = sum(1 for r in results if r["status"] == "skipped")
|
|
22
|
-
auth_failed_repos = sum(1 for r in results if r["status"] == "auth_failed")
|
|
23
|
-
|
|
24
|
-
repos_with_changes = sum(1 for r in results if r["commits_changed"])
|
|
25
|
-
repos_with_uncommitted = sum(1 for r in results if r["had_uncommitted_changes"])
|
|
26
|
-
repos_with_dep_changes = sum(1 for r in results if r["dependencies_changed"])
|
|
27
|
-
uv_sync_runs = sum(1 for r in results if r["uv_sync_ran"])
|
|
28
|
-
uv_sync_successes = sum(1 for r in results if r["uv_sync_ran"] and r["uv_sync_success"])
|
|
29
|
-
|
|
30
|
-
# Overview statistics
|
|
31
|
-
print("📈 OVERVIEW:")
|
|
32
|
-
print(f" Total repositories processed: {total_repos}")
|
|
33
|
-
print(f" ✅ Successful updates: {successful_repos}")
|
|
34
|
-
print(f" ❌ Failed updates: {error_repos}")
|
|
35
|
-
print(f" ⏭️ Skipped: {skipped_repos}")
|
|
36
|
-
if auth_failed_repos > 0:
|
|
37
|
-
print(f" 🔐 Authentication failed: {auth_failed_repos}")
|
|
38
|
-
print()
|
|
39
|
-
|
|
40
|
-
print("🔄 CHANGES:")
|
|
41
|
-
print(f" Repositories with new commits: {repos_with_changes}")
|
|
42
|
-
print(f" Repositories with dependency changes: {repos_with_dep_changes}")
|
|
43
|
-
print(f" Repositories with uncommitted changes: {repos_with_uncommitted}")
|
|
44
|
-
print()
|
|
45
|
-
|
|
46
|
-
print("📦 UV SYNC:")
|
|
47
|
-
print(f" uv sync operations attempted: {uv_sync_runs}")
|
|
48
|
-
print(f" uv sync operations successful: {uv_sync_successes}")
|
|
49
|
-
if uv_sync_runs > uv_sync_successes:
|
|
50
|
-
print(f" uv sync operations failed: {uv_sync_runs - uv_sync_successes}")
|
|
51
|
-
print()
|
|
52
|
-
|
|
53
|
-
# Detailed results per repository
|
|
54
|
-
print("📋 DETAILED RESULTS:")
|
|
55
|
-
for result in results:
|
|
56
|
-
repo_name = Path(result["repo_path"]).name
|
|
57
|
-
status_icon = {"success": "✅", "error": "❌", "skipped": "⏭️", "auth_failed": "🔐"}.get(result["status"], "❓")
|
|
58
|
-
print(f" {status_icon} {repo_name}")
|
|
59
|
-
|
|
60
|
-
if result["status"] == "error" and result["error_message"]:
|
|
61
|
-
print(f" 💥 Error: {result['error_message']}")
|
|
62
|
-
|
|
63
|
-
if result["commits_changed"]:
|
|
64
|
-
print(f" 🔄 Updated: {result['commit_before'][:8]} → {result['commit_after'][:8]}")
|
|
65
|
-
elif result["status"] == "success":
|
|
66
|
-
print(" 📍 Already up to date")
|
|
67
|
-
|
|
68
|
-
if result["had_uncommitted_changes"]:
|
|
69
|
-
files_str = ", ".join(result["uncommitted_files"])
|
|
70
|
-
print(f" ⚠️ Had uncommitted changes: {files_str}")
|
|
71
|
-
|
|
72
|
-
if result["dependencies_changed"]:
|
|
73
|
-
changes = []
|
|
74
|
-
if result["pyproject_changed"]:
|
|
75
|
-
changes.append("pyproject.toml")
|
|
76
|
-
print(f" 📋 Dependencies changed: {', '.join(changes)}")
|
|
77
|
-
|
|
78
|
-
if result["uv_sync_ran"]:
|
|
79
|
-
sync_status = "✅" if result["uv_sync_success"] else "❌"
|
|
80
|
-
print(f" 📦 uv sync: {sync_status}")
|
|
81
|
-
|
|
82
|
-
if result["is_machineconfig_repo"] and result["permissions_updated"]:
|
|
83
|
-
print(" 🛠 Updated permissions for machineconfig files")
|
|
84
|
-
|
|
85
|
-
if result["remotes_processed"]:
|
|
86
|
-
print(f" 📡 Processed remotes: {', '.join(result['remotes_processed'])}")
|
|
87
|
-
if result["remotes_skipped"]:
|
|
88
|
-
print(f" ⏭️ Skipped remotes: {', '.join(result['remotes_skipped'])}")
|
|
89
|
-
|
|
90
|
-
print("\n" + "=" * 80)
|
|
91
|
-
|
|
92
|
-
# Final status
|
|
93
|
-
if error_repos == 0 and auth_failed_repos == 0:
|
|
94
|
-
print("🎉 All repositories processed successfully!")
|
|
95
|
-
elif successful_repos > 0:
|
|
96
|
-
print(f"⚠️ {successful_repos}/{total_repos} repositories processed successfully")
|
|
97
|
-
else:
|
|
98
|
-
print("❌ No repositories were successfully processed")
|
|
99
|
-
print("=" * 80)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def main(verbose: bool = True, allow_password_prompt: bool = False) -> None:
|
|
103
|
-
"""Main function to update all configured repositories."""
|
|
104
|
-
_ = verbose
|
|
105
|
-
repos: list[PathExtended] = [PathExtended.home() / "code/machineconfig", PathExtended.home() / "code/crocodile"]
|
|
106
|
-
try:
|
|
107
|
-
tmp = read_ini(DEFAULTS_PATH)["general"]["repos"].split(",")
|
|
108
|
-
if tmp[-1] == "":
|
|
109
|
-
tmp = tmp[:-1]
|
|
110
|
-
for item in tmp:
|
|
111
|
-
item_obj = PathExtended(item).expanduser()
|
|
112
|
-
if item_obj not in repos:
|
|
113
|
-
repos.append(item_obj)
|
|
114
|
-
except (FileNotFoundError, KeyError, IndexError):
|
|
115
|
-
print(f"""
|
|
116
|
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
117
|
-
┃ 🚫 Configuration Error: Missing {DEFAULTS_PATH} or section [general] or key repos
|
|
118
|
-
┃ ℹ️ Using default repositories instead
|
|
119
|
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
120
|
-
print("""
|
|
121
|
-
┌────────────────────────────────────────────────────────────────
|
|
122
|
-
│ ✨ Example Configuration:
|
|
123
|
-
│
|
|
124
|
-
│ [general]
|
|
125
|
-
│ repos = ~/code/repo1,~/code/repo2
|
|
126
|
-
│ rclone_config_name = onedrivePersonal
|
|
127
|
-
│ email_config_name = Yahoo3
|
|
128
|
-
│ to_email = myemail@email.com
|
|
129
|
-
└────────────────────────────────────────────────────────────────""")
|
|
130
|
-
|
|
131
|
-
# Process repositories
|
|
132
|
-
results: list[RepositoryUpdateResult] = []
|
|
133
|
-
repos_with_changes = []
|
|
134
|
-
|
|
135
|
-
for expanded_path in repos:
|
|
136
|
-
try:
|
|
137
|
-
repo = git.Repo(str(expanded_path), search_parent_directories=True)
|
|
138
|
-
# Update repository and get detailed results
|
|
139
|
-
result = update_repository(repo, allow_password_prompt=allow_password_prompt, auto_sync=True)
|
|
140
|
-
results.append(result)
|
|
141
|
-
|
|
142
|
-
# Keep track of repos with dependency changes for additional uv sync
|
|
143
|
-
if result["dependencies_changed"] and not result["uv_sync_ran"]:
|
|
144
|
-
repos_with_changes.append(Path(repo.working_dir))
|
|
145
|
-
|
|
146
|
-
except Exception as ex:
|
|
147
|
-
# Create a result for failed repos
|
|
148
|
-
error_result: RepositoryUpdateResult = {
|
|
149
|
-
"repo_path": str(expanded_path),
|
|
150
|
-
"status": "error",
|
|
151
|
-
"had_uncommitted_changes": False,
|
|
152
|
-
"uncommitted_files": [],
|
|
153
|
-
"commit_before": "",
|
|
154
|
-
"commit_after": "",
|
|
155
|
-
"commits_changed": False,
|
|
156
|
-
"pyproject_changed": False,
|
|
157
|
-
"dependencies_changed": False,
|
|
158
|
-
"uv_sync_ran": False,
|
|
159
|
-
"uv_sync_success": False,
|
|
160
|
-
"remotes_processed": [],
|
|
161
|
-
"remotes_skipped": [],
|
|
162
|
-
"error_message": str(ex),
|
|
163
|
-
"is_machineconfig_repo": False,
|
|
164
|
-
"permissions_updated": False,
|
|
165
|
-
}
|
|
166
|
-
results.append(error_result)
|
|
167
|
-
print(f"""❌ Repository Error: Path: {expanded_path}
|
|
168
|
-
Exception: {ex}
|
|
169
|
-
{"-" * 50}""")
|
|
170
|
-
|
|
171
|
-
# Run uv sync for repositories where pyproject.toml changed but sync wasn't run yet
|
|
172
|
-
for repo_path in repos_with_changes:
|
|
173
|
-
run_uv_sync(repo_path)
|
|
174
|
-
|
|
175
|
-
# Generate and display summary
|
|
176
|
-
_display_summary(results)
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
if __name__ == "__main__":
|
|
180
|
-
main()
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"""Like yadm and dotter."""
|
|
2
|
-
|
|
3
|
-
from machineconfig.utils.path_extended import PathExtended as PathExtended
|
|
4
|
-
from machineconfig.utils.links import symlink_func
|
|
5
|
-
from machineconfig.utils.source_of_truth import LIBRARY_ROOT, REPO_ROOT
|
|
6
|
-
from typing import Annotated
|
|
7
|
-
import typer
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def main(
|
|
11
|
-
file: Annotated[str, typer.Argument(help="file/folder path.")],
|
|
12
|
-
overwrite: Annotated[bool, typer.Option("--overwrite", "-o", help="Overwrite.")] = False,
|
|
13
|
-
dest: Annotated[str, typer.Option("--dest", "-d", help="destination folder")] = "",
|
|
14
|
-
) -> None:
|
|
15
|
-
orig_path = PathExtended(file).expanduser().absolute()
|
|
16
|
-
if dest == "":
|
|
17
|
-
if "Local" in str(orig_path):
|
|
18
|
-
junction = orig_path.split(at="Local", sep=-1)[1]
|
|
19
|
-
elif "Roaming" in str(orig_path):
|
|
20
|
-
junction = orig_path.split(at="Roaming", sep=-1)[1]
|
|
21
|
-
elif ".config" in str(orig_path):
|
|
22
|
-
junction = orig_path.split(at=".config", sep=-1)[1]
|
|
23
|
-
else:
|
|
24
|
-
junction = orig_path.rel2home()
|
|
25
|
-
new_path = PathExtended(REPO_ROOT).joinpath(junction)
|
|
26
|
-
else:
|
|
27
|
-
dest_path = PathExtended(dest).expanduser().absolute()
|
|
28
|
-
dest_path.mkdir(parents=True, exist_ok=True)
|
|
29
|
-
new_path = dest_path.joinpath(orig_path.name)
|
|
30
|
-
|
|
31
|
-
symlink_func(this=orig_path, to_this=new_path, prioritize_to_this=overwrite)
|
|
32
|
-
|
|
33
|
-
print("""
|
|
34
|
-
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
35
|
-
┃ ✅ Symbolic Link Created Successfully
|
|
36
|
-
┃
|
|
37
|
-
┃ 🔄 To enshrine this mapping, add the following to mapper.toml:
|
|
38
|
-
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━""")
|
|
39
|
-
print(f"""
|
|
40
|
-
📝 Edit configuration file: nano {PathExtended(LIBRARY_ROOT)}/symlinks/mapper.toml
|
|
41
|
-
|
|
42
|
-
[{new_path.parent.name}]
|
|
43
|
-
{orig_path.name.split(".")[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}
|
|
44
|
-
""")
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
def arg_parser() -> None:
|
|
48
|
-
typer.run(main)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
if __name__ == "__main__":
|
|
52
|
-
arg_parser()
|