_synu.zsh

  1#compdef synu
  2
  3# SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
  4#
  5# SPDX-License-Identifier: Unlicense
  6
  7# Completion for synu - Universal agent wrapper with Synthetic API quota tracking
  8
  9local curcontext="$curcontext" state line
 10typeset -A opt_args
 11
 12local -a agents=(
 13    'claude:Claude Code agent'
 14    'opencode:OpenCode agent'
 15    'aider:Aider agent'
 16    'llxprt:llxprt agent'
 17    'qwen:Qwen Code agent'
 18    'crush:Crush agent (passthrough)'
 19    'amp:Amp agent (passthrough)'
 20    'octo:Octo agent (passthrough)'
 21    'codex:Codex agent (passthrough)'
 22)
 23
 24local -a first_args=(
 25    'i:Interactive model selection'
 26    ${agents[@]}
 27)
 28
 29_arguments -C \
 30    '1: :->first' \
 31    '2: :->second' \
 32    '*:: :->args' && return 0
 33
 34case $state in
 35    first)
 36        _describe -t commands 'synu commands' first_args
 37        ;;
 38    second)
 39        if [[ "$words[2]" == "i" ]]; then
 40            _describe -t agents 'agents' agents
 41        else
 42            # After agent name, provide agent-specific options
 43            case "$words[2]" in
 44                claude)
 45                    _arguments \
 46                        '-L[Override Opus, Sonnet, and Sub-agent models]:model:' \
 47                        '--large[Override Opus, Sonnet, and Sub-agent models]:model:' \
 48                        '-l[Override Haiku model]:model:' \
 49                        '--light[Override Haiku model]:model:' \
 50                        '-o[Override Opus model]:model:' \
 51                        '--opus[Override Opus model]:model:' \
 52                        '-s[Override Sonnet model]:model:' \
 53                        '--sonnet[Override Sonnet model]:model:' \
 54                        '-H[Override Haiku model]:model:' \
 55                        '--haiku[Override Haiku model]:model:' \
 56                        '-a[Override Sub-agent model]:model:' \
 57                        '--agent[Override Sub-agent model]:model:' \
 58                        '*::claude arguments:_command_names -e'
 59                    ;;
 60                opencode)
 61                    _arguments \
 62                        '-m[Override model]:model:' \
 63                        '--model[Override model]:model:' \
 64                        '*::opencode arguments:_command_names -e'
 65                    ;;
 66                aider)
 67                    # Note: no short flags to avoid collision with aider's -m (--message) and -e (--env-file)
 68                    _arguments \
 69                        '--model[Main model]:model:' \
 70                        '--editor-model[Editor model (enables architect + editor mode)]:model:' \
 71                        '*::aider arguments:_command_names -e'
 72                    ;;
 73                llxprt)
 74                    _arguments \
 75                        '-m[Override model]:model:' \
 76                        '--model[Override model]:model:' \
 77                        '*::llxprt arguments:_command_names -e'
 78                    ;;
 79                qwen)
 80                    _arguments \
 81                        '-m[Override model]:model:' \
 82                        '--model[Override model]:model:' \
 83                        '*::qwen arguments:_command_names -e'
 84                    ;;
 85                *)
 86                    # Passthrough agents - no special options
 87                    _command_names -e
 88                    ;;
 89            esac
 90        fi
 91        ;;
 92    args)
 93        # After "i agent", provide agent-specific options
 94        if [[ "$words[2]" == "i" ]]; then
 95            case "$words[3]" in
 96                claude)
 97                    _arguments \
 98                        '-L[Override Opus, Sonnet, and Sub-agent models]:model:' \
 99                        '--large[Override Opus, Sonnet, and Sub-agent models]:model:' \
100                        '-l[Override Haiku model]:model:' \
101                        '--light[Override Haiku model]:model:' \
102                        '-o[Override Opus model]:model:' \
103                        '--opus[Override Opus model]:model:' \
104                        '-s[Override Sonnet model]:model:' \
105                        '--sonnet[Override Sonnet model]:model:' \
106                        '-H[Override Haiku model]:model:' \
107                        '--haiku[Override Haiku model]:model:' \
108                        '-a[Override Sub-agent model]:model:' \
109                        '--agent[Override Sub-agent model]:model:' \
110                        '*::claude arguments:_command_names -e'
111                    ;;
112                opencode|llxprt|qwen)
113                    _arguments \
114                        '-m[Override model]:model:' \
115                        '--model[Override model]:model:' \
116                        '*::arguments:_command_names -e'
117                    ;;
118                aider)
119                    # Note: no short flags to avoid collision with aider's -m (--message) and -e (--env-file)
120                    _arguments \
121                        '--model[Main model]:model:' \
122                        '--editor-model[Editor model]:model:' \
123                        '*::aider arguments:_command_names -e'
124                    ;;
125            esac
126        fi
127        ;;
128esac