Compare commits

...

8 Commits

Author SHA1 Message Date
03f169284d feat(flake): add nixpkgs-qt input for qt5webengine packages
Add separate nixpkgs input for qt5webengine-dependent packages like
jellyfin-media-player. This input updates on a separate Renovate
schedule from main nixpkgs to avoid massive qt5webengine rebuilds
when updating other packages.

- Add nixpkgs-qt input pinned to nixos-25.11
- Create pkgs.qt-pinned overlay namespace

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 14:35:35 -08:00
8908500073 feat(home-kodi): enable kdeconnect for kodi user on boxy
All checks were successful
CI / check (push) Successful in 3m26s
Allows KDE Connect discovery and pairing to work when logged in as
the kodi user on the media center.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 13:43:17 -08:00
87f6d5c759 feat(deps): update beads to 0.49.1 with dolt server mode, claude-code to 2.1.30
All checks were successful
CI / check (push) Successful in 5m17s
beads:
- Pin to commit 93965b4a (last before Go 1.25.6 requirement)
- Build locally with corrected vendorHash (upstream default.nix is stale)
- Enables dolt server mode support (gt-1mf.3)

claude-code: 2.1.19 → 2.1.30

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:56:24 -08:00
a851c2551c fix(deps): update gastown patch and pin beads to Go 1.24 compatible version
All checks were successful
CI / check (push) Successful in 5m25s
- Update gastown-fix-agent-bead-address-title.patch line numbers (326→315)
  for current upstream gastown source
- Remove obsolete gastown patches (rig-prefix, copydir-symlinks) that are
  now handled upstream
- Pin beads to 55e733c (v0.47.2) which uses Go 1.24.0 - newer versions
  require Go 1.25.6 which isn't in nixpkgs-unstable yet
- Remove beads-search-query-optimization.patch as it targets newer code

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 13:18:46 -08:00
mayor
6cf63e86c1 Merge branch 'polecat/rust/x-0cf@ml2ye219': fix doom-intermediates.drv CI failure
All checks were successful
CI / check (push) Successful in 7m37s
Updated nix-doom-emacs-unstraightened flake input to fix stale IFD derivation.

Closes: x-0cf, x-qwd7, hq-cv-mnzq4
2026-01-31 15:50:43 -08:00
c3ed6c0a26 fix(deps): update nix-doom-emacs-unstraightened to fix live-usb flake check
Updates nix-doom-emacs-unstraightened from Jan 25 to Jan 31 release,
which fixes the stale doom-intermediates.drv reference that was causing
nixosConfigurations.live-usb to fail flake check.

Closes: x-0cf

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 15:48:34 -08:00
mayor
53fa89b2e9 Merge branch 'polecat/rust/hq-0h1p9m@ml2ugjq1': fix gastown statusline patch
All checks were successful
CI / check (push) Successful in 5m19s
Regenerated patch with correct hunk headers against locked rev 177094a2.
Root cause was malformed patch format, not a flake.lock issue.

Closes: hq-0h1p9m, x-bwld
2026-01-31 14:01:06 -08:00
3acf9d2796 fix(gastown): regenerate statusline optimization patch with correct line numbers
The patch file had malformed hunk headers with incorrect line numbers
and counts, causing it to fail to apply against the locked gastown rev
(177094a2). This was NOT a flake.lock issue - gastown source was properly
locked.

Changes:
- Regenerated patch from scratch against locked gastown revision
- Re-enabled the patch in default.nix (was commented out with TODO)
- Updated comment to accurately describe the optimization

The optimization skips expensive beads queries for detached tmux sessions
and caches status line output with a 10-second TTL, reducing Dolt CPU
usage from ~70% to ~20%.

Closes: hq-0h1p9m

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 13:59:11 -08:00
7 changed files with 83 additions and 53 deletions

42
flake.lock generated
View File

@@ -8,16 +8,17 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1769405733, "lastModified": 1769840331,
"narHash": "sha256-WpROnW0dRi5ub0SlpKrMBs3pYlSBY4xw22hnTNvBMgI=", "narHash": "sha256-Yp0K4JoXX8EcHp1juH4OZ7dcCmkopDu4VvAgZEOxgL8=",
"owner": "steveyegge", "owner": "steveyegge",
"repo": "beads", "repo": "beads",
"rev": "6e82d1e2eea121ce5dc0964d554879f8b0c08563", "rev": "93965b4abeed920a4701e03571d1b6bb75810722",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "steveyegge", "owner": "steveyegge",
"repo": "beads", "repo": "beads",
"rev": "93965b4abeed920a4701e03571d1b6bb75810722",
"type": "github" "type": "github"
} }
}, },
@@ -47,11 +48,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1769329593, "lastModified": 1769848312,
"narHash": "sha256-u5PSA+8TUYF/13ziBcnoE67nkDwpjAdecKh3srcJJm0=", "narHash": "sha256-ggBocPd1L4l5MFNV0Fw9aSGZZO4aGzCfgh4e6hQ77RE=",
"owner": "nix-community", "owner": "nix-community",
"repo": "emacs-overlay", "repo": "emacs-overlay",
"rev": "776dc33d735af583a14cc56b406ea658398964a7", "rev": "be0b4f4f28f69be61e9174807250e3235ee11d50",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -81,11 +82,11 @@
"gastown": { "gastown": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1769538736, "lastModified": 1770098007,
"narHash": "sha256-A33gyS/ERUCFcaFG9PJdIHfIOafguqkRe+DuIZteH5s=", "narHash": "sha256-CFlN57BXlR5FobTChdE2GgdIGx4xJcFFCk1E5Q98cSQ=",
"owner": "steveyegge", "owner": "steveyegge",
"repo": "gastown", "repo": "gastown",
"rev": "177094a2335786d1d450fd9e14b935877291c004", "rev": "13461161063bf7b2365fe5fd4df88e32c3ba2a28",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -206,11 +207,11 @@
"systems": "systems_2" "systems": "systems_2"
}, },
"locked": { "locked": {
"lastModified": 1769330679, "lastModified": 1769849328,
"narHash": "sha256-X7rw5ouiAYKmbbKLtkEc/Kqcg6DxKgOtgaftzuchy/M=", "narHash": "sha256-BjH1Ge6O8ObN6Z97un2U87pl4POO99Q8RSsgIuTZq8Q=",
"owner": "marienz", "owner": "marienz",
"repo": "nix-doom-emacs-unstraightened", "repo": "nix-doom-emacs-unstraightened",
"rev": "0c2d527055f448c8856129c6d063535e06aeff4d", "rev": "fc1d7190c49558cdc6af20d7657075943a500a93",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -257,6 +258,22 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs-qt": {
"locked": {
"lastModified": 1770464364,
"narHash": "sha256-z5NJPSBwsLf/OfD8WTmh79tlSU8XgIbwmk6qB1/TFzY=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "23d72dabcb3b12469f57b37170fcbc1789bd7457",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-unstable": { "nixpkgs-unstable": {
"locked": { "locked": {
"lastModified": 1769170682, "lastModified": 1769170682,
@@ -346,6 +363,7 @@
"nix-darwin": "nix-darwin", "nix-darwin": "nix-darwin",
"nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened", "nix-doom-emacs-unstraightened": "nix-doom-emacs-unstraightened",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
"nixpkgs-qt": "nixpkgs-qt",
"nixpkgs-unstable": "nixpkgs-unstable", "nixpkgs-unstable": "nixpkgs-unstable",
"perles": "perles", "perles": "perles",
"plasma-manager": "plasma-manager", "plasma-manager": "plasma-manager",

View File

@@ -4,6 +4,9 @@
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11"; nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable"; nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
# Separate nixpkgs for qt5webengine-dependent packages (jellyfin-media-player, etc.)
# Updates on separate Renovate schedule to avoid massive qt rebuilds
nixpkgs-qt.url = "github:nixos/nixpkgs/nixos-25.11";
nix-darwin = { nix-darwin = {
url = "github:nix-darwin/nix-darwin/nix-darwin-25.11"; url = "github:nix-darwin/nix-darwin/nix-darwin-25.11";
@@ -43,7 +46,9 @@
}; };
beads = { beads = {
url = "github:steveyegge/beads"; # v0.49.1 has dolt server mode support (gt-1mf.3)
# Pinned to 259ddd92 - uses Go 1.24 compatible with nixpkgs
url = "github:steveyegge/beads/93965b4abeed920a4701e03571d1b6bb75810722";
inputs.nixpkgs.follows = "nixpkgs-unstable"; inputs.nixpkgs.follows = "nixpkgs-unstable";
}; };
@@ -74,6 +79,11 @@
config.allowUnfree = true; config.allowUnfree = true;
overlays = unstableOverlays; overlays = unstableOverlays;
}; };
# Separate nixpkgs for qt5webengine-heavy packages to avoid rebuild churn
qt-pinned = import inputs.nixpkgs-qt {
system = prev.stdenv.hostPlatform.system;
config.allowUnfree = true;
};
custom = prev.callPackage ./packages {}; custom = prev.callPackage ./packages {};
# Compatibility: bitwarden renamed to bitwarden-desktop in unstable # Compatibility: bitwarden renamed to bitwarden-desktop in unstable
bitwarden-desktop = prev.bitwarden-desktop or prev.bitwarden; bitwarden-desktop = prev.bitwarden-desktop or prev.bitwarden;

View File

@@ -12,6 +12,7 @@
home.roles = { home.roles = {
base.enable = true; base.enable = true;
plasma-manager-kodi.enable = true; plasma-manager-kodi.enable = true;
kdeconnect.enable = true;
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [

View File

@@ -5,20 +5,25 @@ with lib;
let let
cfg = config.home.roles.development; cfg = config.home.roles.development;
# FIXME: Temporary override for upstream beads vendorHash mismatch # Build beads from flake input with corrected vendorHash
# Remove after upstream fix: https://github.com/steveyegge/beads/issues/XXX # The upstream default.nix has stale vendorHash for commits with server mode
beadsPackage = globalInputs.beads.packages.${system}.default.overrideAttrs (old: { beadsRev = builtins.substring 0 8 (globalInputs.beads.rev or "unknown");
vendorHash = "sha256-YU+bRLVlWtHzJ1QPzcKJ70f+ynp8lMoIeFlm+29BNPE="; beadsPackage = pkgs.buildGoModule {
pname = "beads";
# Performance fix: avoid WHERE IN (8000+ IDs) query pattern that hammers Dolt CPU version = "0.49.1-${beadsRev}";
# See: hq-ihwsj - bd list uses inefficient WHERE IN (all_ids) query pattern src = globalInputs.beads;
# The fix changes SearchIssues to SELECT all columns directly instead of: subPackages = [ "cmd/bd" ];
# 1. SELECT id FROM issues WHERE ... -> collect IDs doCheck = false;
# 2. SELECT * FROM issues WHERE id IN (all_ids) -> 8000+ placeholder IN clause # Regenerated vendorHash for commit 93965b4a (has dolt server mode, Go 1.24)
patches = (old.patches or []) ++ [ vendorHash = "sha256-gwxGv8y4+1+k0741CnOYcyJPTJ5vTrynqPoO8YS9fbQ=";
./beads-search-query-optimization.patch nativeBuildInputs = [ pkgs.git ];
]; meta = with lib; {
}); description = "beads (bd) - An issue tracker designed for AI-supervised coding workflows";
homepage = "https://github.com/steveyegge/beads";
license = licenses.mit;
mainProgram = "bd";
};
};
# Gastown - multi-agent workspace manager (no upstream flake.nix yet) # Gastown - multi-agent workspace manager (no upstream flake.nix yet)
# Source is tracked via flake input for renovate updates # Source is tracked via flake input for renovate updates
@@ -47,17 +52,13 @@ let
./gastown-fix-validate-recipient.patch ./gastown-fix-validate-recipient.patch
# Fix agentBeadToAddress to use title field for hq- prefixed beads # Fix agentBeadToAddress to use title field for hq- prefixed beads
./gastown-fix-agent-bead-address-title.patch ./gastown-fix-agent-bead-address-title.patch
# Fix agentBeadToAddress to handle rig-specific prefixes (j-, sc-, etc.)
./gastown-fix-agent-bead-rig-prefix.patch
# Fix crew/polecat home paths: remove incorrect /rig suffix # Fix crew/polecat home paths: remove incorrect /rig suffix
./gastown-fix-role-home-paths.patch ./gastown-fix-role-home-paths.patch
# Fix town root detection: don't map to Mayor (causes spurious mismatch warnings) # Fix town root detection: don't map to Mayor (causes spurious mismatch warnings)
./gastown-fix-town-root-detection.patch ./gastown-fix-town-root-detection.patch
# Fix copyDir to handle symlinks (broken symlinks cause "no such file" errors) # Statusline optimization: skip expensive beads queries for detached sessions
./gastown-fix-copydir-symlinks.patch # Reduces Dolt CPU from ~70% to ~20% by caching and early-exit
# TODO: Statusline optimization patch needs regenerating against current gastown source ./gastown-statusline-optimization.patch
# Reduces Dolt CPU from ~70% to ~20% by avoiding beads queries for sessions nobody is watching
# ./gastown-statusline-optimization.patch
]; ];
meta = with lib; { meta = with lib; {

View File

@@ -1,15 +1,15 @@
diff --git a/internal/mail/router.go b/internal/mail/router.go diff --git a/internal/mail/router.go b/internal/mail/router.go
--- a/internal/mail/router.go --- a/internal/mail/router.go
+++ b/internal/mail/router.go +++ b/internal/mail/router.go
@@ -326,7 +326,10 @@ func agentBeadToAddress(bead *agentBead) string { @@ -315,7 +315,10 @@ func agentBeadToAddress(bead *agentBead) string {
} }
// Fall back to parsing description for role_type and rig // For other hq- agents, fall back to description parsing
- return parseAgentAddressFromDescription(bead.Description) - return parseAgentAddressFromDescription(bead.Description)
+ if bead.Title != "" && strings.Contains(bead.Title, "/") { + if bead.Title != "" && strings.Contains(bead.Title, "/") {
+ return bead.Title + return bead.Title
+ } + }
+ return parseAgentAddressFromDescription(bead.Description) + return parseAgentAddressFromDescription(bead.Description)
} }
// Handle gt- prefixed IDs (legacy format) // Handle gt- prefixed IDs (legacy format)

View File

@@ -1,8 +1,8 @@
diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
index 2edf1be8..00253eea 100644
--- a/internal/cmd/statusline.go --- a/internal/cmd/statusline.go
+++ b/internal/cmd/statusline.go +++ b/internal/cmd/statusline.go
@@ -6,6 +6,7 @@ import ( @@ -6,6 +6,7 @@ import (
"os"
"path/filepath" "path/filepath"
"sort" "sort"
"strings" "strings"
@@ -10,10 +10,10 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/steveyegge/gastown/internal/beads" "github.com/steveyegge/gastown/internal/beads"
@@ -15,6 +16,43 @@ import ( @@ -14,6 +15,37 @@ import (
"github.com/steveyegge/gastown/internal/tmux"
"github.com/steveyegge/gastown/internal/workspace" "github.com/steveyegge/gastown/internal/workspace"
) )
+// statusLineCacheTTL is how long cached status output remains valid. +// statusLineCacheTTL is how long cached status output remains valid.
+const statusLineCacheTTL = 10 * time.Second +const statusLineCacheTTL = 10 * time.Second
+ +
@@ -45,10 +45,10 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
+ _ = os.WriteFile(path, []byte(status), 0644) + _ = os.WriteFile(path, []byte(status), 0644)
+} +}
+ +
var ( var (
statusLineSession string statusLineSession string
) @@ -34,6 +66,19 @@ func init() {
@@ -32,6 +70,20 @@ func init() {
func runStatusLine(cmd *cobra.Command, args []string) error { func runStatusLine(cmd *cobra.Command, args []string) error {
t := tmux.NewTmux() t := tmux.NewTmux()
@@ -68,7 +68,7 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
// Get session environment // Get session environment
var rigName, polecat, crew, issue, role string var rigName, polecat, crew, issue, role string
@@ -149,7 +201,12 @@ func runWorkerStatusLine(t *tmux.Tmux, session, rigName, polecat, crew, issue st @@ -150,7 +195,11 @@ func runWorkerStatusLine(t *tmux.Tmux, session, rigName, polecat, crew, issue st
// Output // Output
if len(parts) > 0 { if len(parts) > 0 {
@@ -81,7 +81,7 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
} }
return nil return nil
@@ -389,7 +446,12 @@ func runMayorStatusLine(t *tmux.Tmux) error { @@ -389,7 +438,11 @@ func runMayorStatusLine(t *tmux.Tmux) error {
} }
} }
@@ -94,7 +94,7 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
return nil return nil
} }
@@ -458,7 +520,12 @@ func runDeaconStatusLine(t *tmux.Tmux) error { @@ -458,7 +511,11 @@ func runDeaconStatusLine(t *tmux.Tmux) error {
} }
} }
@@ -107,7 +107,7 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
return nil return nil
} }
@@ -526,7 +593,12 @@ func runWitnessStatusLine(t *tmux.Tmux, rigName string) error { @@ -526,7 +583,11 @@ func runWitnessStatusLine(t *tmux.Tmux, rigName string) error {
} }
} }
@@ -120,7 +120,7 @@ diff --git a/internal/cmd/statusline.go b/internal/cmd/statusline.go
return nil return nil
} }
@@ -617,7 +689,12 @@ func runRefineryStatusLine(t *tmux.Tmux, rigName string) error { @@ -617,7 +678,11 @@ func runRefineryStatusLine(t *tmux.Tmux, rigName string) error {
} }
} }

View File

@@ -6,24 +6,24 @@
}: }:
let let
version = "2.1.19"; version = "2.1.30";
srcs = { srcs = {
aarch64-darwin = { aarch64-darwin = {
url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/darwin-arm64/claude"; url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/darwin-arm64/claude";
sha256 = "d386ac8f6d1479f85d31f369421c824135c10249c32087017d05a5f428852c41"; sha256 = "3ccc14f322b1e8da0cd58afc254fd5100eee066fa14729f30745e67a3f7979f7";
}; };
x86_64-darwin = { x86_64-darwin = {
url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/darwin-x64/claude"; url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/darwin-x64/claude";
sha256 = "be266b3a952f483d8358ad141e2afe661170386506f479ead992319e4fdc38ac"; sha256 = "8a083696006483b8382ec0e47cd8f2e3223f3d2cab1a21c524fa08c082b5600e";
}; };
x86_64-linux = { x86_64-linux = {
url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/linux-x64/claude"; url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/linux-x64/claude";
sha256 = "4e2a1c73871ecf3b133376b57ded03333a7a6387f2d2a3a6279bb90a07f7a944"; sha256 = "ada8f1cf9272965d38b10f1adb6cea885e621c83f7e7bb233008c721f43fad54";
}; };
aarch64-linux = { aarch64-linux = {
url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/linux-arm64/claude"; url = "https://storage.googleapis.com/claude-code-dist-86c565f3-f756-42ad-8dfa-d59b1c096819/claude-code-releases/${version}/linux-arm64/claude";
sha256 = "8c4b61b24ca760d6f7aa2f19727163d122e9fd0c3ce91f106a21b6918a7b1bbb"; sha256 = "45fbf35a1011b06f86170b20beb64c599db0658aac70e2de2410c45d15775596";
}; };
}; };