Fish completions are additive — sourcing a new file doesn't remove old rules. Add `complete -c mcpctl -e` at the top to clear stale entries. Also add 12 structural tests to prevent completion regressions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
169 lines
9.8 KiB
Fish
169 lines
9.8 KiB
Fish
# mcpctl fish completions
|
|
|
|
# Erase any stale completions from previous versions
|
|
complete -c mcpctl -e
|
|
|
|
set -l commands status login logout config get describe delete logs create edit apply backup restore help
|
|
set -l project_commands attach-server detach-server get describe delete logs create edit help
|
|
|
|
# Disable file completions by default
|
|
complete -c mcpctl -f
|
|
|
|
# Global options
|
|
complete -c mcpctl -s v -l version -d 'Show version'
|
|
complete -c mcpctl -l daemon-url -d 'mcplocal daemon URL' -x
|
|
complete -c mcpctl -l direct -d 'Bypass mcplocal, connect directly to mcpd'
|
|
complete -c mcpctl -l project -d 'Target project context' -x
|
|
complete -c mcpctl -s h -l help -d 'Show help'
|
|
|
|
# Helper: check if --project was given
|
|
function __mcpctl_has_project
|
|
set -l tokens (commandline -opc)
|
|
for i in (seq (count $tokens))
|
|
if test "$tokens[$i]" = "--project"
|
|
return 0
|
|
end
|
|
end
|
|
return 1
|
|
end
|
|
|
|
# Helper: check if a resource type has been selected after get/describe/delete/edit
|
|
set -l resources servers instances secrets templates projects users groups rbac
|
|
|
|
function __mcpctl_needs_resource_type
|
|
set -l tokens (commandline -opc)
|
|
set -l found_cmd false
|
|
for tok in $tokens
|
|
if $found_cmd
|
|
# Check if next token after get/describe/delete/edit is a resource type
|
|
if contains -- $tok servers instances secrets templates projects users groups rbac
|
|
return 1 # resource type already present
|
|
end
|
|
end
|
|
if contains -- $tok get describe delete edit
|
|
set found_cmd true
|
|
end
|
|
end
|
|
if $found_cmd
|
|
return 0 # command found but no resource type yet
|
|
end
|
|
return 1
|
|
end
|
|
|
|
function __mcpctl_get_resource_type
|
|
set -l tokens (commandline -opc)
|
|
set -l found_cmd false
|
|
for tok in $tokens
|
|
if $found_cmd
|
|
if contains -- $tok servers instances secrets templates projects users groups rbac
|
|
echo $tok
|
|
return
|
|
end
|
|
end
|
|
if contains -- $tok get describe delete edit
|
|
set found_cmd true
|
|
end
|
|
end
|
|
end
|
|
|
|
# Fetch resource names dynamically from the API
|
|
function __mcpctl_resource_names
|
|
set -l resource (__mcpctl_get_resource_type)
|
|
if test -z "$resource"
|
|
return
|
|
end
|
|
# Use mcpctl to fetch names (quick JSON parse with string manipulation)
|
|
mcpctl get $resource -o json 2>/dev/null | string match -rg '"name":\s*"([^"]+)"'
|
|
end
|
|
|
|
# Fetch project names for --project value
|
|
function __mcpctl_project_names
|
|
mcpctl get projects -o json 2>/dev/null | string match -rg '"name":\s*"([^"]+)"'
|
|
end
|
|
|
|
# --project value completion
|
|
complete -c mcpctl -l project -xa '(__mcpctl_project_names)'
|
|
|
|
# Top-level commands (without --project)
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a status -d 'Show status and connectivity'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a login -d 'Authenticate with mcpd'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a logout -d 'Log out'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a config -d 'Manage configuration'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a get -d 'List resources'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a describe -d 'Show resource details'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a delete -d 'Delete a resource'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a logs -d 'Get instance logs'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a create -d 'Create a resource'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a edit -d 'Edit a resource'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a apply -d 'Apply configuration from file'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a backup -d 'Backup configuration'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a restore -d 'Restore from backup'
|
|
complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a help -d 'Show help'
|
|
|
|
# Project-scoped commands (with --project)
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a attach-server -d 'Attach a server to the project'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a detach-server -d 'Detach a server from the project'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a get -d 'List resources (scoped to project)'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a describe -d 'Show resource details'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a delete -d 'Delete a resource'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a logs -d 'Get instance logs'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a create -d 'Create a resource'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a edit -d 'Edit a resource'
|
|
complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a help -d 'Show help'
|
|
|
|
# Resource types — only when resource type not yet selected
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from get describe delete; and __mcpctl_needs_resource_type" -a "$resources" -d 'Resource type'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from edit; and __mcpctl_needs_resource_type" -a 'servers projects' -d 'Resource type'
|
|
|
|
# Resource names — after resource type is selected
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from get describe delete edit; and not __mcpctl_needs_resource_type" -a '(__mcpctl_resource_names)' -d 'Resource name'
|
|
|
|
# get/describe options
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from get" -s o -l output -d 'Output format' -xa 'table json yaml'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from describe" -s o -l output -d 'Output format' -xa 'detail json yaml'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from describe" -l show-values -d 'Show secret values'
|
|
|
|
# login options
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from login" -l url -d 'mcpd URL' -x
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from login" -l email -d 'Email address' -x
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from login" -l password -d 'Password' -x
|
|
|
|
# config subcommands
|
|
set -l config_cmds view set path reset claude-generate impersonate
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a view -d 'Show configuration'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a set -d 'Set a config value'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a path -d 'Show config file path'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a reset -d 'Reset to defaults'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a claude-generate -d 'Generate .mcp.json'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a impersonate -d 'Impersonate a user'
|
|
|
|
# create subcommands
|
|
set -l create_cmds server secret project user group rbac
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a server -d 'Create a server'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a secret -d 'Create a secret'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a project -d 'Create a project'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a user -d 'Create a user'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a group -d 'Create a group'
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a rbac -d 'Create an RBAC binding'
|
|
|
|
# logs options
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from logs" -l tail -d 'Number of lines' -x
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from logs" -l since -d 'Since timestamp' -x
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from logs" -s f -l follow -d 'Follow log output'
|
|
|
|
# backup options
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from backup" -s o -l output -d 'Output file' -rF
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from backup" -s p -l password -d 'Encryption password' -x
|
|
|
|
# restore options
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s i -l input -d 'Input file' -rF
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s p -l password -d 'Decryption password' -x
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s c -l conflict -d 'Conflict strategy' -xa 'skip overwrite fail'
|
|
|
|
# apply takes a file
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from apply" -s f -l file -d 'Configuration file' -rF
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from apply" -F
|
|
|
|
# help completions
|
|
complete -c mcpctl -n "__fish_seen_subcommand_from help" -a "$commands"
|