Compare commits

..

1 Commits

Author SHA1 Message Date
m3ta-chiron 5bd7647f48 feat: migrate Hyprland config to Lua (Hyprland 0.55+)
- Rewrite hyprland.nix to use configType = "lua"
- Use Hyprland 0.55 Lua API: hl.config(), hl.bind(), hl.curve(),
  hl.animation(), hl.window_rule(), hl.workspace_rule(), hl.dsp.*
- Consolidate window rules where possible
- Update flake.lock: home-manager -> 74f170c6 (2026-05-18)
- hypridle and hyprlock keep their own config format
2026-05-18 17:27:14 +02:00
17 changed files with 410 additions and 1946 deletions
-3
View File
@@ -177,7 +177,6 @@ base.secrets.enable # pass-wayland, pinentry
desktop.wm.hyprland.enable # Hyprland window manager desktop.wm.hyprland.enable # Hyprland window manager
desktop.wm.rofi.enable # Rofi launcher desktop.wm.rofi.enable # Rofi launcher
desktop.wm.wayland.enable # Wayland tools (grim, slurp, etc.) desktop.wm.wayland.enable # Wayland tools (grim, slurp, etc.)
desktop.wm.dms.enable # DankMaterialShell desktop shell
desktop.apps.obsidian.enable # Obsidian desktop.apps.obsidian.enable # Obsidian
desktop.apps.office.enable # LibreOffice desktop.apps.office.enable # LibreOffice
desktop.apps.crypto.enable # Bisq2, Monero, Trezor desktop.apps.crypto.enable # Bisq2, Monero, Trezor
@@ -246,8 +245,6 @@ source = "${config."m3ta-home".paths.srcRoot}/assets/wallpapers";
| `home-manager` | Home-Manager modules | | `home-manager` | Home-Manager modules |
| `nix-colors` | Dracula theme palette (used everywhere) | | `nix-colors` | Dracula theme palette (used everywhere) |
| `m3ta-nixpkgs` | Custom packages (zellij-ps, rofi-project-opener) and HM modules | | `m3ta-nixpkgs` | Custom packages (zellij-ps, rofi-project-opener) and HM modules |
| `dms` | DankMaterialShell Home-Manager module and package |
| `dms-plugin-registry` | DankMaterialShell plugin sources |
| `agenix` | Secret management | | `agenix` | Secret management |
| `NUR` | Additional packages | | `NUR` | Additional packages |
File diff suppressed because it is too large Load Diff
Generated
+30 -152
View File
@@ -21,52 +21,14 @@
"type": "github" "type": "github"
} }
}, },
"agent-lib": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1780157040,
"narHash": "sha256-j2d3nj3FvOlxQ+Zlse+rMo3qHD3m4Gick5uiwtTaA2o=",
"ref": "refs/heads/master",
"rev": "f63712a9ba03da6e2f591766d0f055aa65e6d237",
"revCount": 24,
"type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/agent-lib"
},
"original": {
"type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/agent-lib"
}
},
"agents": { "agents": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1780133320,
"narHash": "sha256-8AiN9tV9PBb5xblJiPlhumBbKj61qLjzqXXFtkj3vvY=",
"ref": "refs/heads/master",
"rev": "920c00313ae242bd93275c30131b9ab1e52ee2fb",
"revCount": 88,
"type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/AGENTS"
},
"original": {
"type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/AGENTS"
}
},
"agents_2": {
"flake": false, "flake": false,
"locked": { "locked": {
"lastModified": 1778518220, "lastModified": 1777399938,
"narHash": "sha256-6AQs9VZ0/DuD4njPbYHRE4v+SgJc6SBrGwemTWxikVc=", "narHash": "sha256-xXPqUQezDdDtF8MbpZnwD1HkybOYwF92evx8rJ6OXCU=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "b6e1aaa6261c5056d024d8d4785659eaa4e675e6", "rev": "9a91f1ee0cf011a7eaf1f16a9e17610b0457e055",
"revCount": 87, "revCount": 85,
"type": "git", "type": "git",
"url": "https://code.m3ta.dev/m3tam3re/AGENTS" "url": "https://code.m3ta.dev/m3tam3re/AGENTS"
}, },
@@ -135,48 +97,6 @@
"type": "github" "type": "github"
} }
}, },
"dms": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"quickshell": "quickshell"
},
"locked": {
"lastModified": 1777431599,
"narHash": "sha256-g6r/Gx8PTDzO3jCNzzySA+Ff1lmLF9nDlMCNyyoQjoE=",
"owner": "AvengeMedia",
"repo": "DankMaterialShell",
"rev": "eb5afcdc40ea5446c27e18552ff4a19f9daf9484",
"type": "github"
},
"original": {
"owner": "AvengeMedia",
"ref": "stable",
"repo": "DankMaterialShell",
"type": "github"
}
},
"dms-plugin-registry": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1780281921,
"narHash": "sha256-ZDsDl7lTOfM+Le2l6gDyEP3o+KHR3TUCkuxd9hQaLro=",
"owner": "AvengeMedia",
"repo": "dms-plugin-registry",
"rev": "ee4eeacce5a7041ed39f8cd7fe64b6e0e888e73b",
"type": "github"
},
"original": {
"owner": "AvengeMedia",
"repo": "dms-plugin-registry",
"type": "github"
}
},
"flake-parts": { "flake-parts": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
@@ -226,11 +146,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1780099287, "lastModified": 1779113444,
"narHash": "sha256-efIPwVGtIWIjWcznhaop6XN6HxnOL8800hF6CBNvlqQ=", "narHash": "sha256-/L61sT1PIKmGWIQpIh0uJGH/ANvcsf6y4alxtb9kelg=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "7d8127d308c3fb9664f7e643eec944be74ebb37d", "rev": "74f170c62d57f90e656841f1f699e6bdf40f0a24",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -241,7 +161,7 @@
}, },
"m3ta-nixpkgs": { "m3ta-nixpkgs": {
"inputs": { "inputs": {
"agents": "agents_2", "agents": "agents",
"basecamp": "basecamp", "basecamp": "basecamp",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
@@ -250,11 +170,11 @@
"openspec": "openspec" "openspec": "openspec"
}, },
"locked": { "locked": {
"lastModified": 1779944037, "lastModified": 1778508052,
"narHash": "sha256-jO6zAJjgc9n3SeDJW1EbV6CEqOa9DK+2AhTgWc+ImHQ=", "narHash": "sha256-kxzZvJv757TGfHReR21aX6N/jkGMWzGSy9GQEclYD4Y=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "ae1fb97c21b311dc03a46e8d50867048e5568c88", "rev": "8113723a48c4afa016881ccd5bc4be3fad2c7d5f",
"revCount": 323, "revCount": 294,
"type": "git", "type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs" "url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs"
}, },
@@ -315,11 +235,11 @@
}, },
"nixpkgs-master": { "nixpkgs-master": {
"locked": { "locked": {
"lastModified": 1779457550, "lastModified": 1778507606,
"narHash": "sha256-yALoy2CrvwvNfwMtGZDRdc+jqVNHulyuM5iVK12lUAI=", "narHash": "sha256-6Yc2dIhijc8G+dbMNocyclxF19dUrjaT+EeXGrXmXlg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "a9c18fd234dbe4fd8de4bac53760b785c47e94ff", "rev": "39a7b8d815fcc8b689d56fc4a3fa8de4ef93d169",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -331,27 +251,11 @@
}, },
"nixpkgs_2": { "nixpkgs_2": {
"locked": { "locked": {
"lastModified": 1772479524, "lastModified": 1777954456,
"narHash": "sha256-u7nCaNiMjqvKpE+uZz9hE7pgXXTmm5yvdtFaqzSzUQI=", "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "4215e62dc2cd3bc705b0a423b9719ff6be378a43", "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1779560665,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -361,13 +265,13 @@
"type": "github" "type": "github"
} }
}, },
"nixpkgs_4": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1779560665, "lastModified": 1777954456,
"narHash": "sha256-tpyBcxPpcQb8ukyNF7DoCwfSY3VPsxHoYwj00Cayv5o=", "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "64c08a7ca051951c8eae34e3e3cb1e202fe36786", "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -380,14 +284,14 @@
"nur": { "nur": {
"inputs": { "inputs": {
"flake-parts": "flake-parts", "flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_4" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1780290189, "lastModified": 1778506944,
"narHash": "sha256-2igu6l2/d4RikYmC/SsykZ1jF1e4+Df+2qWPYjq2xto=", "narHash": "sha256-lU0Bleh0reE+WU7j8Uiqsu6ekPav50L8sXsgOvEQS+0=",
"owner": "nix-community", "owner": "nix-community",
"repo": "NUR", "repo": "NUR",
"rev": "8b6210602dcbd4409ab1c3453ea0c292637c2799", "rev": "0166493cfe4e0e9927435c1cfbf5505cfb0d10d1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -404,11 +308,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1779302169, "lastModified": 1778120451,
"narHash": "sha256-OOSPtUXC4F2umtsZPkyWlPQxhXBsxF2vqBXLeI/lqIw=", "narHash": "sha256-MUSPD16+hoFBfQWYahtNLN2BIFEAlFFo2KNofrc947g=",
"owner": "Fission-AI", "owner": "Fission-AI",
"repo": "OpenSpec", "repo": "OpenSpec",
"rev": "79303b521068c5f525ee61db06b915fc44b098f4", "rev": "053d8a59d587f3c027a06ad80503a6b43d4f2a92",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -417,39 +321,13 @@
"type": "github" "type": "github"
} }
}, },
"quickshell": {
"inputs": {
"nixpkgs": [
"dms",
"nixpkgs"
]
},
"locked": {
"lastModified": 1776854048,
"narHash": "sha256-lLbV66V3RMNp1l8/UelmR4YzoJ5ONtgvEtiUMJATH/o=",
"ref": "refs/heads/master",
"rev": "783c953987dc56ff0601abe6845ed96f1d00495a",
"revCount": 806,
"type": "git",
"url": "https://git.outfoxxed.me/quickshell/quickshell"
},
"original": {
"rev": "783c953987dc56ff0601abe6845ed96f1d00495a",
"type": "git",
"url": "https://git.outfoxxed.me/quickshell/quickshell"
}
},
"root": { "root": {
"inputs": { "inputs": {
"agenix": "agenix", "agenix": "agenix",
"agent-lib": "agent-lib",
"agents": "agents",
"dms": "dms",
"dms-plugin-registry": "dms-plugin-registry",
"home-manager": "home-manager_2", "home-manager": "home-manager_2",
"m3ta-nixpkgs": "m3ta-nixpkgs", "m3ta-nixpkgs": "m3ta-nixpkgs",
"nix-colors": "nix-colors", "nix-colors": "nix-colors",
"nixpkgs": "nixpkgs_3", "nixpkgs": "nixpkgs_2",
"nur": "nur" "nur": "nur"
} }
}, },
+2 -29
View File
@@ -16,27 +16,6 @@
inputs.nixpkgs.follows = "nixpkgs"; inputs.nixpkgs.follows = "nixpkgs";
}; };
agents = {
# url = "path:/home/m3tam3re/p/AI/AGENTS";
url = "git+ssh://gitea@code.m3ta.dev/m3tam3re/AGENTS";
};
agent-lib = {
# url = "path:/home/m3tam3re/p/NIX/agent-lib";
url = "git+ssh://gitea@code.m3ta.dev/m3tam3re/agent-lib";
inputs.nixpkgs.follows = "nixpkgs";
};
dms = {
url = "github:AvengeMedia/DankMaterialShell/stable";
inputs.nixpkgs.follows = "nixpkgs";
};
dms-plugin-registry = {
url = "github:AvengeMedia/dms-plugin-registry";
inputs.nixpkgs.follows = "nixpkgs";
};
agenix.url = "github:ryantm/agenix"; agenix.url = "github:ryantm/agenix";
nur.url = "github:nix-community/NUR"; nur.url = "github:nix-community/NUR";
@@ -51,18 +30,12 @@
in { in {
# Home-Manager modules — import in nixos-config via: # Home-Manager modules — import in nixos-config via:
# imports = [ inputs.m3ta-home.homeManagerModules.default ]; # imports = [ inputs.m3ta-home.homeManagerModules.default ];
homeManagerModules = import ./modules { homeManagerModules = import ./modules { inherit inputs; selfPath = self.outPath; };
inherit inputs;
selfPath = self.outPath;
};
# Library functions — use in nixos-config via: # Library functions — use in nixos-config via:
# m3ta-lib = inputs.m3ta-home.lib; # m3ta-lib = inputs.m3ta-home.lib;
# imports = [ (m3ta-lib.mkHome { ... }) ]; # imports = [ (m3ta-lib.mkHome { ... }) ];
lib = import ./lib { lib = import ./lib {inherit inputs; selfPath = self.outPath;};
inherit inputs;
selfPath = self.outPath;
};
# Overlays (re-exports from m3ta-nixpkgs) # Overlays (re-exports from m3ta-nixpkgs)
overlays = inputs.m3ta-nixpkgs.overlays; overlays = inputs.m3ta-nixpkgs.overlays;
+1 -9
View File
@@ -19,10 +19,7 @@
# m3ta.home.sets.coding.languages.python.extra = true; # m3ta.home.sets.coding.languages.python.extra = true;
# wayland.windowManager.hyprland.settings.monitor = [ ... ]; # wayland.windowManager.hyprland.settings.monitor = [ ... ];
# #
{ {inputs, selfPath}: let
inputs,
selfPath,
}: let
lib = inputs.nixpkgs.lib; lib = inputs.nixpkgs.lib;
in { in {
mkHome = { mkHome = {
@@ -83,11 +80,6 @@ in {
in { in {
imports = imports =
[ [
# External Home Manager modules required by selectable profiles
inputs.agent-lib.homeManagerModules.default
inputs.dms.homeModules.default
inputs.dms-plugin-registry.homeModules.default
# Paths module — must be first, provides m3taHome.paths.srcRoot # Paths module — must be first, provides m3taHome.paths.srcRoot
../modules/paths.nix ../modules/paths.nix
baseModule baseModule
-4
View File
@@ -13,10 +13,6 @@
in { in {
default = { default = {
imports = [ imports = [
# External modules
inputs.agent-lib.homeManagerModules.default
inputs.dms.homeModules.default
inputs.dms-plugin-registry.homeModules.default
# Paths — must be first, provides "m3ta-home".paths.srcRoot # Paths — must be first, provides "m3ta-home".paths.srcRoot
./paths.nix ./paths.nix
+26 -28
View File
@@ -2,7 +2,6 @@
# Includes window manager, applications, theming, and desktop session config. # Includes window manager, applications, theming, and desktop session config.
{ {
config, config,
inputs,
pkgs, pkgs,
... ...
}: { }: {
@@ -65,30 +64,29 @@
settings = { settings = {
font-family = "Fira Code"; font-family = "Fira Code";
copy-on-select = "clipboard"; copy-on-select = "clipboard";
theme = "dankcolors"; foreground = "#${config.colorScheme.palette.base05}";
# foreground = "#${config.colorScheme.palette.base05}"; background = "#${config.colorScheme.palette.base00}";
# background = "#${config.colorScheme.palette.base00}"; selection-foreground = "#${config.colorScheme.palette.base07}";
# selection-foreground = "#${config.colorScheme.palette.base07}"; selection-background = "#${config.colorScheme.palette.base02}";
# selection-background = "#${config.colorScheme.palette.base02}"; cursor-color = "#${config.colorScheme.palette.base05}";
# cursor-color = "#${config.colorScheme.palette.base05}"; palette = [
# palette = [ "0=#${config.colorScheme.palette.base01}"
# "0=#${config.colorScheme.palette.base01}" "1=#${config.colorScheme.palette.base08}"
# "1=#${config.colorScheme.palette.base08}" "2=#${config.colorScheme.palette.base0B}"
# "2=#${config.colorScheme.palette.base0B}" "3=#${config.colorScheme.palette.base0A}"
# "3=#${config.colorScheme.palette.base0A}" "4=#${config.colorScheme.palette.base0D}"
# "4=#${config.colorScheme.palette.base0D}" "5=#${config.colorScheme.palette.base0E}"
# "5=#${config.colorScheme.palette.base0E}" "6=#${config.colorScheme.palette.base0C}"
# "6=#${config.colorScheme.palette.base0C}" "7=#${config.colorScheme.palette.base05}"
# "7=#${config.colorScheme.palette.base05}" "8=#${config.colorScheme.palette.base03}"
# "8=#${config.colorScheme.palette.base03}" "9=#${config.colorScheme.palette.base08}"
# "9=#${config.colorScheme.palette.base08}" "10=#${config.colorScheme.palette.base0B}"
# "10=#${config.colorScheme.palette.base0B}" "11=#${config.colorScheme.palette.base0A}"
# "11=#${config.colorScheme.palette.base0A}" "12=#${config.colorScheme.palette.base0D}"
# "12=#${config.colorScheme.palette.base0D}" "13=#${config.colorScheme.palette.base0E}"
# "13=#${config.colorScheme.palette.base0E}" "14=#${config.colorScheme.palette.base0C}"
# "14=#${config.colorScheme.palette.base0C}" "15=#${config.colorScheme.palette.base07}"
# "15=#${config.colorScheme.palette.base07}" ];
# ];
}; };
}; };
@@ -102,18 +100,18 @@
home.packages = with pkgs; [ home.packages = with pkgs; [
appimage-run appimage-run
bemoji bemoji
dconf eigent
(element-desktop.override { (element-desktop.override {
commandLineArgs = "--password-store=gnome-libsecret"; commandLineArgs = "--password-store=gnome-libsecret";
}) })
launch-webapp launch-webapp
file-roller file-roller
gsettings-desktop-schemas hyprpanel
hyprpaper-random
seahorse seahorse
sushi sushi
ksnip ksnip
nwg-look nwg-look
qt6Packages.qt6ct
rose-pine-hyprcursor rose-pine-hyprcursor
remmina remmina
slack slack
+5 -6
View File
@@ -1,4 +1,4 @@
# GTK and Qt theming — system-wide dark Adwaita/libadwaita-compatible theme. # GTK and Qt theming — Dracula theme with matching icons and cursor.
{ {
pkgs, pkgs,
config, config,
@@ -11,14 +11,13 @@
gtk = { gtk = {
enable = true; enable = true;
colorScheme = "dark";
theme = { theme = {
name = "adw-gtk3-dark"; name = "Dracula";
package = pkgs.adw-gtk3; package = pkgs.dracula-theme;
}; };
iconTheme = { iconTheme = {
name = "Papirus-Dark"; name = "Dracula";
package = pkgs.papirus-icon-theme; package = pkgs.dracula-icon-theme;
}; };
gtk4.theme = config.gtk.theme; gtk4.theme = config.gtk.theme;
}; };
-1
View File
@@ -4,6 +4,5 @@
./hyprland.nix ./hyprland.nix
./wayland.nix ./wayland.nix
./rofi.nix ./rofi.nix
./dms.nix
]; ];
} }
-29
View File
@@ -1,29 +0,0 @@
# DankMaterialShell user-session configuration.
# External DMS Home-Manager modules are imported by mkHome/modules/default.nix
# so this file only owns the m3ta-home feature flag and desired defaults.
{
config,
lib,
...
}:
with lib; let
cfg = config.desktop.wm.dms;
in {
options.desktop.wm.dms.enable = mkEnableOption "DankMaterialShell desktop shell";
config = mkIf cfg.enable {
programs.dank-material-shell = {
enable = true;
systemd.enable = true;
enableDynamicTheming = true;
enableClipboardPaste = true;
plugins = {
dankBatteryAlerts.enable = true;
emojiLauncher.enable = true;
dankPomodoroTimer.enable = true;
dankVault.enable = true;
};
};
};
}
+253 -247
View File
@@ -1,4 +1,6 @@
# Hyprland window manager with keybindings, window rules, idle/lock, and hyprpaper. # Hyprland window manager — Lua config for Hyprland 0.55+
# Home-Manager configType = "lua" generates hyprland.lua using hl.* API.
# API reference: https://wiki.hypr.land/Configuring/Start/
{ {
config, config,
lib, lib,
@@ -6,38 +8,22 @@
}: }:
with lib; let with lib; let
cfg = config.desktop.wm.hyprland; cfg = config.desktop.wm.hyprland;
p = config.colorScheme.palette;
in { in {
options.desktop.wm.hyprland.enable = mkEnableOption "Hyprland window manager"; options.desktop.wm.hyprland.enable = mkEnableOption "Hyprland window manager";
config = mkIf cfg.enable { config = mkIf cfg.enable {
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
configType = "hyprlang"; configType = "lua";
settings = {
xwayland = {
force_zero_scaling = true;
};
source = [
"~/.config/hypr/dms/colors.conf"
"~/.config/hypr/dms/layout.conf"
"~/.config/hypr/monitors.conf"
];
exec-once = [
"vibetyper"
];
env = [ settings = {
"XCURSOR_SIZE,32" # ── Lua local variables (rendered as: local mainMod = "SUPER") ──
"HYPRCURSOR_THEME,Bibata-Modern-Ice" mainMod = {_var = "SUPER";};
"WLR_NO_HARDWARE_CURSORS,1" terminal = {_var = "ghostty";};
"XDG_CURRENT_DESKTOP,Hyprland"
"XDG_SESSION_TYPE,wayland" # ── Config sections (rendered as: hl.config({...})) ──
"XDG_SESSION_DESKTOP,Hyprland" config = {
"XKB_DEFAULT_LAYOUT,de" xwayland = {force_zero_scaling = true;};
"NIXOS_OZONE_WL,1"
"QT_QPA_PLATFORM,wayland;xcb"
"QT_QPA_PLATFORMTHEME,gtk3"
"QT_QPA_PLATFORMTHEME_QT6,gtk3"
];
input = { input = {
kb_layout = "de,us"; kb_layout = "de,us";
@@ -52,6 +38,10 @@ in {
gaps_in = 5; gaps_in = 5;
gaps_out = 5; gaps_out = 5;
border_size = 1; border_size = 1;
col = {
active_border = {colors = ["rgba(9742b5ee)" "rgba(9742b5ee)"]; angle = 45;};
inactive_border = "rgba(${p.base03}aa)";
};
layout = "dwindle"; layout = "dwindle";
}; };
@@ -60,8 +50,7 @@ in {
enabled = true; enabled = true;
range = 60; range = 60;
render_power = 3; render_power = 3;
# color = "rgba(${config.colorScheme.palette.base00}66)"; color = "rgba(${p.base00}66)";
offset = "1 2";
scale = 0.97; scale = 0.97;
}; };
rounding = 8; rounding = 8;
@@ -74,240 +63,257 @@ in {
inactive_opacity = 0.5; inactive_opacity = 0.5;
}; };
animations = { animations = {enabled = true;};
enabled = true;
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
animation = [
"windows, 1, 7, myBezier"
"windowsOut, 1, 7, default, popin 80%"
"border, 1, 10, default"
"borderangle, 1, 8, default"
"fade, 1, 7, default"
"workspaces, 1, 6, default"
];
};
dwindle = { dwindle = {
# pseudotile = true; # TODO pseudotile = true;
preserve_split = true; preserve_split = true;
}; };
master = { master = {new_status = "master";};
new_status = "master";
}; };
# ── Environment variables (rendered as: hl.env("KEY", "VALUE")) ──
env = [
{ _args = ["XCURSOR_SIZE" "32"]; }
{ _args = ["HYPRCURSOR_THEME" "Bibata-Modern-Ice"]; }
{ _args = ["WLR_NO_HARDWARE_CURSORS" "1"]; }
{ _args = ["GTK_THEME" "Dracula"]; }
{ _args = ["XDG_CURRENT_DESKTOP" "Hyprland"]; }
{ _args = ["XDG_SESSION_TYPE" "wayland"]; }
{ _args = ["XDG_SESSION_DESKTOP" "Hyprland"]; }
{ _args = ["XKB_DEFAULT_LAYOUT" "de"]; }
{ _args = ["NIXOS_OZONE_WL" "1"]; }
];
# ── Per-device config (rendered as: hl.device({...})) ──
device = [ device = [
{name = "epic-mouse-v1"; sensitivity = -0.5;}
{name = "zsa-technology-labs-moonlander-mark-i"; kb_layout = "us";}
{name = "keychron-keychron-k7"; kb_layout = "us";}
];
};
# ── Complex Lua: curves, animations, binds, window rules, startup ──
extraConfig = ''
-- Bezier curves
hl.curve("myBezier", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.05} } })
-- Animations
hl.animation({ leaf = "windows", enabled = true, speed = 7, bezier = "myBezier" })
hl.animation({ leaf = "windowsOut", enabled = true, speed = 7, bezier = "default", style = "popin 80%" })
hl.animation({ leaf = "border", enabled = true, speed = 10, bezier = "default" })
hl.animation({ leaf = "borderangle", enabled = true, speed = 8, bezier = "default" })
hl.animation({ leaf = "fade", enabled = true, speed = 7, bezier = "default" })
hl.animation({ leaf = "workspaces", enabled = true, speed = 6, bezier = "default" })
-- Keybinds: terminals & editors
hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(terminal .. " nu -c zellij-ps"))
hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal .. " -e nu -c 'nitch; exec nu'"))
hl.bind(mainMod .. " + Shift + T", hl.dsp.exec_cmd("launch-timer"))
hl.bind(mainMod .. " + N", hl.dsp.exec_cmd(terminal .. " -e nvim"))
hl.bind(mainMod .. " + Z", hl.dsp.exec_cmd("uwsm app -- zeditor"))
-- Keybinds: misc
hl.bind(mainMod .. " + O", hl.dsp.exec_cmd("hyprctl dispatch setprop activewindow opaque toggle"))
hl.bind(mainMod .. " + B", hl.dsp.exec_cmd("uwsm app -- thunar"))
hl.bind(mainMod .. " + Shift + B", hl.dsp.exec_cmd("uwsm app -- vivaldi"))
hl.bind(mainMod .. " + Escape", hl.dsp.exec_cmd("uwsm app -- wlogout -p layer-shell"))
-- Keybinds: window management
hl.bind(mainMod .. " + Space", hl.dsp.window.float({ action = "toggle" }))
hl.bind(mainMod .. " + Q", hl.dsp.window.close())
hl.bind(mainMod .. " + M", hl.dsp.exit())
hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen())
hl.bind(mainMod .. " + Shift + V", hl.dsp.window.float({ action = "toggle" }))
-- Keybinds: launchers
hl.bind(mainMod .. " + D", hl.dsp.exec_cmd('uwsm app -- rofi -show drun -run-command "uwsm app -- {cmd}"'))
hl.bind(mainMod .. " + V", hl.dsp.exec_cmd("uwsm app -- cliphist list | rofi -dmenu | cliphist decode | wl-copy"))
hl.bind(mainMod .. " + C", hl.dsp.exec_cmd("bash -c 'FILE=/tmp/screenshot_$(date +%s).png; grim -g \"$(slurp)\" \"$FILE\" && ksnip \"$FILE\"'"))
hl.bind(mainMod .. " + Shift + S", hl.dsp.exec_cmd("uwsm app -- rofi -show emoji"))
hl.bind(mainMod .. " + P", hl.dsp.exec_cmd("uwsm app -- rofi-pass"))
hl.bind(mainMod .. " + Shift + P", hl.dsp.window.pseudo())
-- Keybinds: STT push-to-talk
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd("stt-ptt start"))
hl.bind(mainMod .. " + R", hl.dsp.exec_cmd("stt-ptt stop"), { release = true })
hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("stt-ptt start"))
hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("stt-ptt format-stop"), { release = true })
-- Keybinds: focus
hl.bind(mainMod .. " + H", hl.dsp.focus({ direction = "left" }))
hl.bind(mainMod .. " + L", hl.dsp.focus({ direction = "right" }))
hl.bind(mainMod .. " + K", hl.dsp.focus({ direction = "up" }))
hl.bind(mainMod .. " + J", hl.dsp.focus({ direction = "down" }))
-- Keybinds: workspaces (1-10)
for i = 1, 10 do
local key = i % 10
hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i }))
hl.bind(mainMod .. " + Shift + " .. key, hl.dsp.window.move({ workspace = i }))
end
hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
-- Keybinds: mouse (drag & resize)
hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
-- Window rules: floating dialogs
for _, cls in ipairs({
"file_progress", "confirm", "dialog", "download",
"notification", "error", "splash", "confirmreset",
}) do
hl.window_rule({ match = { class = cls }, float = true })
end
-- Window rules: title-based floating
hl.window_rule({ match = { title = "Open File" }, float = true })
hl.window_rule({ match = { title = "branchdialog" }, float = true })
-- Window rules: audio/video
hl.window_rule({ match = { class = "pavucontrol-qt" }, float = true })
hl.window_rule({ match = { class = "pavucontrol" }, float = true })
hl.window_rule({ match = { class = "^espanso$" }, float = true })
-- Window rules: wlogout
hl.window_rule({ match = { class = "wlogout" }, fullscreen = true })
hl.window_rule({ match = { title = "wlogout" }, float = true, fullscreen = true })
-- Window rules: mpv
hl.window_rule({ match = { class = "mpv" }, float = true, idle_inhibit = "focus", opacity = 1.0 })
-- Window rules: misc floating
hl.window_rule({ match = { title = "^Media viewer$" }, float = true })
hl.window_rule({ match = { title = "^Volume Control$" }, float = true })
hl.window_rule({ match = { title = "^Picture-in-Picture$" }, float = true })
-- Window rules: pomodoro (consolidated)
hl.window_rule({
match = { title = "^floating-pomodoro$" },
float = true, size = { 250, 50 }, move = { 12, "monitor_h-150" }, pin = true,
})
-- Window rules: streamlabs (consolidated)
hl.window_rule({
match = { initial_title = ".*streamlabs.com.*" },
float = true, pin = true, size = { 800, 400 }, opacity = 0.5,
idle_inhibit = "focus", no_anim = true, decorate = false, no_shadow = true, no_blur = true,
})
hl.window_rule({ match = { initial_title = ".*alert-box.*" }, move = { "100%-820", 102 } })
hl.window_rule({ match = { initial_title = ".*chat-box.*" }, move = { "100%-820", 512 } })
-- Window rules: vibe-typer
hl.window_rule({ match = { class = "^vibe-typer$", title = "^Recording Indicator$" }, no_blur = true })
-- Window rules: xwayland border
hl.window_rule({ match = { xwayland = true }, border_color = "rgb(ffffff)" })
-- Startup commands
hl.on("hyprland.start", function()
hl.exec_cmd("hyprpanel")
hl.exec_cmd("while ! hyprpaper-random; do sleep 0.5; done")
hl.exec_cmd("wl-paste --type text --watch cliphist store")
hl.exec_cmd("wl-paste --type image --watch cliphist store")
hl.exec_cmd("vibetyper")
end)
'';
};
services.hypridle = {
enable = true;
settings = {
general = {
before_sleep_cmd = "hyprlock";
after_sleep_cmd = "hyprctl dispatch dpms on";
inhibit_sleep = 3;
};
listener = [
{ {
name = "zsa-technology-labs-moonlander-mark-i"; timeout = 300;
kb_layout = "us"; on-timeout = "hyprlock";
} }
{ {
name = "keychron-keychron-k7"; timeout = 420;
kb_layout = "us"; on-timeout = "hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
];
};
};
services.hyprpaper.enable = true;
programs.hyprlock = {
enable = true;
settings = {
"$font" = "JetBrainsMono Nerd Font";
"$base" = "rgb(${p.base00})";
"$text" = "rgb(${p.base05})";
"$textAlpha" = "${p.base05}";
"$accentAlpha" = "${p.base0D}";
"$red" = "rgb(${p.base08})";
"$yellow" = "rgb(${p.base0A})";
general = {
hide_cursor = true;
};
background = {
monitor = "";
path = "${config.home.homeDirectory}/.config/hypr/wallpapers/wallhaven-lmmo8r.jpg";
blur_passes = 0;
color = "rgb(${p.base00})";
};
label = [
{
monitor = "";
text = "$TIME";
color = "$text";
font_size = 90;
font_family = "$font";
position = "30, 0";
halign = "left";
valign = "top";
}
{
monitor = "";
text = ''cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"'';
color = "$text";
font_size = 25;
font_family = "$font";
position = "30, -150";
halign = "left";
valign = "top";
} }
]; ];
windowrule = [ input-field = [
"match:class file_progress, float on" {
"match:class confirm, float on" monitor = "";
"match:class dialog, float on" size = "300, 60";
"match:class download, float on" outline_thickness = 4;
"match:class notification, float on" dots_size = 0.2;
"match:class error, float on" dots_spacing = 0.2;
"match:class splash, float on" dots_center = true;
"match:class confirmreset, float on" outer_color = "rgb(${p.base0D})";
"match:title Open File, float on" inner_color = "rgb(${p.base00})";
"match:title branchdialog, float on" font_color = "rgb(${p.base05})";
"match:class pavucontrol-qt, float on" fade_on_empty = false;
"match:class pavucontrol, float on" placeholder_text = ''<span foreground="##${p.base05}">󰌾 Logged in as <span foreground="##${p.base0D}">$USER</span></span>'';
"match:class class:^(espanso)$, float on" hide_input = false;
"match:class wlogout, fullscreen on" check_color = "rgb(${p.base0D})";
"match:title wlogout, float on" fail_color = "rgb(${p.base08})";
"match:title wlogout, fullscreen on" fail_text = ''<i>$FAIL <b>($ATTEMPTS)</b></i>'';
"match:class mpv, float on" capslock_color = "rgb(${p.base0A})";
"match:class mpv, idle_inhibit focus" position = "0, -35";
"match:class mpv, opacity 1.0 override" halign = "center";
"match:title ^(Media viewer)$, float on" valign = "center";
"match:title ^(Volume Control)$, float on" }
"match:title ^(Picture-in-Picture)$, float on"
"match:title ^(floating-pomodoro)$, float on"
"match:title ^(floating-pomodoro)$, size 250 50"
"match:title ^(floating-pomodoro)$, move 12 (monitor_h-150)"
"match:title ^(floating-pomodoro)$, pin on"
"match:initial_title .*streamlabs.com.*, float on"
"match:initial_title .*streamlabs.com.*, pin on"
"match:initial_title .*streamlabs.com.*, size 800 400"
"match:initial_title .*alert-box.*, move 100%-820 102"
"match:initial_title .*chat-box.*, move 100%-820 512"
"match:initial_title .*streamlabs.com.*, opacity 0.5 override"
"match:initial_title .*streamlabs.com.*, idle_inhibit focus"
"match:initial_title .*streamlabs.com.*, no_anim on"
"match:initial_title .*streamlabs.com.*, decorate off"
"match:initial_title .*streamlabs.com.*, no_shadow on"
"match:initial_title .*streamlabs.com.*, no_blur on"
"match:class ^vibe-typer$, match:title ^Recording Indicator$, no_blur on"
"border_color rgb(ffffff), match:xwayland 1"
];
"$mainMod" = "SUPER";
"$terminal" = "ghostty";
bind = [
"$mainMod, return, exec, $terminal nu -c zellij-ps"
"$mainMod, t, exec, $terminal -e nu -c 'nitch; exec nu'"
"$mainMod SHIFT, t, exec, launch-timer"
"$mainMod, n, exec, $terminal -e nvim"
"$mainMod, z, exec, uwsm app -- zeditor"
"$mainMod, o, exec, hyprctl dispatch setprop activewindow opaque toggle"
"$mainMod, r, exec, hyprctl dispatch focuswindow \"initialtitle:.*alert-box.*\" && hyprctl dispatch moveactive exact 4300 102 && hyprctl dispatch focuswindow \"initialtitle:.*chat-box.*\" && hyprctl dispatch moveactive exact 4300 512"
"$mainMod, b, exec, uwsm app -- thunar"
"$mainMod SHIFT, B, exec, uwsm app -- vivaldi"
"$mainMod, Escape, exec, uwsm app -- dms ipc call powermenu toggle"
# "$mainMod, Space, togglefloating"
"$mainMod, q, killactive"
"$mainMod, M, exit"
"$mainMod, F, fullscreen"
"$mainMod SHIFT, V, togglefloating"
"$mainMod, D, exec, uwsm app -- dms ipc call spotlight toggle"
"$mainMod, V, exec, uwsm app -- dms ipc call clipboard toggle"
"$mainMod, C, exec, bash -c 'FILE=/tmp/screenshot_$(date +%s).png; grim -g \"$(slurp)\" \"$FILE\" && ksnip \"$FILE\"'"
"$mainMod SHIFT, S, exec, uwsm app -- rofi -show emoji"
"$mainMod, P, exec, uwsm app -- rofi-pass"
"$mainMod SHIFT, P, pseudo"
"$mainMod, R, exec, stt-ptt start"
"$mainMod, S, exec, stt-ptt start"
# "$mainMod, J, togglesplit" # TODO
"$mainMod, h, movefocus, l"
"$mainMod, l, movefocus, r"
"$mainMod, k, movefocus, u"
"$mainMod, j, movefocus, d"
"$mainMod, 1, workspace, 1"
"$mainMod, 2, workspace, 2"
"$mainMod, 3, workspace, 3"
"$mainMod, 4, workspace, 4"
"$mainMod, 5, workspace, 5"
"$mainMod, 6, workspace, 6"
"$mainMod, 7, workspace, 7"
"$mainMod, 8, workspace, 8"
"$mainMod, 9, workspace, 9"
"$mainMod, 0, workspace, 10"
"$mainMod SHIFT, 1, movetoworkspace, 1"
"$mainMod SHIFT, 2, movetoworkspace, 2"
"$mainMod SHIFT, 3, movetoworkspace, 3"
"$mainMod SHIFT, 4, movetoworkspace, 4"
"$mainMod SHIFT, 5, movetoworkspace, 5"
"$mainMod SHIFT, 6, movetoworkspace, 6"
"$mainMod SHIFT, 7, movetoworkspace, 7"
"$mainMod SHIFT, 8, movetoworkspace, 8"
"$mainMod SHIFT, 9, movetoworkspace, 9"
"$mainMod SHIFT, 0, movetoworkspace, 10"
"$mainMod, mouse_down, workspace, e+1"
"$mainMod, mouse_up, workspace, e-1"
];
bindr = [
];
bindm = [
"$mainMod, mouse:272, movewindow"
"$mainMod, mouse:273, resizewindow"
]; ];
}; };
}; };
# services.hypridle = {
# enable = true;
# settings = {
# general = {
# before_sleep_cmd = "hyprlock";
# after_sleep_cmd = "hyprctl dispatch dpms on";
# inhibit_sleep = 3;
# };
# listener = [
# {
# timeout = 300;
# on-timeout = "hyprlock";
# }
# {
# timeout = 420;
# on-timeout = "hyprctl dispatch dpms off";
# on-resume = "hyprctl dispatch dpms on";
# }
# ];
# };
# };
# services.hyprpaper.enable = true;
# programs.hyprlock = {
# enable = true;
# settings = {
# "$font" = "JetBrainsMono Nerd Font";
# "$base" = "rgb(${config.colorScheme.palette.base00})";
# "$text" = "rgb(${config.colorScheme.palette.base05})";
# "$textAlpha" = "${config.colorScheme.palette.base05}";
# "$accentAlpha" = "${config.colorScheme.palette.base0D}";
# "$red" = "rgb(${config.colorScheme.palette.base08})";
# "$yellow" = "rgb(${config.colorScheme.palette.base0A})";
# general = {
# hide_cursor = true;
# };
# background = {
# monitor = "";
# path = "${config.home.homeDirectory}/.config/hypr/wallpapers/wallhaven-lmmo8r.jpg";
# blur_passes = 0;
# color = "rgb(${config.colorScheme.palette.base00})";
# };
# label = [
# {
# monitor = "";
# text = "$TIME";
# color = "$text";
# font_size = 90;
# font_family = "$font";
# position = "30, 0";
# halign = "left";
# valign = "top";
# }
# {
# monitor = "";
# text = ''cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"'';
# color = "$text";
# font_size = 25;
# font_family = "$font";
# position = "30, -150";
# halign = "left";
# valign = "top";
# }
# ];
# input-field = [
# {
# monitor = "";
# size = "300, 60";
# outline_thickness = 4;
# dots_size = 0.2;
# dots_spacing = 0.2;
# dots_center = true;
# outer_color = "rgb(${config.colorScheme.palette.base0D})";
# inner_color = "rgb(${config.colorScheme.palette.base00})";
# font_color = "rgb(${config.colorScheme.palette.base05})";
# fade_on_empty = false;
# placeholder_text = ''<span foreground="##${config.colorScheme.palette.base05}">󰌾 Logged in as <span foreground="##${config.colorScheme.palette.base0D}">$USER</span></span>'';
# hide_input = false;
# check_color = "rgb(${config.colorScheme.palette.base0D})";
# fail_color = "rgb(${config.colorScheme.palette.base08})";
# fail_text = ''<i>$FAIL <b>($ATTEMPTS)</b></i>'';
# capslock_color = "rgb(${config.colorScheme.palette.base0A})";
# position = "0, -35";
# halign = "center";
# valign = "center";
# }
# ];
# };
# };
}; };
} }
@@ -1,36 +0,0 @@
{config, ...}: {
programs.agent-lib = {
enable = true;
lockFile = config."m3ta-home".paths.srcRoot + "/agent-sources.lock.json";
targets.pi.enable = true;
targets.opencode.enable = true;
profiles.default = {
sources = {
m3ta-agents = {
agents = {
all = true;
};
skills = {
all = true;
exclude = ["brainstorming" "pdf" "systematic-debugging" "xlsx"];
};
};
anthropic.skills = {
all = true;
exclude = ["skill-creator"];
};
basecamp.skills.all = true;
kestra.skills.all = true;
mattpocock.skills = {
all = true;
};
superpowers.skills = {
all = true;
};
vercel.skills.all = true;
};
};
};
}
+14 -4
View File
@@ -19,14 +19,24 @@
}; };
imports = [ imports = [
# OpenCode, Pi, and Babysitter agent configurations # OpenCode and Pi agent configurations
./agents-lib.nix
./babysitter.nix
./opencode.nix ./opencode.nix
./pi.nix ./pi.nix
]; ];
coding.agents.babysitter.enable = true; coding.agents.skills = {
agentsInput = inputs.agents;
externalSkills = [
{
src = inputs.skills-anthropic;
selectSkills = ["pdf" "docx" "frontend-design"];
}
{src = inputs.skills-superpowers;}
{src = inputs.skills-vercel;}
{src = inputs.skills-basecamp;}
{src = inputs.skills-kestra;}
];
};
programs.mcp = { programs.mcp = {
enable = true; enable = true;
-142
View File
@@ -1,142 +0,0 @@
# Babysitter user profile for Pi/agent workflows.
{
config,
lib,
...
}: let
cfg = config.coding.agents.babysitter;
defaultTimestamp = "2026-05-29T00:00:00.000Z";
defaultUserProfile = {
name = config.home.username;
specialties = [
{
domain = "declarative-system-configuration";
subdomains = ["nix" "home-manager" "agents"];
}
];
expertiseLevels = {};
goals = [
{
id = "goal-agents-declarative-profile";
description = "Keep Babysitter user preferences declarative and reproducible across systems.";
category = "agents";
priority = "medium";
status = "active";
}
];
preferences = {
verbosity = "concise";
autonomyLevel = "semi-autonomous";
riskTolerance = "conservative";
};
toolPreferences = {
packageManagers = ["nix"];
languages = ["nix"];
operatingSystem = "nixos";
};
breakpointTolerance = {
global = "moderate";
skipBreakpointsForKnownPatterns = false;
alwaysBreakOn = ["destructive-operations" "secrets" "external-publication"];
};
communicationStyle = {
tone = "technical";
language = "en";
useEmojis = false;
explanationDepth = "brief";
preferredResponseFormat = "markdown";
};
experience = {};
installedPlugins = ["babysitter-pi"];
installedSkills = ["babysit" "call" "plan" "resume" "doctor" "yolo"];
installedAgents = [];
createdAt = defaultTimestamp;
updatedAt = defaultTimestamp;
version = 1;
};
effectiveProfile = lib.recursiveUpdate cfg.profile cfg.profileOverrides;
profileJsonTarget = "${cfg.profileDirectory}/user-profile.json";
profileMarkdownTarget = "${cfg.profileDirectory}/user-profile.md";
profilePreferences = effectiveProfile.preferences or {};
profileBreakpointTolerance = effectiveProfile.breakpointTolerance or {};
listMarkdown = values:
lib.concatMapStringsSep "\n" (value: "- ${toString value}") values;
specialtyDomains = map (specialty: specialty.domain or "unspecified") (effectiveProfile.specialties or []);
profileMarkdown = ''
# Babysitter User Profile
This file is generated by Home Manager from `coding.agents.babysitter`.
- Name: ${effectiveProfile.name or "unspecified"}
- Breakpoint tolerance: ${profileBreakpointTolerance.global or "unspecified"}
- Autonomy level: ${profilePreferences.autonomyLevel or "unspecified"}
- Risk tolerance: ${profilePreferences.riskTolerance or "unspecified"}
## Specialties
${listMarkdown specialtyDomains}
## Installed Babysitter Pi Skills
${listMarkdown (effectiveProfile.installedSkills or [])}
'';
in {
options.coding.agents.babysitter = {
enable = lib.mkEnableOption "Babysitter user profile for Pi/agent workflows";
profileDirectory = lib.mkOption {
type = lib.types.str;
default = ".a5c";
description = ''
Home-relative directory where Babysitter reads the user profile.
Babysitter Pi documents the user profile at ~/.a5c/user-profile.json.
'';
};
profile = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = defaultUserProfile;
description = "Complete non-secret Babysitter user profile JSON.";
};
profileOverrides = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = {};
description = ''
Recursive overrides merged into the default Babysitter user profile.
Keep this non-secret; the result is written into the Nix store.
'';
};
};
config = lib.mkIf cfg.enable {
assertions = [
{
assertion = cfg.profileDirectory != "" && !lib.hasPrefix "/" cfg.profileDirectory;
message = "coding.agents.babysitter.profileDirectory must be a non-empty home-relative path.";
}
{
assertion = effectiveProfile ? name && builtins.isString effectiveProfile.name;
message = "coding.agents.babysitter profile must include a string name.";
}
{
assertion = effectiveProfile ? specialties && builtins.isList effectiveProfile.specialties;
message = "coding.agents.babysitter profile must include a specialties list.";
}
{
assertion = effectiveProfile ? breakpointTolerance && effectiveProfile.breakpointTolerance ? global;
message = "coding.agents.babysitter profile must include breakpointTolerance.global.";
}
];
home.file = {
"${profileJsonTarget}".text = builtins.toJSON effectiveProfile + "\n";
"${profileMarkdownTarget}".text = profileMarkdown;
};
};
}
+10 -1
View File
@@ -1,4 +1,13 @@
{lib, ...}: { {
inputs,
lib,
...
}: {
coding.agents.opencode = {
enable = true;
agentsInput = inputs.agents;
};
coding.opencode = { coding.opencode = {
enable = true; enable = true;
+33 -5
View File
@@ -1,11 +1,39 @@
{...}: { {inputs, ...}: {
coding.agents.pi = { coding.agents.pi = {
enable = true; enable = true;
agentsInput = inputs.agents;
modelOverrides = {
chiron = "minimax/MiniMax-M2.7";
chiron-forge = "minimax/MiniMax-M2.7";
};
# Coding rules for Pi agent
# Rules sourced from AGENTS repo
codingRules = {
# Language-specific rules
languages = [
"nix" # Nix language conventions
];
# Standard concerns from AGENTS repo
concerns = [
"coding-style" # General coding principles
"naming" # Naming conventions (camelCase, snake_case, etc.)
"documentation" # Documentation standards
"testing" # Testing guidelines (Arrange-Act-Assert)
"git-workflow" # Conventional commits, branch naming
"git-identity" # Git identity configuration for agents
"project-structure" # Project layout conventions
];
# No framework-specific rules for NixOS config
frameworks = [];
};
settings = { settings = {
packages = [ packages = [
"npm:@dreadedzombie/pi-init" "npm:@dreadedzombie/pi-init"
"git:github.com/a5c-ai/babysitter-pi"
"npm:@plannotator/pi-extension" "npm:@plannotator/pi-extension"
"npm:@thesethrose/pi-zai-provider" "npm:@thesethrose/pi-zai-provider"
"npm:pi-agent-browser-native" "npm:pi-agent-browser-native"
@@ -21,8 +49,8 @@
"git:github.com/hk-vk/pi-connect" "git:github.com/hk-vk/pi-connect"
]; ];
defaultProvider = "openai-codex"; defaultProvider = "minimax";
defaultModel = "gpt-5.5"; defaultModel = "MiniMax-M2.7";
defaultThinkingLevel = "high"; defaultThinkingLevel = "high";
}; };
@@ -31,7 +59,7 @@
# NOTE: Local project .pi/extensions/guardrails.json can override same rule IDs. # NOTE: Local project .pi/extensions/guardrails.json can override same rule IDs.
# For immutable global policies, consider a wrapper or upstream patch. # For immutable global policies, consider a wrapper or upstream patch.
guardrails = { guardrails = {
enable = false; enable = true;
config = { config = {
enabled = true; enabled = true;
applyBuiltinDefaults = true; applyBuiltinDefaults = true;
-1
View File
@@ -9,6 +9,5 @@
jq jq
ripgrep ripgrep
tree tree
worktrunk
]; ];
} }