From 3293712e416f56dc63ec1a20ada6f634313c2a5d Mon Sep 17 00:00:00 2001 From: Michael Sitarzewski Date: Mon, 6 Jul 2026 14:43:03 -0500 Subject: [PATCH] fix(install): honor comma-separated --tool list (as the help documents) (#678) The help text advertised `--tool ` (a comma list), but --tool took a single value and validated it whole, so `--tool claude-code,cursor` failed with "Unknown tool 'claude-code,cursor'". --division and --agent already split on commas; --tool didn't (#671). Split --tool on commas, trim each entry, and validate each against ALL_TOOLS (mirrors --division), so a bad entry still errors clearly by name. Single-tool use is unchanged. Verified: --tool claude-code,cursor installs both; "claude-code, cursor" (with spaces) works; --tool claude-code,nope errors on 'nope'; --tool cursor still works. Fixes #671 Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq Co-authored-by: Claude Opus 4.8 --- scripts/install.sh | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/scripts/install.sh b/scripts/install.sh index 3970e6be..4f001fbd 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -1183,14 +1183,21 @@ main() { check_integrations - # Validate explicit tool + # Validate explicit tool(s). --tool accepts a comma-separated list (like + # --division / --agent), e.g. --tool claude-code,cursor. + local _tool_list=() if [[ "$tool" != "all" ]]; then - local valid=false t - for t in "${ALL_TOOLS[@]}"; do [[ "$t" == "$tool" ]] && valid=true && break; done - if ! $valid; then - err "Unknown tool '$tool'. Valid: ${ALL_TOOLS[*]}" - exit 1 - fi + local _t + IFS=',' read -ra _tool_list <<< "$tool" + local _cleaned=() + for _t in "${_tool_list[@]}"; do + _t="$(printf '%s' "$_t" | xargs)"; [[ -z "$_t" ]] && continue + local valid=false _vt + for _vt in "${ALL_TOOLS[@]}"; do [[ "$_vt" == "$_t" ]] && valid=true && break; done + $valid || { err "Unknown tool '$_t'. Valid: ${ALL_TOOLS[*]}"; exit 1; } + _cleaned+=("$_t") + done + _tool_list=("${_cleaned[@]}") fi # Decide whether to show interactive UI @@ -1207,7 +1214,7 @@ main() { : # wizard committed SELECTED_TOOLS + FILTER_DIVISIONS elif [[ "$tool" != "all" ]]; then - SELECTED_TOOLS=("$tool") + SELECTED_TOOLS=("${_tool_list[@]}") else # Non-interactive (or no TTY): auto-detect