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