From ed8dd89ba752806593ef7ab55f0c118c2c4ccc0f Mon Sep 17 00:00:00 2001 From: Julian lechner Date: Thu, 17 Sep 2026 21:48:34 +0200 Subject: [PATCH] feat(install-options): add npm CLI reinstall helpers (Bash) global_npm_package, cli_npm_package, read_cli_reinstall_option, and invoke_cli_reinstall are the Bash equivalent of the PowerShell npm reinstall helpers. Not wired into install.sh yet. Co-Authored-By: Claude Sonnet 5 --- scripts/lib/install-options.sh | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) 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"