opx.fish

 1function opx --description "Run command with 1Password secret refs resolved"
 2    set -l vars_to_resolve
 3    set -l refs
 4
 5    for var in (set --names -x)
 6        set -l value $$var
 7        if string match -q 'op://*' -- $value
 8            set -a vars_to_resolve $var
 9            set -a refs $value
10        end
11    end
12
13    if test (count $vars_to_resolve) -eq 0
14        $argv
15        return
16    end
17
18    # Build template: VAR=op://ref (one per line)
19    set -l template_lines
20    for i in (seq (count $vars_to_resolve))
21        set -a template_lines "$vars_to_resolve[$i]=$refs[$i]"
22    end
23
24    # Single op call resolves everything
25    set -l resolved_lines (printf '%s\n' $template_lines | op inject 2>/dev/null)
26    if test $status -ne 0
27        echo "opx: failed to resolve secrets" >&2
28        return 1
29    end
30
31    env $resolved_lines $argv
32end