15 Commits

Author SHA1 Message Date
Miguel Palhas 3eb0a098a2 chore: ignore worktree dirs
CI / lint (push) Successful in 29s
CI / eval (push) Successful in 1m54s
2026-08-19 22:40:04 +01:00
Miguel Palhas 77d8803a8f refactor: scope workstation apps 2026-08-19 22:38:19 +01:00
Miguel Palhas ba5b618e49 refactor(yolo): take the agent-skills units from their own module
CI / lint (push) Successful in 30s
CI / eval (push) Successful in 1m57s
pr-daemon, hourlog and week-review are defined by the agent-skills
home-manager module now, next to the scripts they run; this host just
enables them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 22:20:44 +01:00
Miguel Palhas 7580edb82c fix(pr-daemon): pin TMUX_TMPDIR to the runtime dir
CI / lint (push) Successful in 30s
CI / eval (push) Successful in 1m53s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 19:06:33 +01:00
Miguel Palhas 88abb49340 fix(pr-daemon): KillMode=process
CI / lint (push) Successful in 30s
CI / eval (push) Successful in 1m53s
Agent tmux sessions the daemon starts live in its cgroup; a restart was
killing every session it had created.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 19:03:51 +01:00
Miguel Palhas 9c536f87f6 Merge branch 'pr-daemon'
CI / lint (push) Successful in 30s
CI / eval (push) Successful in 1m52s
2026-08-19 18:54:33 +01:00
Miguel Palhas 88915d9cfd feat(hyprland): restore media-key OSD with swayosd
CI / lint (push) Successful in 29s
CI / eval (push) Successful in 1m53s
The XF86 binds survived the noctalia -> eww switch, but the popup they
drew did not, so volume and brightness changed with no feedback. swayosd
replaces it: swayosd-client both applies the change and draws the OSD.

Also fixes two binds that pointed at binaries no host installs any more:
XF86AudioMicMute called volumectl (avizo, removed) and the brightness
keys called brightnessctl, which only arrakis has.

Commands are referenced by store path because Hyprland execs binds with
the PATH the session was started with.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 18:35:27 +01:00
Miguel Palhas 94e24f9277 feat(yolo): run the PR daemon as a user service
Watches GitHub and Gitea PRs and routes them to aoe sessions. Lives here
rather than in agent-skills' nix module for the same reason the timers
do: it belongs to one box.

Config and tokens are outside the store, so the unit refuses to start
without them.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 18:30:56 +01:00
Miguel Palhas 51c852b5ef chore: bump claude-code to 2.1.235
CI / lint (push) Successful in 29s
CI / eval (push) Successful in 1m51s
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 16:46:09 +01:00
Miguel Palhas 54fc3e317b refactor(sddm): replace noctalia theme with sddm-astronaut
CI / lint (push) Successful in 30s
CI / eval (push) Successful in 1m53s
Noctalia shell is no longer used; the only consumer left was the
SDDM login theme.
2026-08-19 16:11:11 +01:00
Miguel Palhas 81b9cbde44 Merge branch 'update'
CI / lint (push) Successful in 29s
CI / eval (push) Successful in 1m50s
2026-08-19 15:16:03 +01:00
Miguel Palhas 60f93e604f Merge branch 'tatars' 2026-08-19 15:15:18 +01:00
Miguel Palhas ced70ee3e3 chore: bump the agent-skills pin for pi + opencode coverage 2026-08-19 15:14:43 +01:00
Miguel Palhas 5ba12d3684 refactor: move pi's AGENTS.md concat into the agent-skills module
All four tools' context wiring lives there now; this file just installs
the package.
2026-08-19 15:14:43 +01:00
Miguel Palhas 231b6bdb28 refactor: get opencode rules and shared commands from agent-skills
opencode has no @file imports, so the shared home-manager module
concatenates the claude-md fragments into .config/opencode/AGENTS.md
(the screenshots line moved there as a fragment) and links commands/
into place. Keeps only the opencode-specific agents, commands and
skills here.
2026-08-19 15:14:43 +01:00
25 changed files with 186 additions and 373 deletions
Generated
+19 -37
View File
@@ -23,11 +23,11 @@
},
"agent-skills": {
"locked": {
"lastModified": 1787148831,
"narHash": "sha256-OGVxFCa4nkWJwieNVD0qxKedf22Bi2snCTXhsFv2m5s=",
"lastModified": 1787174393,
"narHash": "sha256-nMxPQbVaK9cdsidGP78VOxUKTAHRKHGQEzkRbKxuivY=",
"ref": "refs/heads/main",
"rev": "6f057568704059bed1d25f21fcc35021df9611b1",
"revCount": 52,
"rev": "465b20a7c64c84c645acbd94548c36c36decbfe4",
"revCount": 66,
"type": "git",
"url": "https://git.naps.pt/yolo/agent-skills.git"
},
@@ -71,15 +71,15 @@
},
"claude-code": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs_2"
"nixpkgs": "nixpkgs_2",
"systems": "systems"
},
"locked": {
"lastModified": 1785285785,
"narHash": "sha256-r1cMlvXjRVKe+uQ/GKwy4TpionpmbNgksFP2758D/MM=",
"lastModified": 1787087042,
"narHash": "sha256-xt4hV5if4WpNCfwtT0RW3oze/bJ534LUR0KLOw2cbNE=",
"owner": "sadjow",
"repo": "claude-code-nix",
"rev": "da78262708d858861afbe1f68ea65fedda4054c4",
"rev": "3d6821aaa0a0a06cc4b60dcd00d05756de68ba50",
"type": "github"
},
"original": {
@@ -90,7 +90,7 @@
},
"codex-cli": {
"inputs": {
"flake-utils": "flake-utils_2",
"flake-utils": "flake-utils",
"nixpkgs": [
"nixpkgs"
]
@@ -112,7 +112,7 @@
},
"codex-desktop-linux": {
"inputs": {
"flake-utils": "flake-utils_3",
"flake-utils": "flake-utils_2",
"nixpkgs": [
"nixpkgs"
]
@@ -221,7 +221,7 @@
},
"flake-utils": {
"inputs": {
"systems": "systems"
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
@@ -238,24 +238,6 @@
}
},
"flake-utils_2": {
"inputs": {
"systems": "systems_2"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_3": {
"inputs": {
"systems": "systems_3"
},
@@ -273,7 +255,7 @@
"type": "github"
}
},
"flake-utils_4": {
"flake-utils_3": {
"locked": {
"lastModified": 1644229661,
"narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=",
@@ -288,7 +270,7 @@
"type": "github"
}
},
"flake-utils_5": {
"flake-utils_4": {
"inputs": {
"systems": "systems_8"
},
@@ -308,7 +290,7 @@
},
"foundry": {
"inputs": {
"flake-utils": "flake-utils_4",
"flake-utils": "flake-utils_3",
"nixpkgs": [
"nixpkgs"
]
@@ -800,11 +782,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1784783405,
"narHash": "sha256-4IHyyLgLBdKefkljdKod4IMn023pQiDXAWJA187cmdY=",
"lastModified": 1787052956,
"narHash": "sha256-fZt7Au28AduGpt7vRfIOcpsHKJ+9cEnuQ2NdWuh0KVc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "7525d999cd850b9a488817abc89c75dc733acf17",
"rev": "b47ad65d73ab65ded9ab408fe558866d71defee8",
"type": "github"
},
"original": {
@@ -1055,7 +1037,7 @@
"sem": {
"inputs": {
"flake-parts": "flake-parts_2",
"flake-utils": "flake-utils_5",
"flake-utils": "flake-utils_4",
"nixpkgs": "nixpkgs_7",
"rust-overlay": "rust-overlay"
},
+4
View File
@@ -5,6 +5,10 @@
imports = [
../common/programs/default.nix
../common/programs/desktop
../common/programs/workstation-apps.nix
../common/programs/editors.nix
../common/programs/dev-workstation.nix
../common/programs/ai-gui.nix
../common/programs/zen-browser.nix
../common/programs/hyprland
../common/programs/kitty
+29
View File
@@ -0,0 +1,29 @@
{
config,
pkgs,
inputs,
lib,
...
}:
let
claude-desktop = pkgs.callPackage ../../../pkgs/claude-desktop/package.nix {
inherit (config.custom.aiApps) deviceScaleFactor;
};
codex-cli = inputs.codex-cli.packages.${pkgs.stdenv.hostPlatform.system}.default;
t3-code = pkgs.callPackage ../../../pkgs/t3-code/package.nix {
inherit (config.custom.aiApps) deviceScaleFactor;
};
in
{
imports = [ inputs.codex-desktop-linux.homeManagerModules.default ];
home.packages = lib.optionals pkgs.stdenv.hostPlatform.isx86_64 [
claude-desktop
t3-code
];
programs.codexDesktopLinux = {
enable = true;
cliPackage = codex-cli;
};
}
+11 -26
View File
@@ -1,16 +1,9 @@
{
config,
pkgs,
inputs,
lib,
...
}:
let
# Official Anthropic Claude desktop app (Linux build, x86_64 only).
claude-desktop = pkgs.callPackage ../../../../pkgs/claude-desktop/package.nix {
inherit (config.custom.aiApps) deviceScaleFactor;
};
in
{
imports = [
inputs.agent-skills.homeModules.default
@@ -27,23 +20,20 @@ in
};
config.home = {
packages =
with pkgs;
[
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
packages = with pkgs; [
inputs.claude-code.packages.${pkgs.stdenv.hostPlatform.system}.default
# sandbox
bubblewrap
socat
libseccomp
# sandbox
bubblewrap
socat
libseccomp
# voice
sox
# voice
sox
# beads
dolt
]
++ lib.optional pkgs.stdenv.hostPlatform.isx86_64 claude-desktop;
# beads
dolt
];
file = {
".default-npm-packages".text = ''
@@ -51,11 +41,6 @@ in
@beads/bd
'';
".claude/statusline.sh" = {
source = ./statusline.sh;
executable = true;
-9
View File
@@ -7,14 +7,5 @@ let
codex-cli = inputs.codex-cli.packages.${pkgs.stdenv.hostPlatform.system}.default;
in
{
imports = [ inputs.codex-desktop-linux.homeManagerModules.default ];
# cliPackage only tells the desktop app where to find codex; it does not put
# it on PATH, so the cli needs installing separately.
home.packages = [ codex-cli ];
programs.codexDesktopLinux = {
enable = true;
cliPackage = codex-cli;
};
}
-6
View File
@@ -1,6 +1,5 @@
{
lib,
pkgs,
config,
...
}:
@@ -10,7 +9,6 @@
./zsh.nix
./nix.nix
./neovim
./editors.nix
./rust.nix
./elixir.nix
./nodejs.nix
@@ -34,10 +32,6 @@
# this with a plain assignment.
mutableFilesRepoPath = lib.mkDefault "${config.home.homeDirectory}/projects/nixos-config";
packages = with pkgs; [
impala
];
username = lib.mkDefault "naps62";
homeDirectory = lib.mkDefault "/home/${config.home.username}";
stateVersion = lib.mkDefault "24.05";
+1 -25
View File
@@ -4,53 +4,29 @@
...
}:
{
imports = [
./darkman.nix
./spicetify.nix
];
imports = [ ./darkman.nix ];
home = {
packages = with pkgs; [
# various
google-chrome
thunar
obsidian
mpv
# screen recording — evaluating these
obs-studio
kooha # simple Wayland-native screen+audio recorder
vokoscreen-ng # GUI recorder with webcam overlay
gimp
font-manager
imv
pavucontrol
zathura
libsForQt5.qt5ct
kdePackages.qt6ct
nwg-look
xournalpp
jq
ffmpeg
unzip
# remote desktop
remmina
# networking
networkmanagerapplet
mtr
dnsutils
# communication
slack
ferdium
signal-desktop
zoom-us
# dev tools
yaak
bun
# themes
tela-icon-theme
];
+12
View File
@@ -0,0 +1,12 @@
{ pkgs, ... }:
{
home.packages = with pkgs; [
doctl
awscli2
terraform
bruno
coturn
usbutils
ktlint
];
}
-8
View File
@@ -7,7 +7,6 @@
./codex.nix
./pi.nix
./ralph-claude-code.nix
./t3-code.nix
];
programs = {
@@ -26,19 +25,12 @@
home.packages = with pkgs; [
imagemagick
doctl
awscli2
terraform
inotify-tools
devenv
bruno
sshfs
coturn
file
usbutils
nmap
lsof
ktlint
croc
opencode
process-compose
+3
View File
@@ -19,6 +19,9 @@ tmp/**/*
*.log
*.tmp
# Local git worktree checkouts
worktrees/
# Latex
_inputs.tex
_sections.tex
+16 -11
View File
@@ -10,6 +10,8 @@ let
hyprPkgs = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system};
osd = "${pkgs.swayosd}/bin/swayosd-client";
# xdph runs this instead of hyprland-share-picker (screencopy:custom_picker_binary).
# The contract is just "print [SELECTION] to stdout"; a leading "r" grants a
# restore token. Printing it immediately means the dialog never renders.
@@ -365,18 +367,21 @@ in
hl.dispatch(hl.dsp.window.center())
end)
-- volume / brightness (locked so they work on the lock screen; repeat on hold)
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("brightnessctl set 5%+"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("brightnessctl set 5%-"), { locked = true, repeating = true })
-- volume / brightness / media (locked so they work on the lock screen;
-- volume and brightness repeat on hold). Everything goes through
-- swayosd-client, which applies the change and draws the OSD popup;
-- store paths because Hyprland execs these with the login PATH, which
-- doesn't pick up profile changes made after the session started.
hl.bind("XF86AudioRaiseVolume", hl.dsp.exec_cmd("${osd} --output-volume raise"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("${osd} --output-volume lower"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("${osd} --brightness raise"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("${osd} --brightness lower"), { locked = true, repeating = true })
-- media keys (locked)
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("pactl set-sink-mute @DEFAULT_SINK@ toggle"), { locked = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("volumectl -m toggle-mute"), { locked = true })
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("playerctl next"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("playerctl previous"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("playerctl play-pause"), { locked = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("${osd} --output-volume mute-toggle"), { locked = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("${osd} --input-volume mute-toggle"), { locked = true })
hl.bind("XF86AudioNext", hl.dsp.exec_cmd("${osd} --playerctl next"), { locked = true })
hl.bind("XF86AudioPrev", hl.dsp.exec_cmd("${osd} --playerctl prev"), { locked = true })
hl.bind("XF86AudioPlay", hl.dsp.exec_cmd("${osd} --playerctl play-pause"), { locked = true })
-- move/resize windows with mod + LMB/RMB drag
hl.bind(mod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
+36
View File
@@ -44,5 +44,41 @@
};
};
# swayosd: the on-screen volume/brightness/caps-lock popup. Noctalia drew this
# before; without it the XF86 keys still work but give no feedback, which reads
# as "the keys are dead". swayosd-client does the change *and* the popup, so the
# binds in default.nix call it instead of wpctl/brightnessctl directly.
services.swayosd = {
enable = true;
topMargin = 0.85;
stylePath = pkgs.writeText "swayosd-style.css" ''
window#osd {
padding: 12px 20px;
border-radius: 12px;
border: 1px solid #4c566a;
background: alpha(#2e3440, 0.94);
}
window#osd #container { margin: 12px; }
window#osd image,
window#osd label { color: #eceff4; }
window#osd progressbar:disabled { opacity: 0.5; }
window#osd trough {
min-height: 6px;
border-radius: 6px;
background: #434c5e;
}
window#osd progress {
min-height: 6px;
border-radius: 6px;
background: #88c0d0;
}
'';
};
services.hyprpolkitagent.enable = true;
}
-1
View File
@@ -1 +0,0 @@
Screenshots: stored in ~/downloads/screenshots, with date time in the filename
@@ -1,100 +0,0 @@
---
description: Merge worktree changes and clean up safely
---
# Merge Worktree and Cleanup
Merge changes from the current worktree into a target branch and clean up the worktree.
**Usage:** `/merge [target-branch]`
**Arguments:**
- `$1`: Target branch to merge into (default: auto-detect main/master)
## Process
### 1. Pre-flight Checks
```bash
CURRENT_BRANCH=$(git branch --show-current)
WORKTREE_DIR=$(git rev-parse --git-common-dir)
if [[ ! "$WORKTREE_DIR" == *".git/worktrees"* ]]; then
echo "❌ Error: You're not in a worktree"
exit 1
fi
if ! git diff-index --quiet HEAD --; then
echo "❌ Error: You have uncommitted changes"
git status --short
exit 1
fi
```
### 2. Determine Target Branch
```bash
TARGET_BRANCH="${1:-}"
if [ -z "$TARGET_BRANCH" ]; then
if git show-ref --verify --quiet refs/heads/main; then
TARGET_BRANCH="main"
elif git show-ref --verify --quiet refs/heads/master; then
TARGET_BRANCH="master"
else
echo "❌ Error: Cannot auto-detect main branch"
exit 1
fi
fi
```
### 3. Update Target Branch
```bash
WORKTREE_PATH=$(pwd)
COMMON_DIR=$(git rev-parse --git-common-dir)
REPO_ROOT=$(echo "$COMMON_DIR" | sed 's/\.git.*//' | sed 's/\/$//')
if [ "$COMMON_DIR" = ".git" ]; then
REPO_ROOT=$(git rev-parse --show-toplevel)
fi
cd "$REPO_ROOT"
git checkout "$TARGET_BRANCH"
git pull origin "$TARGET_BRANCH"
```
### 4. Merge
```bash
git merge --no-ff "$CURRENT_BRANCH" -m "Merge branch '$CURRENT_BRANCH'"
```
If you prefer a squash merge, do this instead:
```bash
git merge --squash "$CURRENT_BRANCH"
git commit -m "feat: <summary>"
```
### 5. Push and Clean Up
```bash
git push origin "$TARGET_BRANCH"
git worktree remove "$WORKTREE_PATH" --force || rm -rf "$WORKTREE_PATH"
git branch -d "$CURRENT_BRANCH" || git branch -D "$CURRENT_BRANCH"
```
### 6. Optional: Delete Remote Branch
```bash
git push origin --delete "$CURRENT_BRANCH"
```
## Language-specific checks
### Rust
- `cargo check`
- `cargo clippy` (clean up new warnings)
### TypeScript
- `tsc`
@@ -1,9 +0,0 @@
---
description: Rebase/merge upstream changes into the current branch
---
This command should only work while in a secondary branch (not main or master).
Commit any unstaged changes
Fetch updates from the origin repo
If there are new commits on the parent branch (typically origin/main), then merge them back into the current branch
Solve any conflicts, and analyze the incoming changes to see if additional changes are required to the branch's code (e.g.: if something was renamed in the meantime in main, our new code may need to be adjusted)
+5 -6
View File
@@ -1,12 +1,13 @@
_:
{
# Global rules (opencode/AGENTS.md) and the shared commands (merge, update)
# come from the agent-skills home-manager module — opencode has no @file
# imports, so the module concatenates the shared fragments into one file.
# opencode also auto-loads skills from ~/.claude/skills and ~/.agents/skills.
xdg.configFile = {
# Global config file
"opencode/opencode.json".source = ./opencode.json;
# Global rules (equivalent to ~/.claude/CLAUDE.md)
"opencode/AGENTS.md".source = ./AGENTS.md;
# Custom agents
"opencode/agents/oracle.md".source = ./agents/oracle.md;
"opencode/agents/explorer.md".source = ./agents/explorer.md;
@@ -16,10 +17,8 @@ _:
"opencode/agents/designer-bold.md".source = ./agents/designer-bold.md;
"opencode/agents/analyze-branch.md".source = ./agents/analyze-branch.md;
# Global commands
# Global commands (opencode-specific ones only)
"opencode/commands/work.md".source = ./commands/work.md;
"opencode/commands/merge.md".source = ./commands/merge.md;
"opencode/commands/update.md".source = ./commands/update.md;
"opencode/commands/smart-debug.md".source = ./commands/smart-debug.md;
"opencode/commands/tdd-cycle.md".source = ./commands/tdd-cycle.md;
"opencode/commands/security-scan.md".source = ./commands/security-scan.md;
+5 -25
View File
@@ -1,32 +1,12 @@
{
config,
lib,
pkgs,
inputs,
...
}:
{ pkgs, ... }:
let
pi = pkgs.callPackage ../../../pkgs/pi/package.nix { };
skills = inputs.agent-skills;
# pi has no `@file` imports in context files, so fragments get concatenated
# into one AGENTS.md. Skills need no wiring: pi reads ~/.agents/skills, which
# the agent-skills module already links.
agentsMd = pkgs.writeText "pi-AGENTS.md" (
lib.concatMapStringsSep "\n" builtins.readFile [
"${skills}/claude-md/machines/${config.programs.agentSkills.machine}.md"
"${skills}/claude-md/operating.md"
"${skills}/claude-md/writing.md"
"${skills}/claude-md/code-comments.md"
"${skills}/claude-md/RTK.md"
]
);
in
{
home.packages = [ pi ];
# ~/.pi/agent/AGENTS.md comes from the agent-skills home-manager module
# (pi has no @file imports, so the module concatenates the shared fragments).
# Pi reads skills straight from ~/.agents/skills, which the module links.
# Settings stay unmanaged: pi writes ~/.pi/agent/settings.json itself from
# /settings, /trust and `pi config`.
home.file.".pi/agent/AGENTS.md".source = agentsMd;
home.packages = [ pi ];
}
-16
View File
@@ -1,16 +0,0 @@
{
config,
pkgs,
lib,
...
}:
let
# T3 Code: open-source desktop control plane for coding agents (x86_64 only).
# Shares the custom.aiApps.deviceScaleFactor knob (defined in ../claude).
t3-code = pkgs.callPackage ../../../pkgs/t3-code/package.nix {
inherit (config.custom.aiApps) deviceScaleFactor;
};
in
{
home.packages = lib.optional pkgs.stdenv.hostPlatform.isx86_64 t3-code;
}
+21
View File
@@ -0,0 +1,21 @@
{ pkgs, ... }:
{
imports = [ ./desktop/spicetify.nix ];
home.packages = with pkgs; [
obsidian
obs-studio
kooha
vokoscreen-ng
gimp
font-manager
xournalpp
remmina
slack
ferdium
signal-desktop
zoom-us
yaak
bun
];
}
+4
View File
@@ -5,6 +5,10 @@
imports = [
../common/programs/default.nix
../common/programs/desktop
../common/programs/workstation-apps.nix
../common/programs/editors.nix
../common/programs/dev-workstation.nix
../common/programs/ai-gui.nix
../common/programs/zen-browser.nix
../common/programs/hyprland
../common/programs/kitty
+8 -1
View File
@@ -64,7 +64,14 @@ in
};
};
programs.agentSkills.machine = "yolo";
# This is the one box that runs the agent-skills units; each starts a session,
# so a second machine enabling them would run the same job twice.
programs.agentSkills = {
machine = "yolo";
prDaemon.enable = true;
hourlog.enable = true;
weekReview.enable = true;
};
programs.nh.flake = "/home/naps62/tea/nixos-config";
# Idle lock and dpms-off blank the virtual output: Sunshine then captures a
+3 -55
View File
@@ -92,60 +92,8 @@ in
};
Install.WantedBy = [ "default.target" ];
};
hourlog = {
Unit = {
Description = "Start the Friday hour log in a tmux session";
Documentation = [ "https://git.naps.pt/yolo/agent-skills" ];
ConditionPathIsDirectory = "%h/tea/agent-skills";
};
Service = {
Type = "oneshot";
ExecStart = "%h/tea/agent-skills/bin/hourlog-session.sh";
Environment = [ "PATH=${toolPath}" ];
# This unit may be what starts the tmux server; the default cgroup kill
# would take it back down as soon as ExecStart returns.
KillMode = "process";
};
};
week-review = {
Unit = {
Description = "Start the weekly agent-skills review in a tmux session";
Documentation = [ "https://git.naps.pt/yolo/agent-skills" ];
ConditionPathIsDirectory = "%h/tea/agent-skills";
};
Service = {
Type = "oneshot";
ExecStart = "%h/tea/agent-skills/bin/week-review-session.sh";
Environment = [ "PATH=${toolPath}" ];
KillMode = "process";
};
};
};
systemd.user.timers = {
hourlog = {
Unit.Description = "Friday hour log, 18:00 Europe/Lisbon";
Timer = {
# Zone suffix pinned because the machine clock is UTC; keeps it at 18:00
# wall time across DST.
OnCalendar = "Fri 18:00 Europe/Lisbon";
Persistent = true;
AccuracySec = "1min";
};
Install.WantedBy = [ "timers.target" ];
};
week-review = {
Unit.Description = "Weekly agent-skills review, Fridays 17:00 Europe/Lisbon";
Timer = {
OnCalendar = "Fri 17:00 Europe/Lisbon";
Persistent = true;
AccuracySec = "1min";
};
Install.WantedBy = [ "timers.target" ];
};
};
}
# pr-daemon, hourlog and week-review are not here: their units ship with the
# scripts they run, in the agent-skills module. This host opts in with
# programs.agentSkills.*.enable in home/yolo/default.nix.
+2 -5
View File
@@ -1,7 +1,4 @@
{ pkgs, ... }:
let
sddm-noctalia-theme = pkgs.callPackage ../../../../pkgs/sddm-noctalia-theme/package.nix { };
in
{
services.xserver = {
enable = true;
@@ -15,7 +12,7 @@ in
services.displayManager.sddm = {
enable = true;
wayland.enable = true;
theme = "sddm-noctalia";
theme = "sddm-astronaut-theme";
package = pkgs.kdePackages.sddm;
extraPackages = with pkgs.kdePackages; [
qtmultimedia
@@ -26,6 +23,6 @@ in
};
environment.systemPackages = with pkgs; [
sddm-noctalia-theme
sddm-astronaut
];
}
@@ -10,6 +10,13 @@
portalPackage = inputs.hyprland.packages.${pkgs.stdenv.hostPlatform.system}.xdg-desktop-portal-hyprland;
};
# swayosd (the volume/brightness OSD, configured in home) writes
# /sys/class/backlight/*/brightness directly. The package ships a udev rule
# that chgrps those files to `video`; without both the rule and the group,
# brightness keys pop the OSD but change nothing.
services.udev.packages = [ pkgs.swayosd ];
users.users.naps62.extraGroups = [ "video" ];
# GTK/GNOME services still useful on Wayland
programs.dconf.enable = true;
-33
View File
@@ -1,33 +0,0 @@
{ pkgs, ... }:
pkgs.stdenv.mkDerivation {
pname = "sddm-noctalia-theme";
version = "1.0";
src = pkgs.fetchFromGitHub {
owner = "mahaveergurjar";
repo = "sddm";
rev = "noctalia";
sha256 = "sha256-e/gYI6znHXxlDCOVh4p265x3kO0nQUU897hCY1yEz88=";
};
installPhase = ''
mkdir -p $out/share/sddm/themes/sddm-noctalia
cp -r * $out/share/sddm/themes/sddm-noctalia/
# Patch for Qt6 SDDM greeter compatibility
# SDDM reads QtVersion from metadata.desktop to find the greeter binary;
# default is 5 (sddm-greeter), we need 6 (sddm-greeter-qt6)
substituteInPlace $out/share/sddm/themes/sddm-noctalia/metadata.desktop \
--replace-fail "Theme-Id=noctalia" "QtVersion=6
Theme-Id=noctalia"
'';
meta = with pkgs.lib; {
description = "Noctalia-themed SDDM login theme";
homepage = "https://github.com/mahaveergurjar/sddm/tree/noctalia";
license = licenses.gpl3;
platforms = platforms.linux;
};
}