- Shell 89%
- Lua 7.1%
- Python 3.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
/usage reports a weekly limit scoped to a single model (Fable) that the status line did not surface. It is absent from both the status line's stdin JSON and the legacy seven_day_opus/seven_day_sonnet fields, which are always null now; it lives in the usage API's .limits[] under kind "weekly_scoped". Render it labelled by scope.model.display_name so it follows whichever model the limit applies to, inside the 7d segment since both are weekly limits sharing one reset time. Fitting it exposed a problem with sizing by width tier. Tiers only know the terminal width, so content that varies with session state — branch name, cwd, model display name — could push a line past the edge and be clipped by the renderer. Measure the assembled line instead (vis_len) and emit the richest of four rate-limit variants that fits, on one line or two: with reset times, with extra-usage credits, bars only, or bars without the per-model segment. Every branch is fit-checked, including with wrapping disabled. Two lines render correctly in the status line. Cap the cwd basename as well: nothing else shortened line one, so a long project directory could overflow it on its own. Correct the usable width. Claude Code exports COLUMNS but applies the `padding` setting on top of it rather than deducting it first, so a line sized to COLUMNS is clipped; deduct padding on both sides plus a column of margin. Sanitise payload data before rendering. printf %b interprets backslash escapes, which is how the colour variables work, so a cwd or model name containing a literal \n — or a real newline, which jq decodes from the JSON — would split the line and break both the width measurement and the two-line guarantee. Parse the usage payload in one jq pass rather than ten. The status line runs on every redraw and per-field parsing had become the dominant cost; this brings a render back to roughly what it was before (~155ms vs ~115ms parent), the remainder being the reset times the tiered version did not show at this width. Fields are read one per line rather than via @tsv: tab is IFS whitespace, so `read` collapses runs of it and an empty field — no scoped limit, which is the common case — silently shifted every later field along by one. Tests cover the API payload shapes including malformed and hostile input, the width invariants (never exceed the usable width, never more than two lines, never wrap unnecessarily), and a sweep over widths, branch lengths, model names, cwd lengths and extra-usage. They restore the live usage cache on exit, and remove the fixture outright when there was no cache to restore — otherwise a test run would leave fabricated usage figures live for an hour. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> |
||
| bin | ||
| claude | ||
| ghostty | ||
| gnupg | ||
| neovim | ||
| zsh/plugins | ||
| bootstrap.sh | ||
| brew.sh | ||
| delta-themes.gitconfig | ||
| gitconfig | ||
| gitconfig.local.template | ||
| gitignore | ||
| hushlogin | ||
| LICENSE | ||
| macos.sh | ||
| README.md | ||
| sheldon.toml | ||
| tmux | ||
| tmux-dark.conf | ||
| tmux-light.conf | ||
| zshrc.zsh | ||
dotfiles
Here’s my dotfiles, inspired by people like Mathias. See his dotfiles at
https://github.com/mathias/dotfiles.
The idea I’m currently going down is to create a symlink from $HOME to this
directory. There is one exception to this, the .gitconfig file. I don’t want
actual commiter details committed into this repo, and they differ per machine
anyway — this Mac signs with my work address, the iMac with my personal one.
So identity and signing live in an untracked $HOME/.gitconfig.local, which the
tracked gitconfig pulls in with an [include] as its last directive. Last
matters: git applies config in file order, so anything after the include would
override it.
$HOME/.gitconfig is copied rather than symlinked, so that an ad-hoc
git config --global writes into $HOME instead of dirtying this repo. The
trade-off is that git pull alone does not update it — re-run ./bootstrap.sh,
or cp gitconfig ~/.gitconfig, after changing the tracked copy.
Usage
First clone the repo.
Run ./bootstrap.sh, this will create all the necessary symlinks, then source
.zshrc.
Warning
This is a destructive process, so backup your dotfiles first.
As mentioned above, git identity lives in an untracked $HOME/.gitconfig.local.
bootstrap.sh seeds it from gitconfig.local.template if it does not already
exist, and never overwrites an existing one. Fill it in:
[user]
name = Jonny Barnes
email = jonny@jonnybarnes.uk
signingkey = ssh-ed25519 AAAA...
[commit]
gpgsign = true
[gpg "ssh"]
program = /Applications/1Password.app/Contents/MacOS/op-ssh-sign
Do not skip this. Git will not prompt you — with no identity it quietly derives one from your username and hostname, warns once, and signs nothing.
$HOME/.extra is a separate untracked file for other machine-local environment
variables, sourced from .zshrc. Keep git out of it:
Important
Never put
git config --globalin.extra. It is re-sourced on everySIGUSR1, so with several tmux panes the concurrent writes race on~/.gitconfig.lockand spewerror: could not lock config file. Put git settings in.gitconfig.localinstead.
Fork workflow
Work repos are forks: origin is mine, upstream is the one PRs are raised
against. git sync — bin/git-sync, found as a subcommand because it is on the
$PATH — does the start-of-work dance:
git sync # fast-forward the default branch from upstream, push it to origin
It asks the server which branch is the default rather than assuming main,
fast-forwards only (a diverged default branch is something to look at, not to
merge), and pushes to origin so the fork's copy matches. Then branch off it as
usual, push the branch to origin, and raise the PR against upstream.
The awkward part is that git caches the default branch and does not refresh
it. refs/remotes/origin/HEAD is written once, at clone time; the default
remote.<name>.followRemoteHEAD = create only fills it in when missing. So
BuildEmpire/Totara renaming its default from main to totara-20 left every
clone still reporting main — git default-branch included. Two things fix
that: followRemoteHEAD = always in the gitconfig re-points the ref on every
fetch, and git sync sets it explicitly from what the server just said.
Anything wanting the base branch should read that ref, and prefer origin when
doing so. git remote sorts alphabetically, so picking the first remote in
be-edition returns kdog — a colleague's fork. nvim's <leader>gm
(diff-against-branch) tries origin, then upstream, then the rest.
Light and dark mode
Most of this is now handled natively and needs no configuration:
- ghostty follows the system appearance itself via
theme = light:tangere-light.conf,dark:tangere-dark.conf. - tmux 3.6+ learns the terminal’s theme over OSC 2031 and exposes it as
#{client_theme}. - bat picks a theme per invocation from
BAT_THEME_LIGHT/BAT_THEME_DARK. - delta and nvim detect the terminal background themselves.
The tmux status bar needs help, because its colours are set explicitly. They live
in tmux-light.conf and tmux-dark.conf — the same layout, with each colour
taken from the matching tangere palette index — and tmux sources one of them
from three hooks:
client-light-theme/client-dark-themereact to a change,client-attachedpicks the right one for a client that attaches mid-way, since the two above only fire on a change.
Because this keys off the terminal's reported theme rather than a schedule, it behaves identically whether the change came from Auto at sunrise/sunset or from toggling Light/Dark by hand — nothing in the chain knows why it changed.
Note
A running nvim will not follow a live change: the docs are explicit that the TUI sets
backgroundon startup if it can detect it. New instances are fine — verified, a fresh nvim in light mode reportsbackground=light— but existing ones need:set background=lightor a restart.
Verified in light mode: the status bar switches in the same second the hook
fires, a fresh nvim detects light, and delta resolves its light default
(syntax-theme = GitHub, against Monokai Extended on dark).
Tip
When adding these hooks to an already running tmux server, detach and reattach. tmux enables the terminal’s theme-reporting mode when a client attaches, so a client that predates the hooks never gets asked to report changes —
#{client_theme}still reads correctly, because that is answered by a direct query, but no hook fires until the client reattaches.
Note
This previously used
dark-mode-notifyas alaunchdagent that ranpkill -usr1 zshon every appearance change. That has been removed. It could never have worked: re-sourcing.zshrcruns inside each shell, but the status bar belongs to the tmux server and colours to a running nvim, so it could not retheme either. The one variable it set was read by nothing. Meanwhile it fired on every unlock, re-running.zshrcin every pane. Don’t bring it back.