Commit Graph
17 Commits
Author SHA1 Message Date
connor 621788cde1 Many things, but also restic script 2026-11-06 16:00:36 -05:00
connor b4ced1c649 opencode: track tui.json with attention notifications and sounds off 2026-11-02 10:43:45 -05:00
connor 275a5bfb2b opencode: two profiles, per-profile permissions, shared agent prompts
oc-work: local models only on the local key, edits and most commands ask,
loads instructions/work.md. oc-local (also oc, opencode): every model,
defaults to qwen3.8-flash-next-iq3s-med, edits and commands run except
destructive and outward-facing ones. On sctfw004 oc-local presents the work
key. personal.json and work-strict.json removed.

Agents: drop variant, which has no effect on LiteLLM models. dev takes its
permissions from the profile. The read-only agents deny redirects and the
write/exec flags of allowed commands, swap find for fd, and only allow
listing forms of git branch. review defaults to the uncommitted diff.

CLAUDE.md: add the comment, process and shell-tool rules from the laptop's
AGENTS.md, and note that OpenCode reads this file.
2026-11-02 10:34:38 -05:00
connor 0a42f1547f Several updates at once 2026-11-02 09:58:14 -05:00
Connor Johnstone aa9c1c786d Updates 2026-10-29 09:39:54 -04:00
connor 226ac906a2 Updates 2026-10-22 09:21:28 -04:00
Connor JohnstoneandClaude Opus 5.5 95dc6e146c sctfw004: link OrcaSlicer user presets into the flatpak config dir
The flatpak reads ~/.var/app/com.orcaslicer.OrcaSlicer/config/OrcaSlicer,
so the ~/.config/OrcaSlicer link was unused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 14:45:27 -04:00
connorandClaude Opus 5 89c6db1cfb opencode: link the guard config, and turn off native Plan Mode
Two things, one of them overdue.

1. ~/.config/opencode/opencode.json is now dotbot-linked on mainframe and
   sctfw004. It has lived in the repo since August while being linked
   NOWHERE -- each machine had a hand-placed copy and nothing checked they
   agreed, or that the Zen guard was there at all. That file is what stops a
   bare `opencode` falling back to built-in providers including OpenCode Zen,
   which is under a ToS block. An unverified guard is not a guard.

2. It carries `agent.plan.disable: true` and `permission.plan_enter: deny`.
   opencode's native Plan Mode was activating unbidden and taking sessions
   read-only with "Plan mode is active ... This supersedes any other
   instructions you have received."

⚠ (2) IS A PREFERENCE, NOT A FIX. Remove those two keys to restore Plan Mode.

⚠ This is NOT OMO, despite looking like it. OMO's agents carry only
description/model/tools -- there is no keyword or prompt-text trigger
anywhere in ~/.omo/omo.jsonc. `plan` is native to opencode. Verified:
`agent list` shows plan gone under the local profile, and plan_enter
resolving to deny on `build` under personal, where the OMO plugin re-adds
plan as a subagent.

⚠ Turning OMO off would NOT have fixed this and WOULD have broken the
default model. personal.json defaults to litellm/agent/atlas-glm-5.3, and
that alias does not exist in LiteLLM -- measured, it returns 400, while
local/librarian returns 200. The agent/* names live only in the opencode
config and the OMO plugin rewrites them at request time. Disabling OMO needs
`model`/`small_model` repointed in the same change. `"plugin": []` in the
base does not disable it either; the profile wins on that key.

Applies to mainframe and sctfw004 only -- system76 and nas link no opencode
config at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E9UH1zGZZtA9yhohmQrcT6
2026-09-21 22:13:40 -04:00
connor 9fc991a245 Stop tracking wallust output
The work laptop's first install left five files dirty, all of them wallust
targets. Tracking generated colour files means each machine rewrites the
others' palette on every theme change — exactly the churn a shared repo
should not have.

hypr, waybar and swaync now get their colours as real files written into
real directories, so nothing is linked and nothing is tracked. kitty and
qutebrowser land inside directories this repo links wholesale, so those two
are ignored by path instead. swaync switched from a directory link to two
file links to make room for its generated colors.css.

Regeneration is automatic: hypr_refresh runs every 15 seconds on both
laptops, so a fresh machine has colours within a quarter of a minute.
2026-09-14 15:18:50 -04:00
connor 7e95a41f33 Share hypr_refresh; capture the work laptop's own units
Both laptops run hypr_refresh and their unit files had diverged. The work
laptop's is the refined one — Type=oneshot, which is correct for a script
that exits, a 15s interval with AccuracySec, and a comment explaining the
wallpaper-daemon guard. system76 had Type=simple with Restart=on-failure,
which respawns a oneshot script continuously. Shared version wins.

Three more units existed only on the work laptop and were untracked:
backlight-probe, kanshi and mopidy.
2026-09-14 15:16:38 -04:00
connor a2dc43d665 Standardise across machines; add genuinely-customised app config
Two passes, both aimed at a consistent experience rather than a faithful
snapshot of each machine's accidents.

Standardisation. Audited every host-layer config present on more than one
machine and asked whether the difference was intent or drift:
  - mpv was byte-identical; swayimg differed only because system76 still
    had the shipped default and the work laptop had the real config; bob
    differed by one setting the work laptop was simply missing.
  - user-dirs.dirs disagreed with BOTH machines and with zshenv, which has
    said $HOME/downloads all along. Standardised on that.
  - mimeapps.list is now the union of both machines' associations.
  - swaync's config and style are shared; only wallust's generated
    colors.css stays per host, alongside hypr's and waybar's.
All of the above moved to common/.

Dropped as pure state rather than config: gtk-2.0 (file-chooser geometry),
pavucontrol.ini (window size), zoom.conf (a per-install random_key) and
zoomus.conf (panel widths). gtk-3.0 stays per host — its bookmarks encode
the two different home directories.

App config. GIMP, inkscape, FreeCAD, cura, OrcaSlicer, LightBurn and OBS
all hold real settings, so a curated subset of each is now tracked:
settings, keybindings and user content, but not session state, tool
options, device lists or window geometry. kicad is skipped — both library
tables hold a single entry, i.e. untouched defaults.

Content lives once in common/ even when only one machine has the app; the
host configs decide who gets the link. That is the distinction that lets
53% of link sources be shared while the NAS still does not get GIMP.

Two exclusions on credential grounds: obs-studio/plugin_config holds a
websocket server_password, and gh is dropped entirely because `gh auth
login` writes a token into hosts.yml — now also blocked by name.
2026-09-14 15:05:30 -04:00
connor 1f906acd80 Drop empty link sources; make install refuse them
Five directories swept in held no files — matplotlib, three gtk dirs and
one mpv. Git cannot represent an empty directory, so they existed on
mainframe where they were created but vanished on clone, and system76's
install failed with "Nonexistent target".

install now checks every link source exists before running dotbot, so this
surfaces on the machine that introduced it rather than the next one to
pull.
2026-09-14 14:55:07 -04:00
connor 29bcf615e6 Sweep every machine for config worth tracking
Reactive capture missed wallust entirely, so this is a systematic pass over
~/.config on all four machines: every entry that is not already a symlink,
judged on whether it is hand-authored config or app-generated state.

Shared and identical everywhere -> common/: lazygit, ncmpcpp, neofetch,
matplotlib. Everything else differs per machine and goes in
hosts/<host>/config/: gtk-2.0/3.0/4.0, mimeapps.list, user-dirs.dirs,
mpv, swaync, swayimg, bob, pavucontrol.ini, zoom; plus beets, bottom,
glow and mpd on system76; fastfetch, gh, uv, traggo, tiling-assistant and
xdg-desktop-portal on the work laptop; inbox-tidy and llmfit on mainframe.

Deliberately excluded, all verified to hold live credentials: the work
laptop's Claude OAuth tokens (~/.config/anthropic/credentials), the NAS
restic repo password and hetzner.env, subsonic passwords in subtui, stmp
and termsonic, mopidy, supersonic, the Proton bridge env and the LiteLLM
virtual keys. The ignore list now names those shapes directly — a bare
`password` file would not have been caught before.

Also excluded as generated state or too large to be meaningful: GIMP,
kicad, BambuStudio, OrcaSlicer, calibre, LightBurn, obs-studio, feishin,
libreoffice, VirtualBox, FortiClient; and mainframe's dead X11-era
leftovers (i3, openbox, lxpanel, lxsession, pcmanfm).
2026-09-14 14:54:17 -04:00
connor 42c4277ceb Split ssh config into common plus a host layer
Putting the whole ssh config in common/ was wrong twice over. It mapped
git.rcjohnstone.com to localhost:2222, which is only true on mainframe
where Gitea runs -- on system76 it broke git entirely. And it replaced a
77-line file holding 13 personal host aliases (storagebox, several
forwarded localhost ports, older work hosts) with a five-entry fleet list.

common/ssh/config now Includes ~/.ssh/config.local first, so host entries
win on the first-value-obtained rule, and carries only the fleet aliases.
Each host keeps its own list; system76's is restored verbatim.
2026-09-14 14:44:04 -04:00
connor b25415d1a2 Track wallust; retire the sway-era colour pipeline
The laptops are themed by wallust, whose config and five templates lived
only in ~/.config/wallust on each machine. A fresh install would have had
no colours at all: hyprland.conf sources colors.conf on its first line and
waybar's style.css imports colors.css on its first line, and nothing in
the repo generated either. Both generated files are now linked per host so
bootstrap works, and wallust writes back through the symlinks.

update_colors.sh was its predecessor and is now actively harmful: it
writes sway/config and wofi/style.css, neither of which exists on any
machine any more, and it regenerates waybar/style.css from a template that
was never carried across -- so running it would have overwritten the
shared Hyprland waybar style with sway-era output.

common/colors (255 theme files, 1.1 MB) was only ever its input.
2026-09-14 14:42:53 -04:00
connor 229b4bce6f Fix two bugs the mainframe cutover surfaced
dotbot does not carry a `defaults` block between config files, so the
host configs ran without force/relink and refused to replace paths that
already existed as real files — the opencode profiles, the Claude files,
the sunshine config and the old systemd units all failed to link. Each
host config now restates the block.

ddns.timer used OnCalendar=*-*-*/2, which systemd rejects: a day-of-month
step needs an explicit start value. The retired cron line was
`0 2 */2 * *`, so the correct spelling is *-*-1/2.
2026-09-14 14:33:05 -04:00
connor e6644d0616 Rebuild dotfiles as one branch with per-host layers
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).
2026-09-14 14:24:37 -04:00