With several NetBox instances, netssh offers "prod/fsn1-bx1…" for the
typed text "fsn1". compadd discarded these matches because they do not
start with the typed word, so <Tab> found nothing. The matcher
'l:|=*' lets zsh accept text before the typed word; netssh has already
filtered the candidates.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Remove everything netssh and install.sh set up, also leftovers of
older versions:
- netssh blocks and unmarked legacy lines in bash, zsh, and fish
profiles
- completion files for bash, zsh (incl. the oh-my-zsh cache), fish,
and the command alias; files not generated by netssh are kept
- the cache directory with hosts, aliases, and per-instance caches
- the config file and local notes; the config is first copied to a
private netssh.yaml.backup-<timestamp> because it holds API tokens
- the netssh binary; for protected paths the sudo command is printed
--keep-config keeps config and notes, --dry-run only lists the plan,
and --yes skips the confirmation.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`netssh --version` used to be passed to ssh and failed with
"unknown option -- -". Release builds now embed the tag via
-X main.version; other builds fall back to the module build info.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Add SSH settings that apply only to netssh connections, so
~/.ssh/config does not need global changes:
- proxy_jump (passed as -J; "none" disables an inherited jump host)
- host_key_checking: strict | accept-new | off (off prints a notice)
- target: ip (default) | name | hostname; "name" connects to the
NetBox name with -o HostName=<ip> and -o HostKeyAlias=<name>, so
`Host *.example.com` rules apply and known_hosts entries follow the
device instead of a reused IP
- address_family: any | inet | inet6
- options (-o Key=Value) and extra_args
Settings layer global -> netboxes[].ssh -> ssh.rules (match by tag,
instance, kind, or name glob). Options given on the command line
always win: -o values are inserted after the user's own, and
extra_args before them.
New wrapper flags: --jump HOST, --no-jump, and --dry-run, which prints
the final ssh command instead of connecting. The TUI uses the same
options. The setup wizard keeps all new settings when it saves.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
`netssh hook install` and the setup wizard now write the same marked
`# >>> netssh >>>` block as install.sh and replace unmarked entries of
older versions instead of appending duplicates. Uninstall shares the
legacy patterns with the installer (eval/alias/source variants).
For zsh the block adds ~/.zfunc to fpath and calls compdef, so
completion also works when compinit already ran earlier in .zshrc,
e.g. with oh-my-zsh. The installer reports which completion it set up
per shell and how to reset ~/.zcompdump.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Cobra's generated zsh script spawns a subshell per candidate and sends
every host through _describe, so <Tab> hangs for seconds with thousands
of cached hosts. netssh now ships its own script: subcommands and flags
go through _describe, plain hostnames through compadd. 5000 hosts
complete in ~0.08 s instead of ~4 s.
Add completion.max_results to cap the number of offered hostnames and
sort host candidates for a stable order.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>