machineconfig 5.15__py3-none-any.whl → 7.98__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +0 -1
- machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +114 -289
- machineconfig/cluster/sessions_managers/wt_local_manager.py +70 -210
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +52 -198
- 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 +25 -170
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +16 -12
- 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 -3
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/hx.py +76 -19
- machineconfig/jobs/installer/custom/yazi.py +119 -0
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +5 -9
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/nerdfont.py +1 -1
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +33 -28
- machineconfig/jobs/installer/custom_dev/sysabc.py +139 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/custom_dev/winget.py +10 -14
- machineconfig/jobs/installer/installer_data.json +1487 -229
- 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/q.sh +10 -6
- 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 +106 -177
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +62 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +147 -0
- machineconfig/profile/mapper.toml +263 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +123 -117
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/scripts/command_runner.sh +9 -0
- 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/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +5 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +28 -5
- machineconfig/scripts/python/ai/utils/generate_files.py +348 -0
- machineconfig/scripts/python/ai/utils/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +137 -113
- machineconfig/scripts/python/devops.py +61 -101
- machineconfig/scripts/python/devops_navigator.py +6 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -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/fire_jobs.py +110 -150
- machineconfig/scripts/python/ftpx.py +51 -24
- machineconfig/scripts/python/helpers/ast_search.py +74 -0
- machineconfig/scripts/python/helpers/qr_code.py +166 -0
- machineconfig/scripts/python/helpers/repo_rag.py +325 -0
- machineconfig/scripts/python/helpers/run_py_script.py +79 -0
- machineconfig/scripts/python/helpers/symantic_search.py +25 -0
- machineconfig/scripts/python/helpers/tmp_py_scripts/a.py +26 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +55 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_help_launch.py +126 -0
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +32 -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} +29 -35
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +8 -9
- machineconfig/scripts/python/helpers_devops/cli_config.py +105 -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 +214 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +215 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +172 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +142 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_share_terminal.py} +45 -35
- 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 +499 -0
- machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
- 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} +3 -3
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/helpers_fire_command/f.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +121 -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}/fzfg +3 -3
- machineconfig/scripts/python/helpers_msearch/scripts_windows/fzfg.ps1 +59 -0
- 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 +620 -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_network/__init__.py +0 -0
- machineconfig/scripts/python/helpers_network/address.py +132 -0
- machineconfig/scripts/python/{devops_add_identity.py → helpers_network/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/helpers_network/devops_add_ssh_key.py +153 -0
- machineconfig/scripts/{linux → python/helpers_network}/mount_nfs +0 -1
- machineconfig/scripts/python/{mount_nfs.py → helpers_network/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/helpers_network}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → helpers_network/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → helpers_network/onetimeshare.py} +0 -1
- machineconfig/scripts/python/helpers_network/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/helpers_network/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → helpers_network/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → helpers_network/wsl_windows_transfer.py} +5 -4
- 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} +2 -3
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- 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 +65 -0
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/path.py +185 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/mcfg_entry.py +58 -0
- machineconfig/scripts/python/msearch.py +71 -0
- machineconfig/scripts/python/sessions.py +119 -45
- machineconfig/scripts/python/terminal.py +133 -0
- machineconfig/scripts/python/utils.py +64 -0
- machineconfig/scripts/windows/mounts/Restore-ThunderbirdProfile.ps1 +92 -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 +63 -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/lfcd.ps1 +1 -1
- 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 +82 -31
- machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +1 -1
- machineconfig/settings/shells/nushell/config.nu +2 -35
- machineconfig/settings/shells/nushell/env.nu +45 -6
- machineconfig/settings/shells/nushell/init.nu +314 -0
- machineconfig/settings/shells/pwsh/init.ps1 +61 -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/television/cable_unix/alias.toml +8 -0
- machineconfig/settings/television/cable_unix/aws-buckets.toml +14 -0
- machineconfig/settings/television/cable_unix/aws-instances.toml +13 -0
- machineconfig/settings/television/cable_unix/bash-history.toml +8 -0
- machineconfig/settings/television/cable_unix/channels.toml +19 -0
- machineconfig/settings/television/cable_unix/dirs.toml +13 -0
- machineconfig/settings/television/cable_unix/distrobox-list.toml +42 -0
- machineconfig/settings/television/cable_unix/docker-images.toml +13 -0
- machineconfig/settings/television/cable_unix/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_unix/env.toml +17 -0
- machineconfig/settings/television/cable_unix/files.toml +11 -0
- machineconfig/settings/television/cable_unix/fish-history.toml +8 -0
- machineconfig/settings/television/cable_unix/git-branch.toml +11 -0
- machineconfig/settings/television/cable_unix/git-diff.toml +10 -0
- machineconfig/settings/television/cable_unix/git-log.toml +12 -0
- machineconfig/settings/television/cable_unix/git-reflog.toml +12 -0
- machineconfig/settings/television/cable_unix/git-repos.toml +16 -0
- machineconfig/settings/television/cable_unix/guix.toml +20 -0
- machineconfig/settings/television/cable_unix/just-recipes.toml +18 -0
- machineconfig/settings/television/cable_unix/k8s-deployments.toml +36 -0
- machineconfig/settings/television/cable_unix/k8s-pods.toml +50 -0
- machineconfig/settings/television/cable_unix/k8s-services.toml +36 -0
- machineconfig/settings/television/cable_unix/man-pages.toml +24 -0
- machineconfig/settings/television/cable_unix/nu-history.toml +7 -0
- machineconfig/settings/television/cable_unix/procs.toml +20 -0
- machineconfig/settings/television/cable_unix/text.toml +17 -0
- machineconfig/settings/television/cable_unix/tldr.toml +18 -0
- machineconfig/settings/television/cable_unix/zsh-history.toml +9 -0
- machineconfig/settings/television/cable_windows/alias.toml +7 -0
- machineconfig/settings/television/cable_windows/dirs.toml +13 -0
- machineconfig/settings/television/cable_windows/docker-images.toml +13 -0
- machineconfig/settings/television/cable_windows/dotfiles.toml +11 -0
- machineconfig/settings/television/cable_windows/env.toml +17 -0
- machineconfig/settings/television/cable_windows/files.toml +14 -0
- machineconfig/settings/television/cable_windows/git-branch.toml +11 -0
- machineconfig/settings/television/cable_windows/git-diff.toml +10 -0
- machineconfig/settings/television/cable_windows/git-log.toml +11 -0
- machineconfig/settings/television/cable_windows/git-reflog.toml +11 -0
- machineconfig/settings/television/cable_windows/git-repos.toml +15 -0
- machineconfig/settings/television/cable_windows/nu-history.toml +7 -0
- machineconfig/settings/television/cable_windows/pwsh-history.toml +6 -0
- machineconfig/settings/television/cable_windows/text.toml +17 -0
- machineconfig/settings/yazi/init.lua +61 -0
- machineconfig/settings/yazi/keymap_linux.toml +94 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/theme.toml +4 -0
- machineconfig/settings/yazi/yazi_linux.toml +84 -0
- machineconfig/settings/yazi/yazi_windows.toml +58 -0
- machineconfig/setup_linux/__init__.py +11 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- 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_linux/web_shortcuts/live_from_github.sh +31 -0
- 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 +11 -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 +17 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/live_from_github.ps1 +30 -0
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +17 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +155 -105
- 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 +1 -1
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +11 -14
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +10 -18
- machineconfig/utils/installer_utils/github_release_bulk.py +156 -119
- machineconfig/utils/installer_utils/install_from_url.py +183 -0
- machineconfig/utils/installer_utils/installer_class.py +64 -181
- machineconfig/utils/installer_utils/installer_cli.py +175 -0
- machineconfig/utils/installer_utils/installer_helper.py +129 -0
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +66 -97
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +49 -82
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +256 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +48 -101
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +88 -124
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +263 -274
- machineconfig/utils/ssh_utils/abc.py +5 -0
- machineconfig/utils/ssh_utils/copy_from_here.py +111 -0
- machineconfig/utils/ssh_utils/copy_to_here.py +302 -0
- machineconfig/utils/ssh_utils/utils.py +142 -0
- machineconfig/utils/ssh_utils/wsl.py +210 -0
- machineconfig/utils/terminal.py +3 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-7.98.dist-info/METADATA +132 -0
- machineconfig-7.98.dist-info/RECORD +504 -0
- machineconfig-7.98.dist-info/entry_points.txt +13 -0
- machineconfig/cluster/sessions_managers/ffile.py +0 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
- machineconfig/jobs/python/python_ve_symlink.py +0 -37
- machineconfig/jobs/python/vscode/api.py +0 -57
- machineconfig/jobs/python/vscode/sync_code.py +0 -73
- 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 -303
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/agents +0 -2
- 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/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzfag +0 -17
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/fzfrga +0 -21
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/sessions +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/skrg +0 -4
- 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/generate_files.py +0 -83
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -190
- machineconfig/scripts/python/count_lines_frontend.py +0 -16
- machineconfig/scripts/python/devops_add_ssh_key.py +0 -120
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_help_launch.py +0 -120
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/fire_jobs_route_helper.py +0 -65
- 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 -116
- machineconfig/scripts/python/repos.py +0 -132
- machineconfig/scripts/python/repos_helper_action.py +0 -378
- 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/agents.ps1 +0 -1
- 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/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- 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/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/sessions.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/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/nix/cli_installation.sh +0 -157
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- 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/utils/installer_utils/installer.py +0 -189
- machineconfig-5.15.dist-info/METADATA +0 -188
- machineconfig-5.15.dist-info/RECORD +0 -415
- machineconfig-5.15.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.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/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/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/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.ps1 → 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/scripts/python/{fire_jobs_streamlit_helper.py → 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/{windows/share_nfs.ps1 → python/helpers_devops/__init__.py} +0 -0
- /machineconfig/{settings/shells/pwsh/profile.ps1 → scripts/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_network}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → helpers_network/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_network}/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-5.15.dist-info → machineconfig-7.98.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.98.dist-info}/top_level.txt +0 -0
machineconfig/scripts/linux/z_ls
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
|
|
3
|
-
# if variable zellij is not set, then set it to /$HOME/.local/bin/zellij
|
|
4
|
-
if [ -z "$zellij" ]; then
|
|
5
|
-
# zellij="$HOME/.local/bin/zellij"
|
|
6
|
-
PATH="$HOME/.local/bin:$PATH"
|
|
7
|
-
fi
|
|
8
|
-
|
|
9
|
-
# adopted from https://zellij.dev/documentation/integration.html
|
|
10
|
-
ZJ_SESSIONS=$(zellij list-sessions)
|
|
11
|
-
# echo "$ZJ_SESSIONS"
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
attach=false
|
|
15
|
-
|
|
16
|
-
while (( "$#" )); do
|
|
17
|
-
case "$1" in
|
|
18
|
-
--attach)
|
|
19
|
-
attach=true
|
|
20
|
-
shift
|
|
21
|
-
;;
|
|
22
|
-
*)
|
|
23
|
-
shift
|
|
24
|
-
;;
|
|
25
|
-
esac
|
|
26
|
-
done
|
|
27
|
-
|
|
28
|
-
if $attach; then
|
|
29
|
-
echo "attached"
|
|
30
|
-
fi
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
NO_SESSIONS=$(echo "${ZJ_SESSIONS}" | wc -l)
|
|
34
|
-
# if ZJ_SESSIONS is empty, then set NO_SESSIONS to 0
|
|
35
|
-
if [ -z "${ZJ_SESSIONS}" ]; then
|
|
36
|
-
NO_SESSIONS=0
|
|
37
|
-
fi
|
|
38
|
-
|
|
39
|
-
# check whether the string "(current)" is in ZJ_SESSIONS
|
|
40
|
-
if [[ "${ZJ_SESSIONS}" == *"(current)"* ]]; then
|
|
41
|
-
# if so, then we are in a zellijsession
|
|
42
|
-
echo "already inside a session, existing."
|
|
43
|
-
COMMANDS=$(ls $HOME/code/machineconfig/src/machineconfig/settings/zellij/commands)
|
|
44
|
-
# fzf the results
|
|
45
|
-
res="$(echo -e "${COMMANDS}" | fzf --ansi)"
|
|
46
|
-
# run the bash fiZJ_SESSIONSle chosen
|
|
47
|
-
bash $HOME/code/machineconfig/src/machineconfig/settings/zellij/commands/$res
|
|
48
|
-
|
|
49
|
-
else # ==> we are not in a zellijsession
|
|
50
|
-
if [ "${NO_SESSIONS}" -ge 1 ]; then # sessions do exist
|
|
51
|
-
|
|
52
|
-
# remove sessions that have 'EXITED' in them
|
|
53
|
-
ZJ_SESSIONS=$(echo -e "${ZJ_SESSIONS}" | grep -v "EXITED")
|
|
54
|
-
|
|
55
|
-
echo "zj_sessions:$ZJ_SESSIONS:end of zj_sessions"
|
|
56
|
-
|
|
57
|
-
# if the result has only 1 line in it and $attach is raised, then attach to it and exit the if statement and the script
|
|
58
|
-
NO_SESSIONS=$(echo "${ZJ_SESSIONS}" | wc -l)
|
|
59
|
-
|
|
60
|
-
echo "NO_SESSIONS: $NO_SESSIONS"
|
|
61
|
-
|
|
62
|
-
# if ZJ_SESSIONS is empty, then set NO_SESSIONS to 0
|
|
63
|
-
if [ -z "${ZJ_SESSIONS}" ]; then
|
|
64
|
-
NO_SESSIONS=0
|
|
65
|
-
zellij --layout st2
|
|
66
|
-
exit 0
|
|
67
|
-
fi
|
|
68
|
-
echo "NO_SESSIONS: $NO_SESSIONS"
|
|
69
|
-
|
|
70
|
-
if [ "${NO_SESSIONS}" -eq 1 ] && $attach; then
|
|
71
|
-
chosen_session=$(echo -e "${ZJ_SESSIONS}" | cut -d' ' -f1)
|
|
72
|
-
# remove the ansi colors from chosen_session
|
|
73
|
-
chosen_session=$(echo $chosen_session | sed 's/\x1b\[[0-9;]*m//g')
|
|
74
|
-
# echo "attaching to $chosen_session exclusively."
|
|
75
|
-
zellij attach "$chosen_session"
|
|
76
|
-
exit 0
|
|
77
|
-
fi
|
|
78
|
-
|
|
79
|
-
# add my options to the list of sessions
|
|
80
|
-
# if number of sessions is zero, then exclude ZJ_SESSIONS from the fzf options
|
|
81
|
-
if [ "${NO_SESSIONS}" -eq 0 ]; then
|
|
82
|
-
ZJ_SESSIONS="new_session\nkill_all_and_create_fresh_one\nexit_zellij"
|
|
83
|
-
else
|
|
84
|
-
ZJ_SESSIONS="$ZJ_SESSIONS\nnew_session\nkill_all_and_create_fresh_one\nexit_zellij"
|
|
85
|
-
fi
|
|
86
|
-
|
|
87
|
-
res="$(echo -e "${ZJ_SESSIONS}" | fzf --ansi)"
|
|
88
|
-
# split `res` at the first space, and take the first element
|
|
89
|
-
res=$(echo $res | cut -d' ' -f1)
|
|
90
|
-
if [ "${res}" = "exit_zellij" ]; then
|
|
91
|
-
echo "existing zellij."
|
|
92
|
-
elif [ "${res}" = "new_session" ]; then
|
|
93
|
-
zellij --layout st2 # can't specify name here. I can call it "main" only if it is the first, otherwise name conflict! also, can't use attach -c syntax because layout can't be specified.
|
|
94
|
-
elif [ "${res}" = "kill_all_and_create_fresh_one" ]; then
|
|
95
|
-
zellij ka -y
|
|
96
|
-
zellij --layout st2
|
|
97
|
-
else
|
|
98
|
-
zellij attach $res # options --mirror-session false
|
|
99
|
-
fi
|
|
100
|
-
else # no sessions, create one called main
|
|
101
|
-
zellij --layout st2
|
|
102
|
-
fi
|
|
103
|
-
|
|
104
|
-
fi
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Script to generate a markdown table with checkboxes for all Python files in the repo."""
|
|
3
|
-
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
def get_python_files(repo_root: Path) -> list[str]:
|
|
8
|
-
"""Get all Python files relative to repo root."""
|
|
9
|
-
# Get all .py files recursively
|
|
10
|
-
py_files = list(repo_root.glob("**/*.py"))
|
|
11
|
-
|
|
12
|
-
# Filter out files in .venv and __pycache__ directories
|
|
13
|
-
filtered_files = []
|
|
14
|
-
for file_path in py_files:
|
|
15
|
-
relative_path = file_path.relative_to(repo_root)
|
|
16
|
-
path_parts = relative_path.parts
|
|
17
|
-
|
|
18
|
-
# Skip files in .venv or __pycache__ directories
|
|
19
|
-
if any(part in {".venv", "__pycache__"} for part in path_parts):
|
|
20
|
-
continue
|
|
21
|
-
|
|
22
|
-
filtered_files.append(str(relative_path))
|
|
23
|
-
|
|
24
|
-
return sorted(filtered_files)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def generate_markdown_table(files: list[str]) -> str:
|
|
28
|
-
"""Generate markdown table with checkboxes."""
|
|
29
|
-
header = "# Python Files Checklist\n\n"
|
|
30
|
-
table = "| Index | File Path | Status |\n|-------|-----------|--------|\n"
|
|
31
|
-
|
|
32
|
-
for index, file_path in enumerate(files, start=1):
|
|
33
|
-
# Remove leading ./ if present
|
|
34
|
-
clean_path = file_path.lstrip("./")
|
|
35
|
-
table += f"| {index} | {clean_path} | - [ ] |\n"
|
|
36
|
-
|
|
37
|
-
return header + table
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
def main() -> None:
|
|
41
|
-
"""Main function."""
|
|
42
|
-
repo_root = Path.cwd()
|
|
43
|
-
if not repo_root.joinpath("pyproject.toml").exists():
|
|
44
|
-
raise RuntimeError(f" {repo_root} Not a repo root")
|
|
45
|
-
output_file = repo_root / ".ai" / "all_files_with_index.md"
|
|
46
|
-
|
|
47
|
-
print(f"Repo root: {repo_root}")
|
|
48
|
-
print(f"Output file: {output_file}")
|
|
49
|
-
|
|
50
|
-
# Ensure output directory exists
|
|
51
|
-
output_file.parent.mkdir(parents=True, exist_ok=True)
|
|
52
|
-
|
|
53
|
-
# Get Python files
|
|
54
|
-
python_files = get_python_files(repo_root)
|
|
55
|
-
print(f"Found {len(python_files)} Python files")
|
|
56
|
-
|
|
57
|
-
# Generate markdown
|
|
58
|
-
markdown_content = generate_markdown_table(python_files)
|
|
59
|
-
print(f"Generated markdown content length: {len(markdown_content)}")
|
|
60
|
-
|
|
61
|
-
# Write to file
|
|
62
|
-
output_file.write_text(markdown_content)
|
|
63
|
-
print(f"Generated {output_file} with {len(python_files)} Python files")
|
|
64
|
-
|
|
65
|
-
# Create 5 symlinks to repo_root at ~/code_copies/${repo_name}_copy_{i}
|
|
66
|
-
import pathlib
|
|
67
|
-
|
|
68
|
-
# import os
|
|
69
|
-
repo_root = pathlib.Path.cwd().resolve()
|
|
70
|
-
repo_name: str = pathlib.Path(repo_root).name
|
|
71
|
-
symlink_dir: pathlib.Path = pathlib.Path.home() / "code_copies"
|
|
72
|
-
symlink_dir.mkdir(exist_ok=True)
|
|
73
|
-
for i in range(1, 6):
|
|
74
|
-
symlink_path: pathlib.Path = symlink_dir / f"{repo_name}_copy_{i}"
|
|
75
|
-
if symlink_path.exists() or symlink_path.is_symlink():
|
|
76
|
-
symlink_path.unlink()
|
|
77
|
-
symlink_path.symlink_to(repo_root, target_is_directory=True)
|
|
78
|
-
# Windows equivalent (comment):
|
|
79
|
-
# for /l %i in (1,1,5) do mklink /D "%USERPROFILE%\code_copies\{repo_name}_copy_%i" "C:\path\to\repo_root"
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
if __name__ == "__main__":
|
|
83
|
-
main()
|
|
@@ -1,190 +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
|
|
7
|
-
from machineconfig.utils.terminal import Response
|
|
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
|
-
import subprocess
|
|
15
|
-
from typing import Optional, Literal
|
|
16
|
-
from rich.console import Console
|
|
17
|
-
from rich.panel import Panel
|
|
18
|
-
|
|
19
|
-
console = Console()
|
|
20
|
-
|
|
21
|
-
_ = fetch_dotfiles
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
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):
|
|
25
|
-
if cloud is None:
|
|
26
|
-
try:
|
|
27
|
-
cloud_resolved = read_ini(DEFAULTS_PATH)["general"]["rclone_config_name"]
|
|
28
|
-
console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", title="Default Cloud", border_style="yellow"))
|
|
29
|
-
except FileNotFoundError:
|
|
30
|
-
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"))
|
|
31
|
-
return ""
|
|
32
|
-
else:
|
|
33
|
-
cloud_resolved = cloud
|
|
34
|
-
|
|
35
|
-
# repo_root = PathExtended(args.repo).expanduser().absolute()
|
|
36
|
-
repo_local_root = PathExtended.cwd() if path is None else PathExtended(path).expanduser().absolute()
|
|
37
|
-
repo_local_obj = git.Repo(repo_local_root, search_parent_directories=True)
|
|
38
|
-
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.
|
|
39
|
-
PathExtended(CONFIG_PATH).joinpath("remote").mkdir(parents=True, exist_ok=True)
|
|
40
|
-
repo_remote_root = PathExtended(CONFIG_PATH).joinpath("remote", repo_local_root.rel2home()) # .delete(sure=True)
|
|
41
|
-
|
|
42
|
-
try:
|
|
43
|
-
console.print(Panel("📥 DOWNLOADING REMOTE REPOSITORY", title_align="left", border_style="blue"))
|
|
44
|
-
remote_path = repo_local_root.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
|
|
45
|
-
repo_remote_root.from_cloud(remotepath=remote_path, cloud=cloud_resolved, unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=pwd)
|
|
46
|
-
except AssertionError:
|
|
47
|
-
console.print(Panel("🆕 Remote repository doesn't exist\n📤 Creating new remote and exiting...", title_align="left", border_style="green"))
|
|
48
|
-
repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
|
|
49
|
-
return ""
|
|
50
|
-
|
|
51
|
-
repo_remote_obj = git.Repo(repo_remote_root)
|
|
52
|
-
if repo_remote_obj.is_dirty():
|
|
53
|
-
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"))
|
|
54
|
-
|
|
55
|
-
script = f"""
|
|
56
|
-
echo ""
|
|
57
|
-
echo 'echo -e "\\033[1;34m═════ COMMITTING LOCAL CHANGES ═════\\033[0m"'
|
|
58
|
-
cd {repo_local_root}
|
|
59
|
-
git status
|
|
60
|
-
git add .
|
|
61
|
-
git commit -am "{message}"
|
|
62
|
-
echo ""
|
|
63
|
-
echo ""
|
|
64
|
-
echo 'echo -e "\\033[1;34m═════ PULLING LATEST FROM REMOTE ═════\\033[0m"'
|
|
65
|
-
cd {repo_local_root}
|
|
66
|
-
echo '-> Trying to removing originEnc remote from local repo if it exists.'
|
|
67
|
-
# git remote remove originEnc
|
|
68
|
-
git remote remove originEnc 2>/dev/null || true
|
|
69
|
-
echo '-> Adding originEnc remote to local repo'
|
|
70
|
-
git remote add originEnc {repo_remote_root}
|
|
71
|
-
echo '-> Fetching originEnc remote.'
|
|
72
|
-
git pull originEnc master
|
|
73
|
-
|
|
74
|
-
"""
|
|
75
|
-
|
|
76
|
-
shell_path = write_shell_script_to_file(shell_script=script)
|
|
77
|
-
command = f". {shell_path}"
|
|
78
|
-
if platform.system() == "Windows":
|
|
79
|
-
completed = subprocess.run(["powershell", "-Command", command], capture_output=True, check=False, text=True)
|
|
80
|
-
else:
|
|
81
|
-
completed = subprocess.run(command, shell=True, capture_output=True, check=False, text=True)
|
|
82
|
-
res = Response.from_completed_process(completed).capture().print()
|
|
83
|
-
|
|
84
|
-
if res.is_successful(strict_err=True, strict_returcode=True):
|
|
85
|
-
console.print(Panel("✅ Pull succeeded!\n🧹 Removing originEnc remote and local copy\n📤 Pushing merged repository to cloud storage", title="Success", border_style="green"))
|
|
86
|
-
repo_remote_root.delete(sure=True)
|
|
87
|
-
from git.remote import Remote
|
|
88
|
-
|
|
89
|
-
Remote.remove(repo_local_obj, "originEnc")
|
|
90
|
-
repo_local_root.to_cloud(cloud=cloud_resolved, zip=True, encrypt=True, rel2home=True, pwd=pwd, os_specific=False)
|
|
91
|
-
return "success"
|
|
92
|
-
else:
|
|
93
|
-
console.print(Panel(f"⚠️ MERGE FAILED\n💾 Keeping local copy of remote at:\n📂 {repo_remote_root}", title="Merge Failed", border_style="red"))
|
|
94
|
-
|
|
95
|
-
# ================================================================================
|
|
96
|
-
option1 = "Delete remote copy and push local:"
|
|
97
|
-
program_1_py = f"""
|
|
98
|
-
from machineconfig.scripts.python.helpers.repo_sync_helpers import delete_remote_repo_copy_and_push_local as func
|
|
99
|
-
func(remote_repo=r'{str(repo_remote_root)}', local_repo=r'{str(repo_local_root)}', cloud=r'{cloud_resolved}')
|
|
100
|
-
"""
|
|
101
|
-
shell_file_1 = get_shell_file_executing_python_script(python_script=program_1_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
|
|
102
|
-
# ================================================================================
|
|
103
|
-
|
|
104
|
-
option2 = "Delete local repo and replace it with remote copy:"
|
|
105
|
-
program_2 = f"""
|
|
106
|
-
rm -rfd {repo_local_root}
|
|
107
|
-
mv {repo_remote_root} {repo_local_root}
|
|
108
|
-
"""
|
|
109
|
-
if platform.system() in ["Linux", "Darwin"]:
|
|
110
|
-
program_2 += """
|
|
111
|
-
sudo chmod 600 $HOME/.ssh/*
|
|
112
|
-
sudo chmod 700 $HOME/.ssh
|
|
113
|
-
sudo chmod +x $HOME/dotfiles/scripts/linux -R
|
|
114
|
-
"""
|
|
115
|
-
|
|
116
|
-
shell_file_2 = write_shell_script_to_file(shell_script=program_2)
|
|
117
|
-
|
|
118
|
-
# ================================================================================
|
|
119
|
-
option3 = "Inspect repos:"
|
|
120
|
-
program_3_py = f"""
|
|
121
|
-
from machineconfig.scripts.python.helper.repo_sync_helpers import inspect_repos as func
|
|
122
|
-
func(repo_local_root=r'{str(repo_local_root)}', repo_remote_root=r'{str(repo_remote_root)}')
|
|
123
|
-
"""
|
|
124
|
-
shell_file_3 = get_shell_file_executing_python_script(python_script=program_3_py, ve_path=str(Path.home().joinpath("code", "machineconfig", ".venv")))
|
|
125
|
-
# ================================================================================
|
|
126
|
-
|
|
127
|
-
option4 = "Remove problematic rclone file from repo and replace with remote:"
|
|
128
|
-
program_4 = f"""
|
|
129
|
-
rm $HOME/dotfiles/creds/rclone/rclone.conf
|
|
130
|
-
cp $HOME/.config/machineconfig/remote/dotfiles/creds/rclone/rclone.conf $HOME/dotfiles/creds/rclone
|
|
131
|
-
cd $HOME/dotfiles
|
|
132
|
-
git commit -am "finished merging"
|
|
133
|
-
. {shell_file_1}
|
|
134
|
-
"""
|
|
135
|
-
shell_file_4 = write_shell_script_to_file(shell_script=program_4)
|
|
136
|
-
# ================================================================================
|
|
137
|
-
|
|
138
|
-
console.print(Panel("🔄 RESOLVE MERGE CONFLICT\nChoose an option to resolve the conflict:", title_align="left", border_style="blue"))
|
|
139
|
-
|
|
140
|
-
print(f"• 1️⃣ {option1:75} 👉 {shell_file_1}")
|
|
141
|
-
print(f"• 2️⃣ {option2:75} 👉 {shell_file_2}")
|
|
142
|
-
print(f"• 3️⃣ {option3:75} 👉 {shell_file_3}")
|
|
143
|
-
print(f"• 4️⃣ {option4:75} 👉 {shell_file_4}")
|
|
144
|
-
|
|
145
|
-
program_content = None
|
|
146
|
-
match action:
|
|
147
|
-
case "ask":
|
|
148
|
-
choice = choose_from_options(multi=False, msg="Choose one option", options=[option1, option2, option3, option4], fzf=False)
|
|
149
|
-
if choice == option1:
|
|
150
|
-
program_content = shell_file_1.read_text(encoding="utf-8")
|
|
151
|
-
elif choice == option2:
|
|
152
|
-
program_content = program_2
|
|
153
|
-
elif choice == option3:
|
|
154
|
-
program_content = shell_file_3.read_text(encoding="utf-8")
|
|
155
|
-
elif choice == option4:
|
|
156
|
-
program_content = program_4
|
|
157
|
-
else:
|
|
158
|
-
raise NotImplementedError(f"Choice {choice} not implemented.")
|
|
159
|
-
case "pushLocalMerge":
|
|
160
|
-
program_content = shell_file_1.read_text(encoding="utf-8")
|
|
161
|
-
case "overwriteLocal":
|
|
162
|
-
program_content = program_2
|
|
163
|
-
case "InspectRepos":
|
|
164
|
-
program_content = shell_file_3.read_text(encoding="utf-8")
|
|
165
|
-
case "RemoveLocalRclone":
|
|
166
|
-
program_content = program_4
|
|
167
|
-
case _:
|
|
168
|
-
raise ValueError(f"Unknown action: {action}")
|
|
169
|
-
# PROGRAM_PATH.write_text(program_content, encoding="utf-8")
|
|
170
|
-
subprocess.run(program_content, shell=True, check=True)
|
|
171
|
-
|
|
172
|
-
return program_content
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def args_parser():
|
|
176
|
-
# console.print(Panel("🔄 Repository Synchronization Utility", title_align="left", border_style="blue"))
|
|
177
|
-
# parser = argparse.ArgumentParser(description="Secure Repo CLI.")
|
|
178
|
-
# parser.add_argument("path", nargs="?", type=str, help="Repository path, defaults to cwd.", default=None)
|
|
179
|
-
# parser.add_argument("--cloud", "-c", help="rclone cloud profile name.", default=None)
|
|
180
|
-
# parser.add_argument("--message", "-m", help="Commit Message", default=f"new message {randstr()}")
|
|
181
|
-
# parser.add_argument("--pwd", "-p", help="Password for encryption", default=None)
|
|
182
|
-
# parser.add_argument("--action", "-a", help="Action to take if merge fails.", choices=["ask", "pushLocalMerge", "overwriteLocal", "InspectRepos", "RemoveLocalRclone"], default="ask")
|
|
183
|
-
# args = parser.parse_args()
|
|
184
|
-
# main(cloud=args.cloud, path=args.path, message=args.message, action=args.action)
|
|
185
|
-
import typer
|
|
186
|
-
typer.run(main)
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if __name__ == "__main__":
|
|
190
|
-
args_parser()
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import typer
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
def analyze_repo_development(repo_path: str = typer.Argument(..., help="Path to the git repository")):
|
|
6
|
-
from machineconfig.scripts.python import count_lines
|
|
7
|
-
from pathlib import Path
|
|
8
|
-
count_lines_path = Path(count_lines.__file__)
|
|
9
|
-
# --project $HOME/code/machineconfig
|
|
10
|
-
cmd = f"""uv run --python 3.13 --with machineconfig[plot] {count_lines_path} analyze-over-time {repo_path}"""
|
|
11
|
-
from machineconfig.utils.code import run_shell_script
|
|
12
|
-
run_shell_script(cmd)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if __name__ == "__main__":
|
|
16
|
-
pass
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
"""SSH"""
|
|
2
|
-
|
|
3
|
-
from platform import system
|
|
4
|
-
from machineconfig.utils.source_of_truth import LIBRARY_ROOT
|
|
5
|
-
from machineconfig.utils.options import choose_from_options
|
|
6
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
7
|
-
from rich.console import Console
|
|
8
|
-
from rich.panel import Panel
|
|
9
|
-
from rich import box # Import box
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
console = Console()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def get_add_ssh_key_script(path_to_key: PathExtended):
|
|
16
|
-
console.print(Panel("🔑 SSH KEY CONFIGURATION", title="[bold blue]SSH Setup[/bold blue]"))
|
|
17
|
-
|
|
18
|
-
if system() == "Linux":
|
|
19
|
-
authorized_keys = PathExtended.home().joinpath(".ssh/authorized_keys")
|
|
20
|
-
console.print(Panel(f"🐧 Linux SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
|
|
21
|
-
elif system() == "Windows":
|
|
22
|
-
authorized_keys = PathExtended("C:/ProgramData/ssh/administrators_authorized_keys")
|
|
23
|
-
console.print(Panel(f"🪟 Windows SSH configuration\n📄 Authorized keys file: {authorized_keys}", title="[bold blue]System Info[/bold blue]"))
|
|
24
|
-
else:
|
|
25
|
-
console.print(Panel("❌ ERROR: Unsupported operating system\nOnly Linux and Windows are supported", title="[bold red]Error[/bold red]"))
|
|
26
|
-
raise NotImplementedError
|
|
27
|
-
|
|
28
|
-
if authorized_keys.exists():
|
|
29
|
-
split = "\n"
|
|
30
|
-
keys_text = authorized_keys.read_text(encoding="utf-8").split(split)
|
|
31
|
-
key_count = len([k for k in keys_text if k.strip()])
|
|
32
|
-
console.print(Panel(f"🔍 Current SSH authorization status\n✅ Found {key_count} authorized key(s)", title="[bold blue]Status[/bold blue]"))
|
|
33
|
-
|
|
34
|
-
if path_to_key.read_text(encoding="utf-8") in authorized_keys.read_text(encoding="utf-8"):
|
|
35
|
-
console.print(Panel(f"⚠️ Key already authorized\nKey: {path_to_key.name}\nStatus: Already present in authorized_keys file\nNo action required", title="[bold yellow]Warning[/bold yellow]"))
|
|
36
|
-
program = ""
|
|
37
|
-
else:
|
|
38
|
-
console.print(Panel(f"➕ Adding new SSH key to authorized keys\n🔑 Key file: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
|
|
39
|
-
if system() == "Linux":
|
|
40
|
-
program = f"cat {path_to_key} >> ~/.ssh/authorized_keys"
|
|
41
|
-
elif system() == "Windows":
|
|
42
|
-
program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
|
|
43
|
-
program = program_path.expanduser().read_text(encoding="utf-8")
|
|
44
|
-
place_holder = r'$sshfile = "$env:USERPROFILE\.ssh\pubkey.pub"'
|
|
45
|
-
assert place_holder in program, f"This section performs string manipulation on the script {program_path} to add the key to the authorized_keys file. The script has changed and the string {place_holder} is not found."
|
|
46
|
-
program = program.replace(place_holder, f'$sshfile = "{path_to_key}"')
|
|
47
|
-
console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Replaced placeholder with actual key path", title="[bold blue]Configuration[/bold blue]"))
|
|
48
|
-
else:
|
|
49
|
-
raise NotImplementedError
|
|
50
|
-
else:
|
|
51
|
-
console.print(Panel(f"📝 Creating new authorized_keys file\n🔑 Using key: {path_to_key.name}", title="[bold blue]Action[/bold blue]"))
|
|
52
|
-
if system() == "Linux":
|
|
53
|
-
program = f"cat {path_to_key} > ~/.ssh/authorized_keys"
|
|
54
|
-
else:
|
|
55
|
-
program_path = LIBRARY_ROOT.joinpath("setup_windows/openssh-server_add-sshkey.ps1")
|
|
56
|
-
program = PathExtended(program_path).expanduser().read_text(encoding="utf-8").replace('$sshfile=""', f'$sshfile="{path_to_key}"')
|
|
57
|
-
console.print(Panel("🔧 Configured PowerShell script for Windows\n📝 Set key path in script", title="[bold blue]Configuration[/bold blue]"))
|
|
58
|
-
|
|
59
|
-
if system() == "Linux":
|
|
60
|
-
program += """
|
|
61
|
-
|
|
62
|
-
sudo chmod 700 ~/.ssh
|
|
63
|
-
sudo chmod 644 ~/.ssh/authorized_keys
|
|
64
|
-
sudo chmod 644 ~/.ssh/*.pub
|
|
65
|
-
sudo service ssh --full-restart
|
|
66
|
-
# from superuser.com/questions/215504/permissions-on-private-key-in-ssh-folder
|
|
67
|
-
"""
|
|
68
|
-
return program
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def main() -> None:
|
|
72
|
-
console.print(Panel("🔐 SSH PUBLIC KEY AUTHORIZATION TOOL", box=box.DOUBLE_EDGE, title_align="left"))
|
|
73
|
-
|
|
74
|
-
console.print(Panel("🔍 Searching for public keys...", title="[bold blue]SSH Setup[/bold blue]", border_style="blue"))
|
|
75
|
-
|
|
76
|
-
pub_keys = PathExtended.home().joinpath(".ssh").search("*.pub")
|
|
77
|
-
|
|
78
|
-
if pub_keys:
|
|
79
|
-
console.print(Panel(f"✅ Found {len(pub_keys)} public key(s)", title="[bold green]Status[/bold green]", border_style="green"))
|
|
80
|
-
else:
|
|
81
|
-
console.print(Panel("⚠️ No public keys found", title="[bold yellow]Warning[/bold yellow]", border_style="yellow"))
|
|
82
|
-
|
|
83
|
-
all_keys_option = f"all pub keys available ({len(pub_keys)})"
|
|
84
|
-
i_have_path_option = "I have the path to the key file"
|
|
85
|
-
i_paste_option = "I want to paste the key itself"
|
|
86
|
-
|
|
87
|
-
res = choose_from_options("Which public key to add? ", options=[str(x) for x in pub_keys] + [all_keys_option, i_have_path_option, i_paste_option], multi=False)
|
|
88
|
-
if res == all_keys_option:
|
|
89
|
-
console.print(Panel(f"🔄 Processing all {len(pub_keys)} public keys...", title="[bold blue]Processing[/bold blue]", border_style="blue"))
|
|
90
|
-
program = "\n\n\n".join([get_add_ssh_key_script(key) for key in pub_keys])
|
|
91
|
-
|
|
92
|
-
elif res == i_have_path_option:
|
|
93
|
-
console.print(Panel("📂 Please provide the path to your public key", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
|
|
94
|
-
key_path = PathExtended(input("📋 Path: ")).expanduser().absolute()
|
|
95
|
-
console.print(Panel(f"📄 Using key from path: {key_path}", title="[bold blue]Info[/bold blue]", border_style="blue"))
|
|
96
|
-
program = get_add_ssh_key_script(key_path)
|
|
97
|
-
|
|
98
|
-
elif res == i_paste_option:
|
|
99
|
-
console.print(Panel("📋 Please provide a filename and paste the public key content", title="[bold blue]Input Required[/bold blue]", border_style="blue"))
|
|
100
|
-
key_filename = input("📝 File name (default: my_pasted_key.pub): ") or "my_pasted_key.pub"
|
|
101
|
-
key_path = PathExtended.home().joinpath(f".ssh/{key_filename}")
|
|
102
|
-
key_path.write_text(input("🔑 Paste the public key here: "), encoding="utf-8")
|
|
103
|
-
console.print(Panel(f"💾 Key saved to: {key_path}", title="[bold green]Success[/bold green]", border_style="green"))
|
|
104
|
-
program = get_add_ssh_key_script(key_path)
|
|
105
|
-
|
|
106
|
-
else:
|
|
107
|
-
console.print(Panel(f"🔑 Using selected key: {PathExtended(res).name}", title="[bold blue]Info[/bold blue]", border_style="blue"))
|
|
108
|
-
program = get_add_ssh_key_script(PathExtended(res))
|
|
109
|
-
|
|
110
|
-
console.print(Panel("🚀 SSH KEY AUTHORIZATION READY\nRun the generated script to apply changes", box=box.DOUBLE_EDGE, title_align="left"))
|
|
111
|
-
|
|
112
|
-
# return program
|
|
113
|
-
import subprocess
|
|
114
|
-
|
|
115
|
-
subprocess.run(program, shell=True, check=True)
|
|
116
|
-
console.print(Panel("✅ SSH KEY AUTHORIZATION COMPLETED", box=box.DOUBLE_EDGE, title_align="left"))
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
if __name__ == "__main__":
|
|
120
|
-
pass
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"""Like yadm and dotter."""
|
|
2
|
-
|
|
3
|
-
from typing import Annotated
|
|
4
|
-
|
|
5
|
-
import typer
|
|
6
|
-
from rich.console import Console
|
|
7
|
-
from rich.panel import Panel
|
|
8
|
-
|
|
9
|
-
from machineconfig.utils.links import symlink_func
|
|
10
|
-
from machineconfig.utils.path_extended import PathExtended
|
|
11
|
-
from machineconfig.utils.source_of_truth import LIBRARY_ROOT, REPO_ROOT
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
console = Console()
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
def main(
|
|
18
|
-
file: Annotated[str, typer.Argument(help="file/folder path.")],
|
|
19
|
-
overwrite: Annotated[bool, typer.Option("--overwrite", "-o", help="Overwrite.")] = False,
|
|
20
|
-
dest: Annotated[str, typer.Option("--dest", "-d", help="destination folder")] = "",
|
|
21
|
-
) -> None:
|
|
22
|
-
orig_path = PathExtended(file).expanduser().absolute()
|
|
23
|
-
if dest == "":
|
|
24
|
-
if "Local" in str(orig_path):
|
|
25
|
-
junction = orig_path.split(at="Local", sep=-1)[1]
|
|
26
|
-
elif "Roaming" in str(orig_path):
|
|
27
|
-
junction = orig_path.split(at="Roaming", sep=-1)[1]
|
|
28
|
-
elif ".config" in str(orig_path):
|
|
29
|
-
junction = orig_path.split(at=".config", sep=-1)[1]
|
|
30
|
-
else:
|
|
31
|
-
junction = orig_path.rel2home()
|
|
32
|
-
new_path = PathExtended(REPO_ROOT).joinpath(junction)
|
|
33
|
-
else:
|
|
34
|
-
dest_path = PathExtended(dest).expanduser().absolute()
|
|
35
|
-
dest_path.mkdir(parents=True, exist_ok=True)
|
|
36
|
-
new_path = dest_path.joinpath(orig_path.name)
|
|
37
|
-
|
|
38
|
-
symlink_func(this=orig_path, to_this=new_path, prioritize_to_this=overwrite)
|
|
39
|
-
|
|
40
|
-
console.print(
|
|
41
|
-
Panel(
|
|
42
|
-
"\n".join(
|
|
43
|
-
[
|
|
44
|
-
"✅ Symbolic link created successfully!",
|
|
45
|
-
"🔄 Add the following snippet to mapper.toml to persist this mapping:",
|
|
46
|
-
]
|
|
47
|
-
),
|
|
48
|
-
title="Symlink Created",
|
|
49
|
-
border_style="green",
|
|
50
|
-
padding=(1, 2),
|
|
51
|
-
)
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
mapper_snippet = "\n".join(
|
|
55
|
-
[
|
|
56
|
-
f"[bold]📝 Edit configuration file:[/] [cyan]nano {PathExtended(LIBRARY_ROOT)}/symlinks/mapper.toml[/cyan]",
|
|
57
|
-
"",
|
|
58
|
-
f"[{new_path.parent.name}]",
|
|
59
|
-
f"{orig_path.name.split('.')[0]} = {{ this = '{orig_path.collapseuser().as_posix()}', to_this = '{new_path.collapseuser().as_posix()}' }}",
|
|
60
|
-
]
|
|
61
|
-
)
|
|
62
|
-
|
|
63
|
-
console.print(
|
|
64
|
-
Panel(
|
|
65
|
-
mapper_snippet,
|
|
66
|
-
title="Mapper Entry",
|
|
67
|
-
border_style="cyan",
|
|
68
|
-
padding=(1, 2),
|
|
69
|
-
)
|
|
70
|
-
)
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def arg_parser() -> None:
|
|
74
|
-
typer.run(main)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
if __name__ == "__main__":
|
|
78
|
-
arg_parser()
|