minuet links MinuetVirtualText -> Comment, which in vague is #606079 -- the
same colour as real comments, so a suggestion reads as if it were already part
of the file. Dropped to #4a4a5c, between Comment and Whitespace (#333738).
⚠ Re-applied on ColorScheme. Loading a colourscheme runs ,
which drops custom groups, so setting this once at startup works until the
first :colorscheme and then silently stops. The reference values for the
palette are in the comment so the number can be tuned without going and
looking them up again.
vim.pack.add installs on first launch and that needs to reach github, which is
not a given on a work-issued machine behind a proxy. A hard require there takes
down everything below it -- MinuetStatus, the colorscheme, the lot -- and
reports an error pointing at minuet rather than at the network.
MinuetStatus is now registered unconditionally and reports whether the plugin
loaded at all. A status command that only exists once everything already works
is not a status command.
⚠ 1. The whole require() was guarded behind "is the key present", so with no
key the module never loaded, `:Minuet` was never registered, and nvim gave NO
indication why. That is exactly the failure it hit in practice. `:Minuet` is
created at module load, not inside setup(), and the plugin already notifies
clearly when the key is missing -- let it do that job. setup() now always
runs, and `:MinuetStatus` reports endpoint, model and whether a key resolved.
⚠ 2. The FIM template took `(ctx)` and read `ctx.lines_before`. minuet calls
it as `template.prompt(before, after, opts)` -- three positional args -- so the
first real completion died with "attempt to concatenate field 'lines_after'
(a nil value)". The config loaded perfectly cleanly the whole time. A config
that loads is not a config that works, and only a functional test found it.
The key now resolves lazily and is cached: env var first, then rbw with the
host-appropriate entry (litellm-key-work on sctfw004, where that key IS the
policy boundary). `false` is cached for "looked and found nothing" so a locked
rbw costs one probe per session, not one per keystroke.
Verified against the live path: provider reports available, the key resolves,
and /v1/completions returns correct FIM infills both streaming and not.
copilot has been commented out on every machine with "deliberately off". This
is what replaces it: minuet-ai in virtual-text mode against qwen3-coder-30b on
mainframe's 3060. Nothing leaves the LAN -- llm.rcjohnstone.com has no public
A record, uses the internal CA, and Caddy source-IP gates it.
⚠ Route is /v1/completions, NOT /infill. Measured through the proxy:
/v1/completions returns 200 with FIM tokens in a raw prompt, /infill is 404
because LiteLLM does not expose it. llama.vim wants /infill, which would mean
talking to llama-server directly and bypassing the virtual key -- and on the
work laptop that key IS the policy boundary making Anthropic and PRC models
403. Not worth routing around for an editor plugin.
⚠ max_tokens is 32 on purpose. Measured on the real path at 48: `def add` came
back with `sub` and `mul` attached, so most of the latency was spent generating
text that would be discarded. Stop tokens include a blank line for the same
reason.
⚠ Expect occasional multi-second pauses: llama-swap is -np 1 with a ttl, so a
completion after another model was used pays a full reload. ~10 s cold,
0.7-1.3 s warm, measured end to end through the work key. Accepted because
concurrent agentic work is not viable on this hardware anyway.
Virtual text rather than a cmp source because there is no completion engine
installed here, and ghost text is the copilot-shaped one. Silent no-op when
LITELLM_KEY_NVIM is unset, so the headless NAS is unaffected.
Connor's call: the work laptop's commented-out copilot is the state he
wants on all four machines, so the host conditional added in 8ddbbe2 is
unnecessary machinery. Back to a plain plugin list.
Taking the work laptop's init.lua as canonical carried its commented-out
copilot line to every machine. Copilot was enabled on mainframe, system76
and the NAS before the refit — only the work laptop had it off. Sharing the
file silently disabled it on the other three.
The plugin list is now built in a table and copilot appended unless the
host is sctfw004. Keyed on vim.fn.hostname() rather than $DOTFILES_HOST,
because nvim launched from a desktop entry does not inherit the shell's
environment.
Replaces the previous repo, which had split into two histories that never
met (mainframe on a dead GitLab remote, the laptops on Gitea) with 146
dirty files across three machines and the NAS never enrolled at all.
Branch-per-machine is gone. One main, with host differences expressed as
small files under hosts/<hostname>/ rather than as branches, so there is
nothing to merge. The reconciled zsh layer reduces 15-33 line forks to
1-7 effective lines per host; distro differences (oh-my-zsh prefix,
syntax-highlighting path, fd vs fdfind) are probed in common/ instead.
Fresh history: the old one carried six plaintext credentials, 45 MB of
mail caches, browser caches and vendored binaries. 5,096 tracked files
and 144 MB become 462 files and 2.6 MB. The .gitignore is now an
allowlist, which is what keeps that true.
Root cause of the rot: ~/.local/bin was a symlink to scripts/ with GOPATH
inside it, so every go install wrote into version control (2.2 GB on the
work laptop). PATH now points at the repo instead of the reverse.
Also: Hyprland replaces sway and is sourced in two halves so $browser is
defined before use; singleton automations carry ConditionHost= alongside
host-layer-only placement; ddns moves from cron to a guarded timer;
package manifests and pkg-snapshot/pkg-restore replace the X11-era
install_scripts/; networkmanager-dmenu added to system76 (the binding
always existed, the package never did).