machineconfig 6.23__py3-none-any.whl → 8.12__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/cluster/remote/cloud_manager.py +1 -1
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- 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 +16 -221
- machineconfig/cluster/sessions_managers/wt_local_manager.py +55 -193
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +42 -198
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +3 -3
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +5 -3
- machineconfig/cluster/sessions_managers/zellij_remote.py +2 -2
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +3 -2
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +2 -2
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -7
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_with_panes.py +1 -1
- machineconfig/jobs/installer/check_installations.py +0 -1
- machineconfig/jobs/installer/installer_data.json +1408 -201
- machineconfig/jobs/installer/linux_scripts/q.sh +10 -7
- machineconfig/jobs/installer/linux_scripts/redis.sh +1 -0
- machineconfig/jobs/installer/package_groups.py +63 -92
- machineconfig/jobs/installer/powershell_scripts/install_fonts.ps1 +129 -34
- machineconfig/jobs/installer/python_scripts/boxes.py +61 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/brave.py +5 -3
- machineconfig/jobs/installer/python_scripts/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/code.py +4 -1
- machineconfig/jobs/installer/{custom_dev → python_scripts}/dubdb_adbc.py +1 -1
- machineconfig/jobs/installer/{custom → python_scripts}/hx.py +75 -18
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerdfont.py +2 -2
- machineconfig/jobs/installer/{custom_dev → python_scripts}/nerfont_windows_helper.py +27 -22
- machineconfig/jobs/installer/python_scripts/sysabc.py +139 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/wezterm.py +2 -19
- machineconfig/jobs/installer/{custom_dev → python_scripts}/winget.py +10 -14
- machineconfig/jobs/installer/python_scripts/yazi.py +121 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nfs +0 -1
- machineconfig/jobs/scripts/powershell_scripts/mount_ssh.ps1 +13 -0
- machineconfig/jobs/scripts/powershell_scripts/obs.ps1 +4 -0
- machineconfig/jobs/scripts_dynamic/a.py +25 -0
- machineconfig/logger.py +0 -1
- machineconfig/profile/create_helper.py +56 -18
- machineconfig/profile/create_links.py +2 -1
- machineconfig/profile/create_links_export.py +64 -18
- machineconfig/profile/create_shell_profile.py +90 -132
- machineconfig/profile/mapper.toml +18 -8
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/wrap_mcfg +46 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +82 -60
- machineconfig/scripts/python/ai/initai.py +1 -19
- machineconfig/scripts/python/ai/scripts/command_runner.ps1 +33 -0
- machineconfig/scripts/python/ai/{command_runner → scripts}/command_runner.sh +1 -1
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Thinking-Beast-Mode.chatmode.md → agents/Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/Ultimate-Transparent-Thinking-Beast-Mode.chatmode.md → agents/Ultimate-Transparent-Thinking-Beast-Mode.agent.md} +0 -1
- machineconfig/scripts/python/ai/solutions/copilot/{chatmodes/deepResearch.chatmode.md → agents/deepResearch.agent.md} +2 -2
- machineconfig/scripts/python/ai/solutions/copilot/github_copilot.py +5 -5
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +4 -0
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/watch_exec.prompt.md +20 -0
- machineconfig/scripts/python/ai/solutions/generic.py +1 -1
- machineconfig/scripts/python/ai/{generate_files.py → utils/generate_files.py} +2 -2
- machineconfig/scripts/python/ai/{vscode_tasks.py → utils/vscode_tasks.py} +7 -2
- machineconfig/scripts/python/cloud.py +14 -9
- machineconfig/scripts/python/croshell.py +135 -117
- machineconfig/scripts/python/devops.py +48 -25
- machineconfig/scripts/python/devops_navigator.py +1 -5
- machineconfig/scripts/python/env_manager/env_manager_tui.py +204 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +18 -9
- machineconfig/scripts/python/fire_jobs.py +127 -118
- machineconfig/scripts/python/ftpx.py +44 -17
- 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/symantic_search.py +25 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_crush.json +1 -1
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +39 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/agentic_frameworks/fire_cursor_agents.py +3 -4
- 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_fire → helpers_agents}/fire_agents_help_launch.py +37 -15
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +41 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/aichat/config.yaml +5 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/aider/.aider.conf.yml +2 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/copilot/config.yml +1 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/crush/crush.json +10 -0
- machineconfig/scripts/python/helpers_agents/privacy/configs/gemini/settings.json +12 -0
- machineconfig/scripts/python/helpers_agents/privacy/privacy.py +109 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +10 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +34 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_copy.py +28 -21
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_mount.py +19 -17
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_sync.py +12 -11
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/start_slidev.py +6 -7
- 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 +221 -0
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/cli_repos.py +60 -36
- 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/{devops_helpers/cli_terminal.py → helpers_devops/cli_share_terminal.py} +15 -17
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_backup_retrieve.py +7 -10
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_status.py +7 -19
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/devops_update_repos.py +1 -1
- machineconfig/scripts/python/helpers_devops/run_script.py +168 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_wezterm_theme.py +1 -1
- machineconfig/scripts/python/{helpers_fire/helpers4.py → helpers_fire_command/file_wrangler.py} +57 -20
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_args_helper.py +2 -0
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_route_helper.py +26 -16
- 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/{helper_navigator → helpers_navigator}/command_builder.py +1 -1
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_detail.py +1 -1
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/command_tree.py +160 -23
- machineconfig/scripts/python/{helper_navigator → helpers_navigator}/main_app.py +5 -5
- machineconfig/scripts/python/helpers_network/address.py +176 -0
- machineconfig/scripts/python/helpers_network/address_switch.py +78 -0
- machineconfig/scripts/python/{nw → helpers_network}/mount_nfs.py +2 -2
- machineconfig/scripts/python/{nw → helpers_network}/mount_ssh.py +1 -1
- machineconfig/scripts/python/{nw/devops_add_identity.py → helpers_network/ssh_add_identity.py} +35 -1
- machineconfig/scripts/python/{nw/devops_add_ssh_key.py → helpers_network/ssh_add_ssh_key.py} +26 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_linux.py +7 -7
- machineconfig/scripts/python/{nw → helpers_network}/ssh_debug_windows.py +4 -4
- machineconfig/scripts/python/{nw → helpers_network}/wifi_conn.py +1 -53
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/clone.py +0 -1
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +80 -37
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/entrypoint.py +5 -5
- machineconfig/scripts/python/helpers_repos/grource.py +2 -2
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/record.py +3 -2
- machineconfig/scripts/python/helpers_repos/repo_analyzer_1.py +160 -0
- machineconfig/scripts/python/{repos_helpers/count_lines.py → helpers_repos/repo_analyzer_2.py} +113 -192
- machineconfig/scripts/python/{repos_helpers → helpers_repos}/sync.py +5 -5
- machineconfig/scripts/python/{sessions_helpers → helpers_sessions}/sessions_multiprocess.py +19 -13
- machineconfig/scripts/python/helpers_utils/download.py +150 -0
- machineconfig/scripts/python/helpers_utils/pdf.py +96 -0
- machineconfig/scripts/python/helpers_utils/python.py +187 -0
- machineconfig/scripts/python/interactive.py +26 -35
- machineconfig/scripts/python/{entry.py → mcfg_entry.py} +24 -10
- machineconfig/scripts/python/msearch.py +72 -0
- machineconfig/scripts/python/sessions.py +101 -38
- machineconfig/scripts/python/terminal.py +136 -0
- machineconfig/scripts/python/utils.py +62 -0
- machineconfig/scripts/windows/wrap_mcfg.ps1 +63 -0
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +3 -2
- machineconfig/settings/lf/linux/lfrc +10 -11
- machineconfig/settings/lf/windows/lfcd.ps1 +1 -1
- machineconfig/settings/lf/windows/lfrc +15 -17
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/shells/bash/init.sh +57 -10
- 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 +59 -23
- 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/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/settings/zellij/layouts/st.kdl +39 -8
- machineconfig/setup_linux/__init__.py +2 -2
- machineconfig/setup_linux/apps_desktop.sh +8 -27
- machineconfig/setup_linux/web_shortcuts/interactive.sh +27 -11
- 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 +3 -5
- machineconfig/setup_windows/ssh/openssh-server.ps1 +1 -1
- machineconfig/setup_windows/uv.ps1 +8 -1
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +26 -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/code.py +143 -167
- 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/headers.py +6 -11
- machineconfig/utils/files/read.py +3 -9
- 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 +44 -101
- 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} +39 -87
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +17 -63
- machineconfig/utils/io.py +77 -4
- machineconfig/utils/links.py +56 -38
- machineconfig/utils/meta.py +235 -145
- machineconfig/utils/options.py +46 -18
- machineconfig/utils/options_tv.py +119 -0
- machineconfig/utils/path_extended.py +46 -97
- machineconfig/utils/path_helper.py +76 -23
- machineconfig/utils/procs.py +10 -23
- machineconfig/utils/scheduler.py +84 -115
- 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/ssh.py +214 -476
- 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 +303 -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/upgrade_packages.py +114 -28
- machineconfig/utils/ve.py +12 -4
- machineconfig-8.12.dist-info/METADATA +132 -0
- machineconfig-8.12.dist-info/RECORD +504 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/entry_points.txt +5 -1
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -41
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -71
- 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/windows/archive/archive_pygraphviz.ps1 +0 -12
- machineconfig/jobs/windows/archive/openssh-server_add_key.ps1 +0 -7
- machineconfig/jobs/windows/archive/openssh-server_copy-ssh-id.ps1 +0 -14
- 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/other/share_smb +0 -1
- machineconfig/scripts/linux/other/switch_ip +0 -20
- machineconfig/scripts/linux/skrg +0 -4
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/command_runner/prompt.txt +0 -9
- machineconfig/scripts/python/devops_helpers/cli_config.py +0 -81
- machineconfig/scripts/python/devops_helpers/cli_config_dotfile.py +0 -84
- machineconfig/scripts/python/devops_helpers/cli_data.py +0 -18
- machineconfig/scripts/python/devops_helpers/cli_nw.py +0 -73
- machineconfig/scripts/python/devops_helpers/cli_self.py +0 -117
- machineconfig/scripts/python/devops_helpers/cli_share_server.py +0 -104
- machineconfig/scripts/python/helper_navigator/__init__.py +0 -20
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_crush.py +0 -37
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_gemini.py +0 -44
- machineconfig/scripts/python/helpers_fire/agentic_frameworks/fire_qwen.py +0 -43
- machineconfig/scripts/python/helpers_fire/fire_agents_helper_types.py +0 -30
- machineconfig/scripts/python/helpers_fire/prompt.txt +0 -2
- machineconfig/scripts/python/helpers_fire/template.sh +0 -15
- machineconfig/scripts/python/helpers_repos/secure_repo.py +0 -15
- machineconfig/scripts/python/nw/add_ssh_key.py +0 -148
- machineconfig/scripts/python/nw/wsl_windows_transfer.py +0 -66
- machineconfig/scripts/python/repos_helpers/action.py +0 -378
- machineconfig/scripts/python/repos_helpers/count_lines_frontend.py +0 -17
- machineconfig/scripts/windows/fzfb.ps1 +0 -3
- machineconfig/scripts/windows/fzfg.ps1 +0 -2
- machineconfig/scripts/windows/fzfrga.bat +0 -20
- machineconfig/scripts/windows/mounts/mount_ssh.ps1 +0 -13
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/settings/lf/windows/fzf_edit.ps1 +0 -6
- machineconfig/settings/lf/windows/tst.ps1 +0 -1
- machineconfig/settings/shells/pwsh/profile.ps1 +0 -0
- machineconfig/settings/yazi/keymap.toml +0 -0
- machineconfig/settings/yazi/yazi.toml +0 -4
- machineconfig/setup_linux/apps.sh +0 -66
- machineconfig/setup_linux/nix/cli_installation.sh +0 -137
- machineconfig/setup_linux/ssh/openssh_all.sh +0 -25
- machineconfig/setup_linux/ssh/openssh_wsl.sh +0 -38
- machineconfig/setup_windows/apps.ps1 +0 -62
- machineconfig/setup_windows/others/obs.ps1 +0 -4
- machineconfig/setup_windows/ssh/add_identity.ps1 +0 -11
- machineconfig/setup_windows/wt_and_pwsh/__init__.py +0 -0
- machineconfig/utils/installer_utils/installer.py +0 -225
- machineconfig-6.23.dist-info/METADATA +0 -84
- machineconfig-6.23.dist-info/RECORD +0 -428
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_helper_restart.py +0 -0
- machineconfig/cluster/sessions_managers/{helpers → zellij_utils}/zellij_local_manager_helper.py +0 -0
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +0 -0
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/__init__.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/alacritty.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/bypass_paywall.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/cursor.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/espanso.py +0 -0
- machineconfig/jobs/installer/{custom → python_scripts}/gh.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/goes.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/lvim.py +0 -0
- machineconfig/jobs/installer/{custom_dev → python_scripts}/redis.py +0 -0
- machineconfig/{setup_linux/web_shortcuts → jobs/scripts/bash_scripts}/android.sh +0 -0
- machineconfig/jobs/{linux/msc → scripts/bash_scripts}/lid.sh +0 -0
- machineconfig/{setup_linux/others → jobs/scripts/bash_scripts}/mint_keyboard_shortcuts.sh +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_nw_drive +0 -0
- machineconfig/{scripts/python/nw → jobs/scripts/bash_scripts}/mount_smb +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_cloud.sh +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/share_nfs +0 -0
- machineconfig/{scripts/linux/other → jobs/scripts/bash_scripts}/start_docker +0 -0
- machineconfig/{scripts → jobs/scripts/powershell_scripts}/Restore-ThunderbirdProfile.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/docker.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nfs.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_nw.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/mount_smb.ps1 +0 -0
- machineconfig/{setup_windows/others → jobs/scripts/powershell_scripts}/power_options.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_cloud.cmd +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/share_smb.ps1 +0 -0
- machineconfig/{scripts/windows/mounts → jobs/scripts/powershell_scripts}/unlock_bitlocker.ps1 +0 -0
- machineconfig/{jobs/python → scripts/python/ai/utils}/__init__.py +0 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{croshell_helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_help_search.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents}/fire_agents_load_balancer.py +0 -0
- machineconfig/scripts/python/{helpers_fire → helpers_agents/templates}/template.ps1 +0 -0
- machineconfig/scripts/python/{devops_helpers → helpers_cloud}/__init__.py +0 -0
- machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{cloud_helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/scripts/python/{devops_helpers/themes → helpers_croshell}/__init__.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/pomodoro.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/scheduler.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer.py +0 -0
- /machineconfig/scripts/python/{croshell_helpers → helpers_croshell}/viewer_template.py +0 -0
- /machineconfig/scripts/python/{helpers_fire → helpers_devops}/__init__.py +0 -0
- /machineconfig/scripts/python/{helpers_fire/agentic_frameworks → helpers_devops/themes}/__init__.py +0 -0
- /machineconfig/scripts/python/{devops_helpers → helpers_devops}/themes/choose_pwsh_theme.ps1 +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_fire_command/f.py} +0 -0
- /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/data_models.py +0 -0
- /machineconfig/scripts/python/{helper_navigator → helpers_navigator}/search_bar.py +0 -0
- /machineconfig/scripts/python/{helpers_repos → helpers_network}/__init__.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/mount_nw_drive.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_network}/onetimeshare.py +0 -0
- /machineconfig/scripts/python/{repos_helpers → helpers_repos}/update.py +0 -0
- /machineconfig/scripts/python/{nw → helpers_sessions}/__init__.py +0 -0
- /machineconfig/{scripts/python/sessions_helpers → settings/wt}/__init__.py +0 -0
- /machineconfig/{setup_windows/wt_and_pwsh → settings/wt}/set_wt_settings.py +0 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/WHEEL +0 -0
- {machineconfig-6.23.dist-info → machineconfig-8.12.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def generate_qrcode_grid(
|
|
7
|
+
strings: list[str],
|
|
8
|
+
output_path: str,
|
|
9
|
+
per_row: int = 3,
|
|
10
|
+
qr_size: int = 200,
|
|
11
|
+
label_height: int = 30,
|
|
12
|
+
padding: int = 20,
|
|
13
|
+
label_max_chars: int = 25,
|
|
14
|
+
format: Literal["svg", "png"] = "svg",
|
|
15
|
+
) -> str:
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
if not strings:
|
|
18
|
+
raise ValueError("strings list cannot be empty")
|
|
19
|
+
|
|
20
|
+
output_path_obj = Path(output_path)
|
|
21
|
+
output_path_obj.parent.mkdir(parents=True, exist_ok=True)
|
|
22
|
+
|
|
23
|
+
if format == "svg":
|
|
24
|
+
return _generate_svg(strings, output_path, per_row, qr_size, label_height, padding, label_max_chars)
|
|
25
|
+
elif format == "png":
|
|
26
|
+
return _generate_png(strings, output_path, per_row, qr_size, label_height, padding, label_max_chars)
|
|
27
|
+
else:
|
|
28
|
+
raise ValueError(f"Unsupported format: {format}")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _generate_svg(
|
|
32
|
+
strings: list[str],
|
|
33
|
+
output_path: str,
|
|
34
|
+
per_row: int,
|
|
35
|
+
qr_size: int,
|
|
36
|
+
label_height: int,
|
|
37
|
+
padding: int,
|
|
38
|
+
label_max_chars: int,
|
|
39
|
+
) -> str:
|
|
40
|
+
num_items = len(strings)
|
|
41
|
+
num_rows = (num_items + per_row - 1) // per_row
|
|
42
|
+
|
|
43
|
+
cell_width = qr_size
|
|
44
|
+
cell_height = qr_size + label_height
|
|
45
|
+
total_width = per_row * cell_width + (per_row + 1) * padding
|
|
46
|
+
total_height = num_rows * cell_height + (num_rows + 1) * padding
|
|
47
|
+
|
|
48
|
+
from xml.etree import ElementTree as ET
|
|
49
|
+
|
|
50
|
+
import qrcode
|
|
51
|
+
svg_root = ET.Element(
|
|
52
|
+
"svg",
|
|
53
|
+
xmlns="http://www.w3.org/2000/svg",
|
|
54
|
+
width=str(total_width),
|
|
55
|
+
height=str(total_height),
|
|
56
|
+
viewBox=f"0 0 {total_width} {total_height}",
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
_bg_rect = ET.SubElement(svg_root, "rect", width=str(total_width), height=str(total_height), fill="white")
|
|
60
|
+
|
|
61
|
+
for idx, text in enumerate(strings):
|
|
62
|
+
row = idx // per_row
|
|
63
|
+
col = idx % per_row
|
|
64
|
+
|
|
65
|
+
x_offset = padding + col * (cell_width + padding)
|
|
66
|
+
y_offset = padding + row * (cell_height + padding)
|
|
67
|
+
|
|
68
|
+
qr = qrcode.QRCode(version=1, error_correction=qrcode.ERROR_CORRECT_L, box_size=10, border=2, image_factory=qrcode.image.svg.SvgPathImage) # type: ignore
|
|
69
|
+
qr.add_data(text)
|
|
70
|
+
qr.make(fit=True)
|
|
71
|
+
|
|
72
|
+
qr_img = qr.make_image()
|
|
73
|
+
qr_svg_string = qr_img.to_string(encoding="unicode")
|
|
74
|
+
|
|
75
|
+
qr_tree = ET.fromstring(qr_svg_string)
|
|
76
|
+
|
|
77
|
+
group = ET.SubElement(svg_root, "g", transform=f"translate({x_offset}, {y_offset})")
|
|
78
|
+
|
|
79
|
+
qr_group = ET.SubElement(group, "g")
|
|
80
|
+
for child in qr_tree:
|
|
81
|
+
qr_group.append(child)
|
|
82
|
+
|
|
83
|
+
label_text = text[:label_max_chars] if len(text) > label_max_chars else text
|
|
84
|
+
text_y = qr_size + label_height // 2
|
|
85
|
+
|
|
86
|
+
text_elem = ET.SubElement(
|
|
87
|
+
group,
|
|
88
|
+
"text",
|
|
89
|
+
x=str(qr_size // 2),
|
|
90
|
+
y=str(text_y),
|
|
91
|
+
fill="black",
|
|
92
|
+
attrib={
|
|
93
|
+
"font-family": "monospace",
|
|
94
|
+
"font-size": "12",
|
|
95
|
+
"text-anchor": "middle",
|
|
96
|
+
"dominant-baseline": "middle",
|
|
97
|
+
},
|
|
98
|
+
)
|
|
99
|
+
text_elem.text = label_text
|
|
100
|
+
|
|
101
|
+
tree = ET.ElementTree(svg_root)
|
|
102
|
+
ET.indent(tree, space=" ")
|
|
103
|
+
tree.write(output_path, encoding="unicode", xml_declaration=True)
|
|
104
|
+
|
|
105
|
+
return output_path
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _generate_png(
|
|
109
|
+
strings: list[str],
|
|
110
|
+
output_path: str,
|
|
111
|
+
per_row: int,
|
|
112
|
+
qr_size: int,
|
|
113
|
+
label_height: int,
|
|
114
|
+
padding: int,
|
|
115
|
+
label_max_chars: int,
|
|
116
|
+
) -> str:
|
|
117
|
+
num_items = len(strings)
|
|
118
|
+
num_rows = (num_items + per_row - 1) // per_row
|
|
119
|
+
|
|
120
|
+
cell_width = qr_size
|
|
121
|
+
cell_height = qr_size + label_height
|
|
122
|
+
total_width = per_row * cell_width + (per_row + 1) * padding
|
|
123
|
+
total_height = num_rows * cell_height + (num_rows + 1) * padding
|
|
124
|
+
|
|
125
|
+
import qrcode
|
|
126
|
+
import qrcode.image.pil
|
|
127
|
+
from PIL import Image, ImageDraw, ImageFont
|
|
128
|
+
img = Image.new("RGB", (total_width, total_height), color="white")
|
|
129
|
+
draw = ImageDraw.Draw(img)
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf", 12)
|
|
133
|
+
except OSError:
|
|
134
|
+
try:
|
|
135
|
+
font = ImageFont.truetype("arial.ttf", 12)
|
|
136
|
+
except OSError:
|
|
137
|
+
font = ImageFont.load_default()
|
|
138
|
+
|
|
139
|
+
for idx, text in enumerate(strings):
|
|
140
|
+
row = idx // per_row
|
|
141
|
+
col = idx % per_row
|
|
142
|
+
|
|
143
|
+
x_offset = padding + col * (cell_width + padding)
|
|
144
|
+
y_offset = padding + row * (cell_height + padding)
|
|
145
|
+
|
|
146
|
+
qr = qrcode.QRCode(version=1, error_correction=qrcode.ERROR_CORRECT_L, box_size=10, border=2, image_factory=qrcode.image.pil.PilImage)
|
|
147
|
+
qr.add_data(text)
|
|
148
|
+
qr.make(fit=True)
|
|
149
|
+
|
|
150
|
+
qr_img = qr.make_image(fill_color="black", back_color="white")
|
|
151
|
+
qr_img_resized = qr_img.resize((qr_size, qr_size), Image.Resampling.LANCZOS)
|
|
152
|
+
|
|
153
|
+
img.paste(qr_img_resized, (x_offset, y_offset))
|
|
154
|
+
|
|
155
|
+
label_text = text[:label_max_chars] if len(text) > label_max_chars else text
|
|
156
|
+
|
|
157
|
+
bbox = draw.textbbox((0, 0), label_text, font=font)
|
|
158
|
+
text_width = bbox[2] - bbox[0]
|
|
159
|
+
text_x = x_offset + (qr_size - text_width) // 2
|
|
160
|
+
text_y = y_offset + qr_size + label_height // 2 - 6
|
|
161
|
+
|
|
162
|
+
draw.text((text_x, text_y), label_text, fill="black", font=font)
|
|
163
|
+
|
|
164
|
+
img.save(output_path, format="PNG")
|
|
165
|
+
|
|
166
|
+
return output_path
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
# #!/usr/bin/env python3
|
|
2
|
+
# from pathlib import Path
|
|
3
|
+
# from typing import Annotated
|
|
4
|
+
# import subprocess
|
|
5
|
+
# import typer
|
|
6
|
+
# from rich.console import Console
|
|
7
|
+
# from rich.progress import Progress, SpinnerColumn, TextColumn
|
|
8
|
+
# from rich.table import Table
|
|
9
|
+
# from rich.syntax import Syntax
|
|
10
|
+
|
|
11
|
+
# import chromadb
|
|
12
|
+
# from chromadb.config import Settings
|
|
13
|
+
# from sentence_transformers import SentenceTransformer
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# app = typer.Typer(help="Semantic search over your repository using local RAG")
|
|
17
|
+
# console = Console()
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
# DEFAULT_EXTENSIONS = [".py", ".sh", ".ps1", ".md", ".toml", ".yaml", ".yml", ".json"]
|
|
21
|
+
# DEFAULT_MODEL = "all-MiniLM-L6-v2"
|
|
22
|
+
# DEFAULT_DB_PATH = Path.home() / ".cache" / "repo_rag"
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# class RepoRAG:
|
|
26
|
+
# def __init__(self, db_path: Path, model_name: str = DEFAULT_MODEL) -> None:
|
|
27
|
+
# self.db_path = db_path
|
|
28
|
+
# self.db_path.mkdir(parents=True, exist_ok=True)
|
|
29
|
+
|
|
30
|
+
# with console.status(f"[bold green]Loading embedding model: {model_name}..."):
|
|
31
|
+
# self.model = SentenceTransformer(model_name)
|
|
32
|
+
|
|
33
|
+
# self.client = chromadb.PersistentClient(
|
|
34
|
+
# path=str(db_path),
|
|
35
|
+
# settings=Settings(anonymized_telemetry=False)
|
|
36
|
+
# )
|
|
37
|
+
|
|
38
|
+
# def _get_or_create_collection(self, repo_path: Path) -> chromadb.Collection:
|
|
39
|
+
# collection_name = f"repo_{repo_path.name}".replace("-", "_").replace(".", "_")
|
|
40
|
+
# return self.client.get_or_create_collection(
|
|
41
|
+
# name=collection_name,
|
|
42
|
+
# metadata={"repo_path": str(repo_path)}
|
|
43
|
+
# )
|
|
44
|
+
|
|
45
|
+
# def _chunk_file_content(self, content: str, chunk_size: int = 500, overlap: int = 50) -> list[str]:
|
|
46
|
+
# lines = content.split("\n")
|
|
47
|
+
# chunks: list[str] = []
|
|
48
|
+
# current_chunk: list[str] = []
|
|
49
|
+
# current_size = 0
|
|
50
|
+
|
|
51
|
+
# for line in lines:
|
|
52
|
+
# line_size = len(line)
|
|
53
|
+
# if current_size + line_size > chunk_size and current_chunk:
|
|
54
|
+
# chunks.append("\n".join(current_chunk))
|
|
55
|
+
# overlap_lines = current_chunk[-overlap:] if len(current_chunk) > overlap else current_chunk
|
|
56
|
+
# current_chunk = overlap_lines
|
|
57
|
+
# current_size = sum(len(line_text) for line_text in current_chunk)
|
|
58
|
+
|
|
59
|
+
# current_chunk.append(line)
|
|
60
|
+
# current_size += line_size
|
|
61
|
+
|
|
62
|
+
# if current_chunk:
|
|
63
|
+
# chunks.append("\n".join(current_chunk))
|
|
64
|
+
|
|
65
|
+
# return chunks if chunks else [content]
|
|
66
|
+
|
|
67
|
+
# def index_repo(self, repo_path: Path, extensions: list[str], max_file_size_kb: int = 500) -> None:
|
|
68
|
+
# collection = self._get_or_create_collection(repo_path)
|
|
69
|
+
|
|
70
|
+
# files_to_index: list[Path] = []
|
|
71
|
+
# for ext in extensions:
|
|
72
|
+
# files_to_index.extend(repo_path.rglob(f"*{ext}"))
|
|
73
|
+
|
|
74
|
+
# files_to_index = [
|
|
75
|
+
# f for f in files_to_index
|
|
76
|
+
# if not any(part.startswith('.') for part in f.relative_to(repo_path).parts[:-1])
|
|
77
|
+
# and f.stat().st_size < max_file_size_kb * 1024
|
|
78
|
+
# ]
|
|
79
|
+
|
|
80
|
+
# console.print(f"[bold cyan]Found {len(files_to_index)} files to index")
|
|
81
|
+
|
|
82
|
+
# with Progress(
|
|
83
|
+
# SpinnerColumn(),
|
|
84
|
+
# TextColumn("[progress.description]{task.description}"),
|
|
85
|
+
# console=console
|
|
86
|
+
# ) as progress:
|
|
87
|
+
# task = progress.add_task("Indexing files...", total=len(files_to_index))
|
|
88
|
+
|
|
89
|
+
# for file_path in files_to_index:
|
|
90
|
+
# try:
|
|
91
|
+
# content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
92
|
+
# rel_path = str(file_path.relative_to(repo_path))
|
|
93
|
+
|
|
94
|
+
# chunks = self._chunk_file_content(content)
|
|
95
|
+
|
|
96
|
+
# for i, chunk in enumerate(chunks):
|
|
97
|
+
# doc_id = f"{rel_path}::chunk_{i}"
|
|
98
|
+
# embedding = self.model.encode(chunk).tolist()
|
|
99
|
+
|
|
100
|
+
# collection.upsert(
|
|
101
|
+
# ids=[doc_id],
|
|
102
|
+
# embeddings=[embedding],
|
|
103
|
+
# documents=[chunk],
|
|
104
|
+
# metadatas=[{
|
|
105
|
+
# "file_path": rel_path,
|
|
106
|
+
# "chunk_index": i,
|
|
107
|
+
# "total_chunks": len(chunks),
|
|
108
|
+
# "extension": file_path.suffix
|
|
109
|
+
# }]
|
|
110
|
+
# )
|
|
111
|
+
|
|
112
|
+
# except Exception as e:
|
|
113
|
+
# console.print(f"[yellow]Warning: Failed to index {file_path}: {e}")
|
|
114
|
+
|
|
115
|
+
# progress.advance(task)
|
|
116
|
+
|
|
117
|
+
# console.print("[bold green]✓ Indexing complete!")
|
|
118
|
+
|
|
119
|
+
# def search(self, repo_path: Path, query: str, n_results: int = 20) -> list[dict[str, str | dict[str, str | int]]]:
|
|
120
|
+
# collection = self._get_or_create_collection(repo_path)
|
|
121
|
+
|
|
122
|
+
# with console.status("[bold green]Searching..."):
|
|
123
|
+
# query_embedding = self.model.encode(query).tolist()
|
|
124
|
+
# results = collection.query(
|
|
125
|
+
# query_embeddings=[query_embedding],
|
|
126
|
+
# n_results=n_results
|
|
127
|
+
# )
|
|
128
|
+
|
|
129
|
+
# if not results["ids"] or not results["ids"][0]:
|
|
130
|
+
# return []
|
|
131
|
+
|
|
132
|
+
# search_results: list[dict[str, str | dict[str, str | int]]] = []
|
|
133
|
+
# for i, doc_id in enumerate(results["ids"][0]):
|
|
134
|
+
# search_results.append({
|
|
135
|
+
# "id": doc_id,
|
|
136
|
+
# "file_path": results["metadatas"][0][i]["file_path"],
|
|
137
|
+
# "content": results["documents"][0][i],
|
|
138
|
+
# "distance": results["distances"][0][i] if results.get("distances") else 0.0,
|
|
139
|
+
# "metadata": results["metadatas"][0][i]
|
|
140
|
+
# })
|
|
141
|
+
|
|
142
|
+
# return search_results
|
|
143
|
+
|
|
144
|
+
# def delete_index(self, repo_path: Path) -> None:
|
|
145
|
+
# collection_name = f"repo_{repo_path.name}".replace("-", "_").replace(".", "_")
|
|
146
|
+
# try:
|
|
147
|
+
# self.client.delete_collection(name=collection_name)
|
|
148
|
+
# console.print(f"[bold green]✓ Deleted index for {repo_path.name}")
|
|
149
|
+
# except Exception as e:
|
|
150
|
+
# console.print(f"[bold red]Error deleting index: {e}")
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# @app.command()
|
|
154
|
+
# def index(
|
|
155
|
+
# repo_path: Annotated[Path, typer.Argument(help="Path to repository to index")] = Path.cwd(),
|
|
156
|
+
# extensions: Annotated[str, typer.Option("--ext", "-e", help="Comma-separated list of extensions")] = ",".join(DEFAULT_EXTENSIONS),
|
|
157
|
+
# model: Annotated[str, typer.Option("--model", "-m", help="Sentence transformer model name")] = DEFAULT_MODEL,
|
|
158
|
+
# db_path: Annotated[Path, typer.Option("--db", help="Database path")] = DEFAULT_DB_PATH,
|
|
159
|
+
# max_size_kb: Annotated[int, typer.Option("--max-size", help="Max file size in KB")] = 500,
|
|
160
|
+
# ) -> None:
|
|
161
|
+
# repo_path = repo_path.resolve()
|
|
162
|
+
|
|
163
|
+
# if not repo_path.exists():
|
|
164
|
+
# console.print(f"[bold red]Error: Repository path does not exist: {repo_path}")
|
|
165
|
+
# raise typer.Exit(1)
|
|
166
|
+
|
|
167
|
+
# ext_list = [ext.strip() if ext.startswith(".") else f".{ext.strip()}" for ext in extensions.split(",")]
|
|
168
|
+
|
|
169
|
+
# console.print(f"[bold cyan]Repository:[/] {repo_path}")
|
|
170
|
+
# console.print(f"[bold cyan]Extensions:[/] {', '.join(ext_list)}")
|
|
171
|
+
# console.print(f"[bold cyan]Model:[/] {model}")
|
|
172
|
+
# console.print(f"[bold cyan]Database:[/] {db_path}")
|
|
173
|
+
# console.print()
|
|
174
|
+
|
|
175
|
+
# rag = RepoRAG(db_path, model)
|
|
176
|
+
# rag.index_repo(repo_path, ext_list, max_size_kb)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
# @app.command()
|
|
180
|
+
# def search(
|
|
181
|
+
# query: Annotated[str, typer.Argument(help="Search query")],
|
|
182
|
+
# repo_path: Annotated[Path, typer.Option("--repo", "-r", help="Path to repository")] = Path.cwd(),
|
|
183
|
+
# n_results: Annotated[int, typer.Option("--num", "-n", help="Number of results")] = 20,
|
|
184
|
+
# model: Annotated[str, typer.Option("--model", "-m", help="Sentence transformer model name")] = DEFAULT_MODEL,
|
|
185
|
+
# db_path: Annotated[Path, typer.Option("--db", help="Database path")] = DEFAULT_DB_PATH,
|
|
186
|
+
# use_fzf: Annotated[bool, typer.Option("--fzf", help="Use fzf for interactive selection")] = True,
|
|
187
|
+
# show_content: Annotated[bool, typer.Option("--content", "-c", help="Show content snippets")] = True,
|
|
188
|
+
# ) -> None:
|
|
189
|
+
# repo_path = repo_path.resolve()
|
|
190
|
+
|
|
191
|
+
# if not repo_path.exists():
|
|
192
|
+
# console.print(f"[bold red]Error: Repository path does not exist: {repo_path}")
|
|
193
|
+
# raise typer.Exit(1)
|
|
194
|
+
|
|
195
|
+
# rag = RepoRAG(db_path, model)
|
|
196
|
+
# results = rag.search(repo_path, query, n_results)
|
|
197
|
+
|
|
198
|
+
# if not results:
|
|
199
|
+
# console.print("[yellow]No results found")
|
|
200
|
+
# raise typer.Exit(0)
|
|
201
|
+
|
|
202
|
+
# if use_fzf:
|
|
203
|
+
# _search_with_fzf(results, repo_path, show_content)
|
|
204
|
+
# else:
|
|
205
|
+
# _display_results(results, show_content)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
# def _display_results(results: list[dict[str, str | dict[str, str | int]]], show_content: bool) -> None:
|
|
209
|
+
# table = Table(title="Search Results", show_header=True, header_style="bold magenta")
|
|
210
|
+
# table.add_column("#", style="cyan", width=4)
|
|
211
|
+
# table.add_column("File", style="green")
|
|
212
|
+
# table.add_column("Chunk", style="yellow", width=8)
|
|
213
|
+
# table.add_column("Score", style="blue", width=8)
|
|
214
|
+
# if show_content:
|
|
215
|
+
# table.add_column("Content Preview", style="white", width=60)
|
|
216
|
+
|
|
217
|
+
# for i, result in enumerate(results, 1):
|
|
218
|
+
# file_path = str(result["file_path"])
|
|
219
|
+
# metadata = result["metadata"]
|
|
220
|
+
# chunk_info = f"{int(metadata['chunk_index']) + 1}/{int(metadata['total_chunks'])}"
|
|
221
|
+
# score = f"{float(result['distance']):.3f}"
|
|
222
|
+
|
|
223
|
+
# row = [str(i), file_path, chunk_info, score]
|
|
224
|
+
|
|
225
|
+
# if show_content:
|
|
226
|
+
# content = str(result["content"])
|
|
227
|
+
# preview = content[:200].replace("\n", " ") + ("..." if len(content) > 200 else "")
|
|
228
|
+
# row.append(preview)
|
|
229
|
+
|
|
230
|
+
# table.add_row(*row)
|
|
231
|
+
|
|
232
|
+
# console.print(table)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
# def _search_with_fzf(results: list[dict[str, str | dict[str, str | int]]], repo_path: Path, show_content: bool) -> None:
|
|
236
|
+
# try:
|
|
237
|
+
# fzf_input_lines: list[str] = []
|
|
238
|
+
# for i, result in enumerate(results, 1):
|
|
239
|
+
# file_path = str(result["file_path"])
|
|
240
|
+
# metadata = result["metadata"]
|
|
241
|
+
# chunk_info = f"{int(metadata['chunk_index']) + 1}/{int(metadata['total_chunks'])}"
|
|
242
|
+
# score = f"{float(result['distance']):.3f}"
|
|
243
|
+
|
|
244
|
+
# if show_content:
|
|
245
|
+
# content = str(result["content"]).replace("\n", " ")[:100]
|
|
246
|
+
# line = f"{i:3d} │ {score:6s} │ {chunk_info:5s} │ {file_path:60s} │ {content}"
|
|
247
|
+
# else:
|
|
248
|
+
# line = f"{i:3d} │ {score:6s} │ {chunk_info:5s} │ {file_path}"
|
|
249
|
+
|
|
250
|
+
# fzf_input_lines.append(line)
|
|
251
|
+
|
|
252
|
+
# fzf_input = "\n".join(fzf_input_lines)
|
|
253
|
+
|
|
254
|
+
# result = subprocess.run(
|
|
255
|
+
# ["fzf", "--ansi", "--multi", "--reverse", "--header=Select files to open (TAB for multi-select)"],
|
|
256
|
+
# input=fzf_input.encode(),
|
|
257
|
+
# capture_output=True
|
|
258
|
+
# )
|
|
259
|
+
|
|
260
|
+
# if result.returncode != 0:
|
|
261
|
+
# console.print("[yellow]Selection cancelled")
|
|
262
|
+
# return
|
|
263
|
+
|
|
264
|
+
# selected_lines = result.stdout.decode().strip().split("\n")
|
|
265
|
+
|
|
266
|
+
# for line in selected_lines:
|
|
267
|
+
# if not line:
|
|
268
|
+
# continue
|
|
269
|
+
|
|
270
|
+
# parts = line.split("│")
|
|
271
|
+
# if len(parts) < 4:
|
|
272
|
+
# continue
|
|
273
|
+
|
|
274
|
+
# file_path_str = parts[3].strip().split()[0]
|
|
275
|
+
|
|
276
|
+
# idx = int(parts[0].strip()) - 1
|
|
277
|
+
# if idx < len(results):
|
|
278
|
+
# content = str(results[idx]["content"])
|
|
279
|
+
|
|
280
|
+
# console.print(f"\n[bold green]File:[/] {file_path_str}")
|
|
281
|
+
# console.print("[bold cyan]Content:[/]")
|
|
282
|
+
|
|
283
|
+
# syntax = Syntax(content, "python", theme="monokai", line_numbers=True)
|
|
284
|
+
# console.print(syntax)
|
|
285
|
+
# console.print("\n" + "─" * 80 + "\n")
|
|
286
|
+
|
|
287
|
+
# except FileNotFoundError:
|
|
288
|
+
# console.print("[bold red]Error: fzf not found. Install fzf or use --no-fzf flag")
|
|
289
|
+
# _display_results(results, show_content)
|
|
290
|
+
|
|
291
|
+
|
|
292
|
+
# @app.command()
|
|
293
|
+
# def delete(
|
|
294
|
+
# repo_path: Annotated[Path, typer.Argument(help="Path to repository")] = Path.cwd(),
|
|
295
|
+
# db_path: Annotated[Path, typer.Option("--db", help="Database path")] = DEFAULT_DB_PATH,
|
|
296
|
+
# model: Annotated[str, typer.Option("--model", "-m", help="Sentence transformer model name")] = DEFAULT_MODEL,
|
|
297
|
+
# ) -> None:
|
|
298
|
+
# repo_path = repo_path.resolve()
|
|
299
|
+
# rag = RepoRAG(db_path, model)
|
|
300
|
+
# rag.delete_index(repo_path)
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
# @app.command()
|
|
304
|
+
# def info() -> None:
|
|
305
|
+
# console.print("[bold cyan]Repo RAG - Semantic Code Search[/]\n")
|
|
306
|
+
|
|
307
|
+
# info_table = Table(show_header=False, box=None)
|
|
308
|
+
# info_table.add_column("Key", style="cyan")
|
|
309
|
+
# info_table.add_column("Value", style="white")
|
|
310
|
+
|
|
311
|
+
# info_table.add_row("Embedding Model", DEFAULT_MODEL)
|
|
312
|
+
# info_table.add_row("Vector Store", "ChromaDB (embedded)")
|
|
313
|
+
# info_table.add_row("Default Extensions", ", ".join(DEFAULT_EXTENSIONS))
|
|
314
|
+
# info_table.add_row("Database Path", str(DEFAULT_DB_PATH))
|
|
315
|
+
|
|
316
|
+
# console.print(info_table)
|
|
317
|
+
|
|
318
|
+
# console.print("\n[bold green]Quick Start:[/]")
|
|
319
|
+
# console.print("1. Index your repo: [yellow]repo-rag index[/]")
|
|
320
|
+
# console.print("2. Search semantically: [yellow]repo-rag search 'your query'[/]")
|
|
321
|
+
# console.print("3. Delete index: [yellow]repo-rag delete[/]")
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# if __name__ == "__main__":
|
|
325
|
+
# app()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""
|
|
2
|
+
please fully read docs of https://github.com/meilisearch/meilisearch-python
|
|
3
|
+
|
|
4
|
+
then make a cli using typer in this file
|
|
5
|
+
|
|
6
|
+
I want commands to
|
|
7
|
+
create-index (pass name of index)
|
|
8
|
+
command to populate the index with files in folder
|
|
9
|
+
command is add-to-index
|
|
10
|
+
--directory [str] and --extensions .py,.ps1,.sh
|
|
11
|
+
|
|
12
|
+
command to rebuild index
|
|
13
|
+
|
|
14
|
+
coimmand to search
|
|
15
|
+
command show stats and rop index
|
|
16
|
+
|
|
17
|
+
learn from my style of building apps like this #file:msearch.py
|
|
18
|
+
|
|
19
|
+
and add option when building index to say --symantic (means use ai locall embedding to build the index)
|
|
20
|
+
|
|
21
|
+
in all cases we should be able to pass
|
|
22
|
+
MEILI_URL="http://localhost:7700" (default)
|
|
23
|
+
MEILI_MASTER_KEY="YOUR_MASTER_KEY"
|
|
24
|
+
|
|
25
|
+
"""
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
# import shlex
|
|
4
|
+
from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def fire_crush(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
|
|
8
|
+
match ai_spec["machine"]:
|
|
9
|
+
case "local":
|
|
10
|
+
cmd = f"""
|
|
11
|
+
crush run {prompt_path}
|
|
12
|
+
"""
|
|
13
|
+
case "docker":
|
|
14
|
+
assert ai_spec["api_spec"]["api_key"] is not None, "API key is required for Crush agent in docker mode."
|
|
15
|
+
json_path = Path(__file__).parent / "fire_crush.json"
|
|
16
|
+
json_template = json_path.read_text(encoding="utf-8")
|
|
17
|
+
api_key = ai_spec["api_spec"]["api_key"]
|
|
18
|
+
json_filled = json_template.replace("{api_key}", api_key)
|
|
19
|
+
json_filled = json_filled.replace("{model}", ai_spec["model"])
|
|
20
|
+
if ai_spec["provider"] == "google":
|
|
21
|
+
provider = "gemini" # weird crush way of naming.
|
|
22
|
+
else:
|
|
23
|
+
provider = ai_spec["provider"]
|
|
24
|
+
json_filled = json_filled.replace("{provider}", provider)
|
|
25
|
+
from machineconfig.utils.accessories import randstr
|
|
26
|
+
temp_config_file_local = Path.home().joinpath("tmp_results/tmp_files/crush_" + randstr(8) + ".json")
|
|
27
|
+
temp_config_file_local.parent.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
Path(temp_config_file_local).write_text(json_filled, encoding="utf-8")
|
|
29
|
+
cmd = f"""
|
|
30
|
+
|
|
31
|
+
docker run -it --rm \
|
|
32
|
+
-v "{repo_root}:/workspace/{repo_root.name}" \
|
|
33
|
+
-v "{temp_config_file_local}:/root/.local/share/crush/crush.json" \
|
|
34
|
+
-w "/workspace/{repo_root.name}" \
|
|
35
|
+
statistician/machineconfig-ai:latest \
|
|
36
|
+
bash -i -c "source ~/.bashrc && cd /workspace/{repo_root.name} && cat /root/.local/share/crush/crush.json && crush run 'Please act on contents of this prompt ./{prompt_path.relative_to(repo_root)}'"
|
|
37
|
+
|
|
38
|
+
"""
|
|
39
|
+
return cmd
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
from pathlib import Path
|
|
4
4
|
# import shlex
|
|
5
|
-
from machineconfig.scripts.python.
|
|
6
|
-
from typing import Optional
|
|
5
|
+
from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
|
|
7
6
|
|
|
8
|
-
def fire_cursor(
|
|
9
|
-
match machine:
|
|
7
|
+
def fire_cursor(ai_spec: AI_SPEC, prompt_path: Path) -> str:
|
|
8
|
+
match ai_spec["machine"]:
|
|
10
9
|
case "local":
|
|
11
10
|
# Export the environment variable so it's available to subshells
|
|
12
11
|
cmd = f"""
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import shlex
|
|
4
|
+
from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def fire_gemini(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path) -> str:
|
|
8
|
+
_ = ai_spec["provider"]
|
|
9
|
+
# model = "gemini-2.5-flash-lite"
|
|
10
|
+
# model = None # auto-select
|
|
11
|
+
# if model is None:
|
|
12
|
+
# model_arg = ""
|
|
13
|
+
# else:
|
|
14
|
+
model_arg = f"--model {shlex.quote(ai_spec['model'])}"
|
|
15
|
+
# Need a real shell for the pipeline; otherwise '| gemini ...' is passed as args to 'cat'
|
|
16
|
+
safe_path = shlex.quote(str(prompt_path))
|
|
17
|
+
settings_dot_json = {
|
|
18
|
+
"security": {
|
|
19
|
+
"auth": {
|
|
20
|
+
"selectedType": "gemini-api-key"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
# settings_path = Path.home().joinpath(".gemini", "settings.json")
|
|
25
|
+
from machineconfig.utils.accessories import randstr
|
|
26
|
+
settings_tmp_path = Path.home().joinpath("tmp_results", "tmp_files", "agents", f"gemini_settings_{randstr()}.json")
|
|
27
|
+
settings_tmp_path.parent.mkdir(parents=True, exist_ok=True)
|
|
28
|
+
import json
|
|
29
|
+
settings_tmp_path.write_text(json.dumps(settings_dot_json, indent=2), encoding="utf-8")
|
|
30
|
+
match ai_spec["machine"]:
|
|
31
|
+
case "local":
|
|
32
|
+
# Export the environment variable so it's available to subshells
|
|
33
|
+
api_key = ai_spec["api_spec"]["api_key"]
|
|
34
|
+
if api_key is not None:
|
|
35
|
+
define_api_key = f"""export GEMINI_API_KEY="{shlex.quote(api_key)}" """
|
|
36
|
+
else:
|
|
37
|
+
define_api_key = "echo 'Warning: No GEMINI_API_KEY provided, hoping it is set in the environment.'"
|
|
38
|
+
cmd = f"""
|
|
39
|
+
{define_api_key}
|
|
40
|
+
echo "Using Gemini API key $GEMINI_API_KEY"
|
|
41
|
+
gemini {model_arg} --yolo --prompt {safe_path}
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
case "docker":
|
|
45
|
+
api_key = ai_spec["api_spec"]["api_key"]
|
|
46
|
+
assert api_key is not None, "When using docker, api_key must be provided."
|
|
47
|
+
cmd = f"""
|
|
48
|
+
docker run -it --rm \
|
|
49
|
+
-v {settings_tmp_path}:/root/.gemini/settings.json \
|
|
50
|
+
-v "{repo_root}:/workspace/{repo_root.name}" \
|
|
51
|
+
-w "/workspace/{repo_root.name}" \
|
|
52
|
+
statistician/machineconfig-ai:latest \
|
|
53
|
+
bash -c '. ~/.bashrc; export GEMINI_API_KEY="{api_key}"; gemini --model {shlex.quote(ai_spec['model'])} --yolo {prompt_path.relative_to(repo_root)}'
|
|
54
|
+
"""
|
|
55
|
+
return cmd
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
import shlex
|
|
4
|
+
from machineconfig.scripts.python.helpers_agents.fire_agents_helper_types import AI_SPEC
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def fire_qwen(ai_spec: AI_SPEC, prompt_path: Path, repo_root: Path, config_dir: str | None) -> str:
|
|
8
|
+
_ = ai_spec["provider"]
|
|
9
|
+
safe_path = shlex.quote(str(prompt_path))
|
|
10
|
+
match ai_spec["machine"]:
|
|
11
|
+
case "local":
|
|
12
|
+
cmd = f"""
|
|
13
|
+
qwen --yolo --prompt {safe_path}
|
|
14
|
+
"""
|
|
15
|
+
case "docker":
|
|
16
|
+
assert config_dir is not None, "When using docker, config_dir must be provided."
|
|
17
|
+
assert Path(config_dir).exists(), f"Provided config_dir {config_dir} does not exist."
|
|
18
|
+
oauth_creds = Path(config_dir).joinpath("oauth_creds.json")
|
|
19
|
+
settings = Path(config_dir).joinpath("settings.json")
|
|
20
|
+
|
|
21
|
+
cmd = f"""
|
|
22
|
+
docker run -it --rm \
|
|
23
|
+
-v "{repo_root}:/workspace/{repo_root.name}" \
|
|
24
|
+
-v {shlex.quote(str(oauth_creds))}:/root/.qwen/oauth_creds.json \
|
|
25
|
+
-v {shlex.quote(str(settings))}:/root/.qwen/settings.json \
|
|
26
|
+
-w "/workspace/{repo_root.name}" \
|
|
27
|
+
statistician/machineconfig-ai:latest \
|
|
28
|
+
qwen --prompt "$PATH_PROMPT"
|
|
29
|
+
"""
|
|
30
|
+
return cmd
|