diff --git a/VERSION b/VERSION index de197cc3..a95f2884 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -4.1.3 +4.1.4 diff --git a/bin/ccs.js b/bin/ccs.js index a88cc491..1aeedf4e 100755 --- a/bin/ccs.js +++ b/bin/ccs.js @@ -126,9 +126,9 @@ function handleHelpCommand() { // Description console.log(colored('Description:', 'cyan')); - console.log(' Switch between multiple Claude accounts (work, personal, team) and'); - console.log(' alternative models (GLM, Kimi) instantly. Concurrent sessions with'); - console.log(' auto-recovery. Zero downtime.'); + console.log(' Switch between multiple Claude accounts and alternative models'); + console.log(' (GLM, Kimi) instantly. Run different Claude CLI sessions concurrently'); + console.log(' with auto-recovery. Zero downtime.'); console.log(''); // Model Switching @@ -144,17 +144,13 @@ function handleHelpCommand() { // Account Management console.log(colored('Account Management:', 'cyan')); console.log(` ${colored('ccs auth --help', 'yellow')} Manage multiple Claude accounts`); - console.log(` ${colored('ccs work', 'yellow')} Switch to work account`); - console.log(` ${colored('ccs personal', 'yellow')} Switch to personal account`); console.log(''); - // Delegation (NEW) - console.log(colored('Delegation (Token Optimization):', 'cyan')); - console.log(` ${colored('/ccs:glm "task"', 'yellow')} Delegate to GLM-4.6 within Claude session`); + // Delegation (inside Claude Code CLI) + console.log(colored('Delegation (inside Claude Code CLI):', 'cyan')); + console.log(` ${colored('/ccs:glm "task"', 'yellow')} Delegate to GLM-4.6 for simple tasks`); console.log(` ${colored('/ccs:kimi "task"', 'yellow')} Delegate to Kimi for long context`); - console.log(` ${colored('/ccs:create m2', 'yellow')} Create custom delegation command`); - console.log(' Use delegation to save tokens on simple tasks'); - console.log(' Commands work inside Claude Code sessions only'); + console.log(' Save tokens by delegating simple tasks to cost-optimized models'); console.log(''); // Diagnostics @@ -189,13 +185,8 @@ function handleHelpCommand() { // Examples console.log(colored('Examples:', 'cyan')); - console.log(' Quick start:'); - console.log(` ${colored('$ ccs', 'yellow')} # Use default account`); - console.log(` ${colored('$ ccs glm "implement API"', 'yellow')} # Cost-optimized model`); - console.log(''); - console.log(' Multi-account workflow:'); - console.log(` ${colored('$ ccs auth create work', 'yellow')} # Create work profile`); - console.log(` ${colored('$ ccs work "review PR"', 'yellow')} # Use work account`); + console.log(` ${colored('$ ccs', 'yellow')} # Use default account`); + console.log(` ${colored('$ ccs glm "implement API"', 'yellow')} # Cost-optimized model`); console.log(''); console.log(` For more: ${colored('https://github.com/kaitranntt/ccs#usage', 'cyan')}`); console.log(''); diff --git a/bin/utils/shell-completion.js b/bin/utils/shell-completion.js index c7575ff9..b2fc3024 100644 --- a/bin/utils/shell-completion.js +++ b/bin/utils/shell-completion.js @@ -52,6 +52,34 @@ class ShellCompletionInstaller { }); } + /** + * Safely create directory, checking for file conflicts + * @param {string} dirPath - Path to create + * @throws {Error} If path exists but is a file + */ + ensureDirectory(dirPath) { + if (fs.existsSync(dirPath)) { + const stat = fs.statSync(dirPath); + if (!stat.isDirectory()) { + throw new Error( + `Cannot create directory: ${dirPath} exists but is a file.\n` + + `Please remove or rename this file and try again.` + ); + } + // Directory exists, nothing to do + return; + } + + // Check parent directories recursively + const parentDir = path.dirname(dirPath); + if (parentDir !== dirPath) { + this.ensureDirectory(parentDir); + } + + // Create the directory + fs.mkdirSync(dirPath); + } + /** * Install bash completion */ @@ -97,10 +125,8 @@ class ShellCompletionInstaller { throw new Error('Completion file not found. Please reinstall CCS.'); } - // Create zsh completion directory - if (!fs.existsSync(zshCompDir)) { - fs.mkdirSync(zshCompDir, { recursive: true }); - } + // Create zsh completion directory (with file conflict checking) + this.ensureDirectory(zshCompDir); // Copy to zsh completion directory const destFile = path.join(zshCompDir, '_ccs'); @@ -142,10 +168,8 @@ class ShellCompletionInstaller { throw new Error('Completion file not found. Please reinstall CCS.'); } - // Create fish completion directory - if (!fs.existsSync(fishCompDir)) { - fs.mkdirSync(fishCompDir, { recursive: true }); - } + // Create fish completion directory (with file conflict checking) + this.ensureDirectory(fishCompDir); // Copy to fish completion directory (fish auto-loads from here) const destFile = path.join(fishCompDir, 'ccs.fish'); @@ -178,11 +202,9 @@ class ShellCompletionInstaller { const sourceCmd = `. "${completionPath.replace(/\\/g, '\\\\')}"`; const block = `\n${marker}\n${sourceCmd}\n`; - // Create profile directory if needed + // Create profile directory if needed (with file conflict checking) const profileDir = path.dirname(profilePath); - if (!fs.existsSync(profileDir)) { - fs.mkdirSync(profileDir, { recursive: true }); - } + this.ensureDirectory(profileDir); // Check if already installed if (fs.existsSync(profilePath)) { diff --git a/installers/install.ps1 b/installers/install.ps1 index 9e306584..ae24b4e0 100644 --- a/installers/install.ps1 +++ b/installers/install.ps1 @@ -31,7 +31,7 @@ $InstallMethod = if ($ScriptDir -and ((Test-Path "$ScriptDir\lib\ccs.ps1") -or ( # IMPORTANT: Update this version when releasing new versions! # This hardcoded version is used for standalone installations (irm | iex) # For git installations, VERSION file is read if available -$CcsVersion = "4.1.3" +$CcsVersion = "4.1.4" # Try to read VERSION file for git installations if ($ScriptDir) { diff --git a/installers/install.sh b/installers/install.sh index 3c79d054..959de55d 100755 --- a/installers/install.sh +++ b/installers/install.sh @@ -32,7 +32,7 @@ fi # IMPORTANT: Update this version when releasing new versions! # This hardcoded version is used for standalone installations (curl | bash) # For git installations, VERSION file is read if available -CCS_VERSION="4.1.3" +CCS_VERSION="4.1.4" # Try to read VERSION file for git installations if [[ -f "$SCRIPT_DIR/VERSION" ]]; then diff --git a/lib/ccs b/lib/ccs index 8114fa15..63700176 100755 --- a/lib/ccs +++ b/lib/ccs @@ -2,7 +2,7 @@ set -euo pipefail # Version (updated by scripts/bump-version.sh) -CCS_VERSION="4.1.3" +CCS_VERSION="4.1.4" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" readonly CONFIG_FILE="${CCS_CONFIG:-$HOME/.ccs/config.json}" readonly PROFILES_JSON="$HOME/.ccs/profiles.json" @@ -171,9 +171,9 @@ show_help() { echo -e " ${YELLOW}ccs${RESET} [flags]" echo "" echo -e "${CYAN}Description:${RESET}" - echo -e " Switch between multiple Claude accounts (work, personal, team) and" - echo -e " alternative models (GLM, Kimi) instantly. Concurrent sessions with" - echo -e " auto-recovery. Zero downtime." + echo -e " Switch between multiple Claude accounts and alternative models" + echo -e " (GLM, Kimi) instantly. Run different Claude CLI sessions concurrently" + echo -e " with auto-recovery. Zero downtime." echo "" echo -e "${CYAN}Model Switching:${RESET}" echo -e " ${YELLOW}ccs${RESET} Use default Claude account" @@ -184,15 +184,11 @@ show_help() { echo "" echo -e "${CYAN}Account Management:${RESET}" echo -e " ${YELLOW}ccs auth --help${RESET} Manage multiple Claude accounts" - echo -e " ${YELLOW}ccs work${RESET} Switch to work account" - echo -e " ${YELLOW}ccs personal${RESET} Switch to personal account" echo "" - echo -e "${CYAN}Delegation (Token Optimization):${RESET}" - echo -e " ${YELLOW}/ccs:glm \"task\"${RESET} Delegate to GLM-4.6 within Claude session" + echo -e "${CYAN}Delegation (inside Claude Code CLI):${RESET}" + echo -e " ${YELLOW}/ccs:glm \"task\"${RESET} Delegate to GLM-4.6 for simple tasks" echo -e " ${YELLOW}/ccs:kimi \"task\"${RESET} Delegate to Kimi for long context" - echo -e " ${YELLOW}/ccs:create m2${RESET} Create custom delegation command" - echo -e " Use delegation to save tokens on simple tasks" - echo -e " Commands work inside Claude Code sessions only" + echo -e " Save tokens by delegating simple tasks to cost-optimized models" echo "" echo -e "${CYAN}Diagnostics:${RESET}" echo -e " ${YELLOW}ccs doctor${RESET} Run health check and diagnostics" @@ -214,13 +210,8 @@ show_help() { echo -e " Note: Commands, skills, and agents are symlinked across all profiles" echo "" echo -e "${CYAN}Examples:${RESET}" - echo -e " Quick start:" - echo -e " ${YELLOW}\$ ccs${RESET} # Use default account" - echo -e " ${YELLOW}\$ ccs glm \"implement API\"${RESET} # Cost-optimized model" - echo "" - echo -e " Multi-account workflow:" - echo -e " ${YELLOW}\$ ccs auth create work${RESET} # Create work profile" - echo -e " ${YELLOW}\$ ccs work \"review PR\"${RESET} # Use work account" + echo -e " ${YELLOW}\$ ccs${RESET} # Use default account" + echo -e " ${YELLOW}\$ ccs glm \"implement API\"${RESET} # Cost-optimized model" echo "" echo -e " For more: ${CYAN}https://github.com/kaitranntt/ccs#usage${RESET}" echo "" diff --git a/lib/ccs.ps1 b/lib/ccs.ps1 index 2ba84c95..72bf770b 100644 --- a/lib/ccs.ps1 +++ b/lib/ccs.ps1 @@ -12,7 +12,7 @@ param( $ErrorActionPreference = "Stop" # Version (updated by scripts/bump-version.sh) -$CcsVersion = "4.1.3" +$CcsVersion = "4.1.4" $ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path $ConfigFile = if ($env:CCS_CONFIG) { $env:CCS_CONFIG } else { "$env:USERPROFILE\.ccs\config.json" } $ProfilesJson = "$env:USERPROFILE\.ccs\profiles.json" @@ -218,9 +218,9 @@ function Show-Help { Write-ColorLine " ccs [flags]" "Yellow" Write-Host "" Write-ColorLine "Description:" "Cyan" - Write-Host " Switch between multiple Claude accounts (work, personal, team) and" - Write-Host " alternative models (GLM, Kimi) instantly. Concurrent sessions with" - Write-Host " auto-recovery. Zero downtime." + Write-Host " Switch between multiple Claude accounts and alternative models" + Write-Host " (GLM, Kimi) instantly. Run different Claude CLI sessions concurrently" + Write-Host " with auto-recovery. Zero downtime." Write-Host "" Write-ColorLine "Model Switching:" "Cyan" Write-ColorLine " ccs Use default Claude account" "Yellow" @@ -230,22 +230,18 @@ function Show-Help { Write-ColorLine " ccs glm 'debug this code' Use GLM and run command" "Yellow" Write-Host "" Write-ColorLine "Examples:" "Cyan" - Write-Host " Quick start:" - Write-ColorLine " `$ ccs" "Yellow" -NoNewline + Write-ColorLine " `$ ccs" "Yellow" -NoNewline Write-Host " # Use default account" - Write-ColorLine " `$ ccs glm `"implement API`"" "Yellow" -NoNewline + Write-ColorLine " `$ ccs glm `"implement API`"" "Yellow" -NoNewline Write-Host " # Cost-optimized model" Write-Host "" - Write-Host " Profile usage:" - Write-ColorLine " `$ ccs work `"debug code`"" "Yellow" -NoNewline - Write-Host " # Switch to work profile" - Write-ColorLine " `$ ccs personal" "Yellow" -NoNewline - Write-Host " # Open personal account" - Write-Host "" Write-ColorLine "Account Management:" "Cyan" Write-ColorLine " ccs auth --help Manage multiple Claude accounts" "Yellow" - Write-ColorLine " ccs work Switch to work account" "Yellow" - Write-ColorLine " ccs personal Switch to personal account" "Yellow" + Write-Host "" + Write-ColorLine "Delegation (inside Claude Code CLI):" "Cyan" + Write-ColorLine " /ccs:glm `"task`" Delegate to GLM-4.6 for simple tasks" "Yellow" + Write-ColorLine " /ccs:kimi `"task`" Delegate to Kimi for long context" "Yellow" + Write-Host " Save tokens by delegating simple tasks to cost-optimized models" Write-Host "" Write-ColorLine "Diagnostics:" "Cyan" Write-ColorLine " ccs doctor Run health check and diagnostics" "Yellow" diff --git a/package.json b/package.json index dcc61b66..c9114536 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kaitranntt/ccs", - "version": "4.1.3", + "version": "4.1.4", "description": "Claude Code Switch - Instant profile switching between Claude Sonnet 4.5 and GLM 4.6", "keywords": [ "cli", diff --git a/scripts/completion/ccs.bash b/scripts/completion/ccs.bash index f3eaa5a5..39fbcd67 100644 --- a/scripts/completion/ccs.bash +++ b/scripts/completion/ccs.bash @@ -19,7 +19,7 @@ _ccs_completion() { # Top-level completion (first argument) if [[ ${COMP_CWORD} -eq 1 ]]; then local commands="auth doctor" - local flags="--help --version -h -v" + local flags="--help --version --shell-completion -h -v" local profiles="" # Add profiles from config.json (settings-based profiles) @@ -74,6 +74,12 @@ _ccs_completion() { return 0 fi + # Flags for shell-completion command + if [[ ${prev} == "--shell-completion" ]]; then + COMPREPLY=( $(compgen -W "--bash --zsh --fish --powershell" -- ${cur}) ) + return 0 + fi + return 0 } diff --git a/scripts/completion/ccs.fish b/scripts/completion/ccs.fish index 4a5b8295..c43e6dde 100644 --- a/scripts/completion/ccs.fish +++ b/scripts/completion/ccs.fish @@ -9,22 +9,41 @@ # Fish will automatically load completions from this directory. # No need to source or reload - completions are loaded on demand. -# Helper function to get profiles -function __fish_ccs_get_profiles +# Helper function to get settings profiles +function __fish_ccs_get_settings_profiles set -l config_path ~/.ccs/config.json - set -l profiles_path ~/.ccs/profiles.json # Get settings-based profiles from config.json if test -f $config_path jq -r '.profiles | keys[]' $config_path 2>/dev/null end +end - # Get account-based profiles from profiles.json - if test -f $profiles_path - jq -r '.profiles | keys[]' $profiles_path 2>/dev/null +# Helper function to get custom/unknown settings profiles +# (profiles not in the hardcoded known list) +function __fish_ccs_get_custom_settings_profiles + set -l config_path ~/.ccs/config.json + set -l known_profiles default glm glmt kimi + + # Get all settings profiles + if test -f $config_path + set -l all_profiles (jq -r '.profiles | keys[]' $config_path 2>/dev/null) + + # Filter out known profiles + for profile in $all_profiles + if not contains $profile $known_profiles + echo $profile + end + end end end +# Helper function to get profiles with all types +function __fish_ccs_get_profiles + __fish_ccs_get_settings_profiles + __fish_ccs_get_account_profiles +end + # Helper function to get account profiles only function __fish_ccs_get_account_profiles set -l profiles_path ~/.ccs/profiles.json @@ -51,13 +70,29 @@ complete -c ccs -f # Top-level flags complete -c ccs -s h -l help -d 'Show help message' complete -c ccs -s v -l version -d 'Show version information' +complete -c ccs -l shell-completion -d 'Install shell completion' -# Top-level commands -complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'auth' -d 'Manage multiple Claude accounts' -complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'doctor' -d 'Run health check and diagnostics' +# Top-level commands (blue color for commands) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'auth' -d (set_color blue)'Manage multiple Claude accounts'(set_color normal) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'doctor' -d (set_color blue)'Run health check and diagnostics'(set_color normal) -# Top-level profile completion (all profiles) -complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a '(__fish_ccs_get_profiles)' -d 'Switch to profile' +# Top-level known settings profiles (green color for model profiles) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'default' -d (set_color green)'Default Claude Sonnet 4.5'(set_color normal) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'glm' -d (set_color green)'GLM-4.6 (cost-optimized)'(set_color normal) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'glmt' -d (set_color green)'GLM-4.6 with thinking mode'(set_color normal) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a 'kimi' -d (set_color green)'Kimi for Coding (long-context)'(set_color normal) + +# Top-level custom settings profiles (dynamic, with generic description in green) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a '(__fish_ccs_get_custom_settings_profiles)' -d (set_color green)'Settings-based profile'(set_color normal) + +# Top-level account profiles (dynamic, yellow color for account profiles) +complete -c ccs -n 'not __fish_seen_subcommand_from auth doctor' -a '(__fish_ccs_get_account_profiles)' -d (set_color yellow)'Account profile'(set_color normal) + +# shell-completion subflags +complete -c ccs -n '__fish_seen_argument -l shell-completion' -l bash -d 'Install for bash' +complete -c ccs -n '__fish_seen_argument -l shell-completion' -l zsh -d 'Install for zsh' +complete -c ccs -n '__fish_seen_argument -l shell-completion' -l fish -d 'Install for fish' +complete -c ccs -n '__fish_seen_argument -l shell-completion' -l powershell -d 'Install for PowerShell' # auth subcommands complete -c ccs -n '__fish_ccs_using_auth; and not __fish_seen_subcommand_from create list show remove default' -a 'create' -d 'Create new profile and login' diff --git a/scripts/completion/ccs.ps1 b/scripts/completion/ccs.ps1 index dd7aee4a..75bd4646 100644 --- a/scripts/completion/ccs.ps1 +++ b/scripts/completion/ccs.ps1 @@ -12,8 +12,9 @@ Register-ArgumentCompleter -CommandName ccs -ScriptBlock { param($commandName, $wordToComplete, $commandAst, $fakeBoundParameters) - $commands = @('auth', 'doctor', '--help', '--version', '-h', '-v') + $commands = @('auth', 'doctor', '--help', '--version', '--shell-completion', '-h', '-v') $authCommands = @('create', 'list', 'show', 'remove', 'default', '--help', '-h') + $shellCompletionFlags = @('--bash', '--zsh', '--fish', '--powershell') $listFlags = @('--verbose', '--json') $removeFlags = @('--yes', '-y') $showFlags = @('--json') @@ -67,6 +68,21 @@ Register-ArgumentCompleter -CommandName ccs -ScriptBlock { return } + # shell-completion flag completion + if ($words[1] -eq '--shell-completion') { + if ($position -eq 3) { + $shellCompletionFlags | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { + [System.Management.Automation.CompletionResult]::new( + $_, + $_, + 'ParameterValue', + $_ + ) + } + } + return + } + # auth subcommand completion if ($words[1] -eq 'auth') { if ($position -eq 3) { diff --git a/scripts/completion/ccs.zsh b/scripts/completion/ccs.zsh index ae263f59..3e1102e4 100644 --- a/scripts/completion/ccs.zsh +++ b/scripts/completion/ccs.zsh @@ -12,41 +12,75 @@ # Or install system-wide: # sudo cp scripts/completion/ccs.zsh /usr/local/share/zsh/site-functions/_ccs +# Set up completion styles for better formatting and colors +# Color codes: 0;34=blue, 0;32=green, 0;33=yellow, 2;37=dim white +# Pattern format: =(#b)(group1)(group2)==color_for_group1=color_for_group2 +# The leading '=' means no color for whole match, then each '=' assigns to each group +zstyle ':completion:*:*:ccs:*:commands' list-colors '=(#b)(auth|doctor)([[:space:]]#--[[:space:]]#*)==0\;34=2\;37' +zstyle ':completion:*:*:ccs:*:model-profiles' list-colors '=(#b)(default|glm|glmt|kimi|[^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;32=2\;37' +zstyle ':completion:*:*:ccs:*:account-profiles' list-colors '=(#b)([^[:space:]]##)([[:space:]]#--[[:space:]]#*)==0\;33=2\;37' +zstyle ':completion:*:*:ccs:*' group-name '' +zstyle ':completion:*:*:ccs:*:descriptions' format $'\n%B%F{yellow}── %d ──%f%b' +zstyle ':completion:*:*:ccs:*' list-separator ' -- ' +zstyle ':completion:*:*:ccs:*' list-rows-first true +zstyle ':completion:*:*:ccs:*' menu select + _ccs() { - local -a commands profiles settings_profiles account_profiles + local -a commands settings_profiles_described account_profiles_described local curcontext="$curcontext" state line typeset -A opt_args - # Define top-level commands + # Define top-level commands (padded for alignment) commands=( 'auth:Manage multiple Claude accounts' 'doctor:Run health check and diagnostics' ) + # Define known settings profiles with descriptions (consistent padding) + local -A profile_descriptions + profile_descriptions=( + 'default' 'Default Claude Sonnet 4.5' + 'glm' 'GLM-4.6 (cost-optimized)' + 'glmt' 'GLM-4.6 with thinking mode' + 'kimi' 'Kimi for Coding (long-context)' + ) + # Load settings-based profiles from config.json if [[ -f ~/.ccs/config.json ]]; then - settings_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null)"}) + local -a raw_settings_profiles + raw_settings_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/config.json 2>/dev/null)"}) + + # Add descriptions to settings profiles + for profile in $raw_settings_profiles; do + local desc="${profile_descriptions[$profile]:-Settings-based profile}" + settings_profiles_described+=("${profile}:${desc}") + done fi # Load account-based profiles from profiles.json if [[ -f ~/.ccs/profiles.json ]]; then - account_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/profiles.json 2>/dev/null)"}) - fi + local -a raw_account_profiles + raw_account_profiles=(${(f)"$(jq -r '.profiles | keys[]' ~/.ccs/profiles.json 2>/dev/null)"}) - # Combine all profiles - profiles=($settings_profiles $account_profiles) + # Add descriptions to account profiles + for profile in $raw_account_profiles; do + account_profiles_described+=("${profile}:Account-based profile") + done + fi _arguments -C \ '(- *)'{-h,--help}'[Show help message]' \ '(- *)'{-v,--version}'[Show version information]' \ + '(- *)--shell-completion[Install shell completion]' \ '1: :->command' \ '*:: :->args' case $state in command) - local -a all_options - all_options=($commands $profiles) - _describe -t commands 'ccs commands' all_options + # Describe commands and profiles with proper tagging for colors + _describe -t commands 'commands' commands + _describe -t model-profiles 'model profiles' settings_profiles_described + _describe -t account-profiles 'account profiles' account_profiles_described ;; args) @@ -58,6 +92,13 @@ _ccs() { _arguments \ '(- *)'{-h,--help}'[Show help for doctor command]' ;; + --shell-completion) + _arguments \ + '--bash[Install for bash]' \ + '--zsh[Install for zsh]' \ + '--fish[Install for fish]' \ + '--powershell[Install for PowerShell]' + ;; *) # For profile names, complete with Claude CLI arguments _message 'Claude CLI arguments'