diff --git a/scripts/lib/install-options.sh b/scripts/lib/install-options.sh index 78b5241..d2a7635 100644 --- a/scripts/lib/install-options.sh +++ b/scripts/lib/install-options.sh @@ -36,6 +36,49 @@ read_install_options() { semantic_retrieval=$(read_install_boolean 'Enable Qwen3 embedding and reranking semantic retrieval?' "$semantic_retrieval") || return } +global_npm_package() { + command -v npm >/dev/null 2>&1 || return 1 + npm list -g "$1" --depth=0 --json >/dev/null 2>&1 +} + +cli_npm_package() { + case "$1" in + codex) printf '@openai/codex\n' ;; + claude) printf '@anthropic-ai/claude-code\n' ;; + esac +} + +# read_cli_reinstall_option -- asked once per install run, never persisted; +# a dry run never prompts and never previews it. +read_cli_reinstall_option() { + local client=$1 dry_run=$2 + if [ "$dry_run" = true ]; then printf 'false\n'; return; fi + read_install_boolean "Uninstall $client and reinstall via npm?" false +} + +invoke_cli_reinstall() { + local client=$1 dry_run=$2 summary=${3:-false} + local selected_client clients=() package + case "$client" in codex|both) clients+=(codex) ;; esac + case "$client" in claude|both) clients+=(claude) ;; esac + for selected_client in "${clients[@]}"; do + if [ "$selected_client" = codex ] && [ "$dry_run" = false ] && codex_process_active; then + printf 'WARN Codex CLI reinstall skipped because codex.exe is running. Close all Codex sessions and run install again to reinstall the CLI.\n' >&2 + continue + fi + package=$(cli_npm_package "$selected_client") + if global_npm_package "$package"; then + CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1 run_plugin_command "$dry_run" npm uninstall -g "$package" &2 + fi + CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATE=1 run_plugin_command "$dry_run" npm install -g "${package}@latest"