summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorsigoden <sigoden@gmail.com>2024-04-13 19:50:10 +0800
committerGitHub <noreply@github.com>2024-04-13 19:50:10 +0800
commit1c3e81afe9f63fb47303384a82c7239458166f52 (patch)
tree85d89be89fe9347cf4e8b8cbf30993e5d85c38f8 /scripts
parent568e9a06db7189a28f9346802356b3fd4bdf921b (diff)
downloadaichat-1c3e81afe9f63fb47303384a82c7239458166f52.tar.gz
feat: add completion scripts (#411)
Diffstat (limited to 'scripts')
-rw-r--r--scripts/completions/aichat.bash93
-rw-r--r--scripts/completions/aichat.fish18
-rw-r--r--scripts/completions/aichat.nu50
-rw-r--r--scripts/completions/aichat.ps179
-rw-r--r--scripts/completions/aichat.zsh73
5 files changed, 313 insertions, 0 deletions
diff --git a/scripts/completions/aichat.bash b/scripts/completions/aichat.bash
new file mode 100644
index 0000000..0d72747
--- /dev/null
+++ b/scripts/completions/aichat.bash
@@ -0,0 +1,93 @@
+_aichat() {
+ local i cur prev opts cmd
+ COMPREPLY=()
+ cur="${COMP_WORDS[COMP_CWORD]}"
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
+ cmd=""
+ opts=""
+
+ for i in ${COMP_WORDS[@]}
+ do
+ case "${cmd},${i}" in
+ ",$1")
+ cmd="aichat"
+ ;;
+ *)
+ ;;
+ esac
+ done
+
+ case "${cmd}" in
+ aichat)
+ opts="-m -r -s -e -c -f -H -S -w -h -V --model --role --session --save-session --execute --code --file --no-highlight --no-stream --wrap --light-theme --dry-run --info --list-models --list-roles --list-sessions --help --version"
+ if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
+ return 0
+ fi
+
+ # hacking -m or --model completion value that contains colon
+ if [ "$cur" == ":" ] || [ "$prev" == ":" ]; then
+ local option client
+ if [ "$cur" = ":" ]; then
+ option="${COMP_WORDS[COMP_CWORD-2]}"
+ client="$prev"
+ else
+ option="${COMP_WORDS[COMP_CWORD-3]}"
+ client="${COMP_WORDS[COMP_CWORD-2]}"
+ fi
+ if [ "$option" == "-m" ] || [ "$flag" == "--model" ]; then
+ if [ "$cur" == ":" ]; then
+ cur=""
+ fi
+ COMPREPLY=($(compgen -W "$("$1" --list-models | sed -n '/'"${client}"'/ s/'"${client%:*}"'://p')" -- "${cur}"))
+ return 0
+ fi
+ fi
+
+ case "${prev}" in
+ -m|--model)
+ COMPREPLY=($(compgen -W "$("$1" --list-models)" -- "${cur}"))
+ return 0
+ ;;
+ -r|--role)
+ COMPREPLY=($(compgen -W "$("$1" --list-roles)" -- "${cur}"))
+ return 0
+ ;;
+ -s|--session)
+ COMPREPLY=($(compgen -W "$("$1" --list-sessions)" -- "${cur}"))
+ return 0
+ ;;
+ -f|--file)
+ local oldifs
+ if [[ -v IFS ]]; then
+ oldifs="$IFS"
+ fi
+ IFS=$'\n'
+ COMPREPLY=($(compgen -f "${cur}"))
+ if [[ -v oldifs ]]; then
+ IFS="$oldifs"
+ fi
+ if [[ "${BASH_VERSINFO[0]}" -ge 4 ]]; then
+ compopt -o filenames
+ fi
+ return 0
+ ;;
+ -w|--wrap)
+ COMPREPLY=($(compgen -f "${cur}"))
+ return 0
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+ COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
+ return 0
+ ;;
+ esac
+}
+
+if [[ "${BASH_VERSINFO[0]}" -eq 4 && "${BASH_VERSINFO[1]}" -ge 4 || "${BASH_VERSINFO[0]}" -gt 4 ]]; then
+ complete -F _aichat -o nosort -o bashdefault -o default aichat
+else
+ complete -F _aichat -o bashdefault -o default aichat
+fi
diff --git a/scripts/completions/aichat.fish b/scripts/completions/aichat.fish
new file mode 100644
index 0000000..1169cd6
--- /dev/null
+++ b/scripts/completions/aichat.fish
@@ -0,0 +1,18 @@
+complete -c aichat -s m -l model -x -a "(aichat --list-models)" -d 'Choose a LLM model' -r
+complete -c aichat -s r -l role -x -a "(aichat --list-roles)" -d 'Choose a role' -r
+complete -c aichat -s s -l session -x -a"(aichat --list-sessions)" -d 'Create or reuse a session' -r
+complete -c aichat -s f -l file -d 'Attach files to the message' -r -F
+complete -c aichat -s w -l wrap -d 'Specify the text-wrapping mode (no, auto, <max-width>)'
+complete -c aichat -l save-session -d 'Whether to save the session'
+complete -c aichat -s e -l execute -d 'Execute commands using natural language'
+complete -c aichat -s c -l code -d 'Generate only code'
+complete -c aichat -s H -l no-highlight -d 'Disable syntax highlighting'
+complete -c aichat -s S -l no-stream -d 'No stream output'
+complete -c aichat -l light-theme -d 'Use light theme'
+complete -c aichat -l dry-run -d 'Run in dry run mode'
+complete -c aichat -l info -d 'Print related information'
+complete -c aichat -l list-models -d 'List all available models'
+complete -c aichat -l list-roles -d 'List all available roles'
+complete -c aichat -l list-sessions -d 'List all available sessions'
+complete -c aichat -s h -l help -d 'Print help'
+complete -c aichat -s V -l version -d 'Print version'
diff --git a/scripts/completions/aichat.nu b/scripts/completions/aichat.nu
new file mode 100644
index 0000000..19b382e
--- /dev/null
+++ b/scripts/completions/aichat.nu
@@ -0,0 +1,50 @@
+module completions {
+
+ def "nu-complete aichat completions" [] {
+ [ "bash" "zsh" "fish" "powershell" "nushell" ]
+ }
+
+ def "nu-complete aichat model" [] {
+ ^aichat --list-models |
+ | lines
+ | parse "{value}"
+ }
+
+ def "nu-complete aichat role" [] {
+ ^aichat --list-roles |
+ | lines
+ | parse "{value}"
+ }
+
+ def "nu-complete aichat session" [] {
+ ^aichat --list-sessions |
+ | lines
+ | parse "{value}"
+ }
+
+ # All-in-one chat and copilot CLI that integrates 10+ AI platforms
+ export extern aichat [
+ --model(-m): string@"nu-complete aichat model" # Choose a LLM model
+ --role(-r): string@"nu-complete aichat role" # Choose a role
+ --session(-s): string@"nu-complete aichat role" # Create or reuse a session
+ --save-session # Whether to save the session
+ --execute(-e) # Execute commands using natural language
+ --code(-c) # Generate only code
+ --file(-f): string # Attach files to the message
+ --no-highlight(-H) # Disable syntax highlighting
+ --no-stream(-S) # No stream output
+ --wrap(-w): string # Specify the text-wrapping mode (no, auto, <max-width>)
+ --light-theme # Use light theme
+ --dry-run # Run in dry run mode
+ --info # Print related information
+ --list-models # List all available models
+ --list-roles # List all available roles
+ --list-sessions # List all available sessions
+ ...text: string # Input text
+ --help(-h) # Print help
+ --version(-V) # Print version
+ ]
+
+}
+
+export use completions *
diff --git a/scripts/completions/aichat.ps1 b/scripts/completions/aichat.ps1
new file mode 100644
index 0000000..7d5a7cf
--- /dev/null
+++ b/scripts/completions/aichat.ps1
@@ -0,0 +1,79 @@
+using namespace System.Management.Automation
+using namespace System.Management.Automation.Language
+
+Register-ArgumentCompleter -Native -CommandName 'aichat' -ScriptBlock {
+ param($wordToComplete, $commandAst, $cursorPosition)
+
+ $commandElements = $commandAst.CommandElements
+ $command = @(
+ 'aichat'
+ for ($i = 1; $i -lt $commandElements.Count; $i++) {
+ $element = $commandElements[$i]
+ if ($element -isnot [StringConstantExpressionAst] -or
+ $element.StringConstantType -ne [StringConstantType]::BareWord -or
+ $element.Value.StartsWith('-') -or
+ $element.Value -eq $wordToComplete) {
+ break
+ }
+ $element.Value
+ }) -join ';'
+
+ $completions = @(switch ($command) {
+ 'aichat' {
+ [CompletionResult]::new('-m', '-m', [CompletionResultType]::ParameterName, 'Choose a LLM model')
+ [CompletionResult]::new('--model', '--model', [CompletionResultType]::ParameterName, 'Choose a LLM model')
+ [CompletionResult]::new('-r', '-r', [CompletionResultType]::ParameterName, 'Choose a role')
+ [CompletionResult]::new('--role', '--role', [CompletionResultType]::ParameterName, 'Choose a role')
+ [CompletionResult]::new('-s', '-s', [CompletionResultType]::ParameterName, 'Create or reuse a session')
+ [CompletionResult]::new('--session', '--session', [CompletionResultType]::ParameterName, 'Create or reuse a session')
+ [CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'Attach files to the message')
+ [CompletionResult]::new('--file', '--file', [CompletionResultType]::ParameterName, 'Attach files to the message')
+ [CompletionResult]::new('-w', '-w', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (no, auto, <max-width>)')
+ [CompletionResult]::new('--wrap', '--wrap', [CompletionResultType]::ParameterName, 'Specify the text-wrapping mode (no, auto, <max-width>)')
+ [CompletionResult]::new('--save-session', '--save-session', [CompletionResultType]::ParameterName, 'Whether to save the session')
+ [CompletionResult]::new('-e', '-e', [CompletionResultType]::ParameterName, 'Execute commands using natural language')
+ [CompletionResult]::new('--execute', '--execute', [CompletionResultType]::ParameterName, 'Execute commands using natural language')
+ [CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'Generate only code')
+ [CompletionResult]::new('--code', '--code', [CompletionResultType]::ParameterName, 'Generate only code')
+ [CompletionResult]::new('-H', '-H', [CompletionResultType]::ParameterName, 'Disable syntax highlighting')
+ [CompletionResult]::new('--no-highlight', '--no-highlight', [CompletionResultType]::ParameterName, 'Disable syntax highlighting')
+ [CompletionResult]::new('-S', '-S', [CompletionResultType]::ParameterName, 'No stream output')
+ [CompletionResult]::new('--no-stream', '--no-stream', [CompletionResultType]::ParameterName, 'No stream output')
+ [CompletionResult]::new('--light-theme', '--light-theme', [CompletionResultType]::ParameterName, 'Use light theme')
+ [CompletionResult]::new('--dry-run', '--dry-run', [CompletionResultType]::ParameterName, 'Run in dry run mode')
+ [CompletionResult]::new('--info', '--info', [CompletionResultType]::ParameterName, 'Print related information')
+ [CompletionResult]::new('--list-models', '--list-models', [CompletionResultType]::ParameterName, 'List all available models')
+ [CompletionResult]::new('--list-roles', '--list-roles', [CompletionResultType]::ParameterName, 'List all available roles')
+ [CompletionResult]::new('--list-sessions', '--list-sessions', [CompletionResultType]::ParameterName, 'List all available sessions')
+ [CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'Print help')
+ [CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'Print help')
+ [CompletionResult]::new('-V', '-V', [CompletionResultType]::ParameterName, 'Print version')
+ [CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'Print version')
+ break
+ }
+ })
+
+ function Get-AichatValues($arg) {
+ $(aichat $arg) -split '\n' | ForEach-Object { [CompletionResult]::new($_) }
+ }
+
+ if ($commandElements.Count -gt 1) {
+ $offset=2
+ if ($wordToComplete -eq "") {
+ $offset=1
+ }
+ $flag = $commandElements[$commandElements.Count-$offset].ToString()
+ if ($flag -eq "-m" -or $flag -eq "--model") {
+ $completions = Get-AichatValues "--list-models"
+ } elseif ($flag -eq "-r" -or $flag -eq "--role") {
+ $completions = Get-AichatValues "--list-roles"
+ } elseif ($flag -eq "-s" -or $flag -eq "--session") {
+ $completions = Get-AichatValues "--list-sessions"
+ } elseif ($flag -eq "-f" -or $flag -eq "--file") {
+ $completions = @()
+ }
+ }
+
+ $completions.Where{ $_.CompletionText -like "$wordToComplete*" } |
+ Sort-Object -Property ListItemText
+}
diff --git a/scripts/completions/aichat.zsh b/scripts/completions/aichat.zsh
new file mode 100644
index 0000000..83ad751
--- /dev/null
+++ b/scripts/completions/aichat.zsh
@@ -0,0 +1,73 @@
+#compdef aichat
+
+autoload -U is-at-least
+
+_aichat() {
+ typeset -A opt_args
+ typeset -a _arguments_options
+ local ret=1
+
+ if is-at-least 5.2; then
+ _arguments_options=(-s -S -C)
+ else
+ _arguments_options=(-s -C)
+ fi
+
+ local context curcontext="$curcontext" state line
+ local common=(
+'-m+[Choose a LLM model]:MODEL:->models' \
+'--model=[Choose a LLM model]:MODEL:->models' \
+'-r+[Choose a role]:ROLE:->roles' \
+'--role=[Choose a role]:ROLE:->roles' \
+'-s+[Create or reuse a session]:SESSION:->sessions' \
+'--session=[Create or reuse a session]:SESSION:->sessions' \
+'*-f+[Attach files to the message]:FILE:_files' \
+'*--file=[Attach files to the message]:FILE:_files' \
+'-w+[Specify the text-wrapping mode (no, auto, <max-width>)]:WRAP: ' \
+'--wrap=[Specify the text-wrapping mode (no, auto, <max-width>)]:WRAP: ' \
+'--save-session[Whether to save the session]' \
+'-e[Execute commands using natural language]' \
+'--execute[Execute commands using natural language]' \
+'-c[Generate only code]' \
+'--code[Generate only code]' \
+'-H[Disable syntax highlighting]' \
+'--no-highlight[Disable syntax highlighting]' \
+'-S[No stream output]' \
+'--no-stream[No stream output]' \
+'--light-theme[Use light theme]' \
+'--dry-run[Run in dry run mode]' \
+'--info[Print related information]' \
+'--list-models[List all available models]' \
+'--list-roles[List all available roles]' \
+'--list-sessions[List all available sessions]' \
+'-h[Print help]' \
+'--help[Print help]' \
+'-V[Print version]' \
+'--version[Print version]' \
+'*::text -- Input text:' \
+ )
+
+
+ _arguments "${_arguments_options[@]}" $common \
+ && ret=0
+ case $state in
+ models|roles|sessions)
+ local -a values expl
+ values=( ${(f)"$(_call_program values aichat --list-$state)"} )
+ _wanted values expl $state compadd -a values && ret=0
+ ;;
+ esac
+ return ret
+}
+
+(( $+functions[_aichat_commands] )) ||
+_aichat_commands() {
+ local commands; commands=()
+ _describe -t commands 'aichat commands' commands "$@"
+}
+
+if [ "$funcstack[1]" = "_aichat" ]; then
+ _aichat "$@"
+else
+ compdef _aichat aichat
+fi