- Symlink dotfiles/claude/CLAUDE.md -> ../agents/AGENTS.md - Move global skills to dotfiles/agents/skills/ as canonical location (hackage-release, org-agenda-api-production, release) - Add new taffybar-ecosystem-release skill documenting the taffybar package dependency graph and release propagation workflow - ~/.claude/skills/ entries are now symlinks to canonical locations - email-cleanup and weekly-scheduling moved to ~/org/agents/skills/ - Removed stale debug-video-processing symlink Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
4.9 KiB
name, description
| name | description |
|---|---|
| taffybar-ecosystem-release | Use when releasing, version-bumping, or propagating changes across taffybar GitHub org packages (taffybar, gtk-sni-tray, gtk-strut, status-notifier-item, dbus-menu, dbus-hslogger) |
Taffybar Ecosystem Release
Release and propagate changes across the taffybar Haskell package ecosystem.
Package Dependency Graph
imalison-taffybar (user config — ~/.config/taffybar/)
└── taffybar (main library — ~/.config/taffybar/taffybar/)
├── gtk-sni-tray
│ ├── dbus-menu
│ ├── gtk-strut
│ └── status-notifier-item
├── dbus-menu
├── gtk-strut
├── status-notifier-item
└── dbus-hslogger
Leaf packages (no ecosystem deps): gtk-strut, status-notifier-item, dbus-hslogger, dbus-menu
Mid-level: gtk-sni-tray (depends on dbus-menu, gtk-strut, status-notifier-item)
Top-level lib: taffybar (depends on all above)
User config: imalison-taffybar (depends on taffybar + gtk-sni-tray + gtk-strut)
Repositories & Local Checkouts
| Package | GitHub | Local Checkout |
|---|---|---|
| taffybar | taffybar/taffybar | ~/.config/taffybar/taffybar/ |
| gtk-sni-tray | taffybar/gtk-sni-tray | ~/Projects/gtk-sni-tray/ |
| gtk-strut | taffybar/gtk-strut | ~/Projects/gtk-strut/ |
| status-notifier-item | taffybar/status-notifier-item | ~/Projects/status-notifier-item/ |
| dbus-menu | taffybar/dbus-menu | ~/Projects/dbus-menu/ |
| dbus-hslogger | IvanMalison/dbus-hslogger | ~/Projects/dbus-hslogger/ |
| imalison-taffybar | (dotfiles repo) | ~/.config/taffybar/ |
Release Order (Bottom-Up)
Always release leaf packages first, then dependents. Changes propagate upward.
1. Release the Changed Leaf Package
Use the hackage-release skill for the Hackage publish workflow. In the local checkout (~/Projects/<pkg>/):
- Bump version in
.cabalfile (PVP: A.B.C.D) - Update ChangeLog.md
cabal build && cabal checkcabal sdist- Commit, tag
vX.Y.Z.W, push with tags - Publish to Hackage (see hackage-release skill for credentials)
- Publish docs
2. Update Dependents' Version Bounds
For each package that depends on the one you just released, update the dependency bound in its .cabal file. For example, if you bumped gtk-strut to 0.1.5.0:
- In
gtk-sni-tray.cabal: updategtk-strut >= 0.1.5 && < 0.2 - In
taffybar.cabal: updategtk-strut >= 0.1.5 && < 0.2
Then release those packages if needed (repeat from step 1).
3. Update Nix Flake Inputs
After pushing changes to GitHub, update flake.lock files that reference the changed packages:
taffybar's flake (~/.config/taffybar/taffybar/):
cd ~/.config/taffybar/taffybar
nix flake update gtk-strut # or whichever input changed
imalison-taffybar's flake (~/.config/taffybar/):
cd ~/.config/taffybar
nix flake update gtk-strut # update the direct input
nix flake update taffybar # if taffybar itself changed
4. Rebuild and Test
cd ~/.config/taffybar
nix develop --command cabal build
Or for a full NixOS rebuild:
cd ~/dotfiles/nixos && just switch
Flake Input Architecture
taffybar's flake.nix pulls all ecosystem deps as flake = false inputs from GitHub and builds them via callCabal2nix through a Nix overlay system.
imalison-taffybar's flake.nix re-declares the same inputs as proper flake inputs (where available) and uses inputs.X.follows to ensure taffybar uses the same versions:
gtk-sni-tray.inputs.gtk-strut.follows = "gtk-strut"
gtk-sni-tray.inputs.status-notifier-item.follows = "status-notifier-item"
gtk-sni-tray.inputs.dbus-menu.follows = "dbus-menu"
taffybar.inputs.gtk-sni-tray.follows = "gtk-sni-tray"
...
This means updating a leaf input in the imalison config flake automatically threads it through to taffybar and gtk-sni-tray.
Common Scenarios
Changed a leaf package (e.g. status-notifier-item)
- Make changes in
~/Projects/status-notifier-item/ - Release to Hackage if publishing
- Push to GitHub
cd ~/.config/taffybar && nix flake update status-notifier-item- Rebuild
Changed taffybar itself
- Make changes in
~/.config/taffybar/taffybar/ - Push to GitHub (or just rebuild — imalison config uses
path:input) cd ~/.config/taffybar && nix flake update taffybar- Rebuild
Changed gtk-sni-tray (mid-level)
- Make changes in
~/Projects/gtk-sni-tray/ - If a leaf dep also changed, update bounds in
gtk-sni-tray.cabal - Push to GitHub
cd ~/.config/taffybar && nix flake update gtk-sni-tray- Rebuild
Full ecosystem release (all packages)
Release in this exact order:
gtk-strut,status-notifier-item,dbus-hslogger,dbus-menu(leaves, parallel OK)gtk-sni-tray(update bounds for any leaf changes first)taffybar(update bounds for all changes)- Update all flake inputs in imalison config
- Rebuild