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
30 changed files with 633 additions and 3191 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
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 MiB

Generated
+38 -396
View File
@@ -21,52 +21,14 @@
"type": "github" "type": "github"
} }
}, },
"agent-lib": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1781348569,
"narHash": "sha256-1BJtmKSqtD0CD753ZE37RgxvCJK6Iw3iKLDDaS8trY4=",
"ref": "refs/heads/master",
"rev": "75a2ed2533b4d6d8e4a34acd37e83d98d81a5fb0",
"revCount": 30,
"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": 1783016143,
"narHash": "sha256-3qejDAo4g2XfzTyWCaX8RVKH17JXnw/fujsbXQA+Mzc=",
"ref": "refs/heads/master",
"rev": "83284d752d2ac325d4bf3ab7b38acad1c2fffe3a",
"revCount": 98,
"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": 1783016143, "lastModified": 1777399938,
"narHash": "sha256-3qejDAo4g2XfzTyWCaX8RVKH17JXnw/fujsbXQA+Mzc=", "narHash": "sha256-xXPqUQezDdDtF8MbpZnwD1HkybOYwF92evx8rJ6OXCU=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "83284d752d2ac325d4bf3ab7b38acad1c2fffe3a", "rev": "9a91f1ee0cf011a7eaf1f16a9e17610b0457e055",
"revCount": 98, "revCount": 85,
"type": "git", "type": "git",
"url": "https://code.m3ta.dev/m3tam3re/AGENTS" "url": "https://code.m3ta.dev/m3tam3re/AGENTS"
}, },
@@ -99,16 +61,16 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1785348116, "lastModified": 1774505501,
"narHash": "sha256-AVycTcomtfvQJ/AHvMg5xu7lVoOzDXxjN+pV7mqUIQ4=", "narHash": "sha256-7UiRrDptj7yuEFwToOfdunUMz/i3jRLR7CmMoYQjq6k=",
"owner": "basecamp", "owner": "basecamp",
"repo": "basecamp-cli", "repo": "basecamp-cli",
"rev": "e1059fb123a03295ce6176272e4bbaf43d7971c6", "rev": "f087e6ef84002503d0dbc75ea1c8c928a8928d9e",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "basecamp", "owner": "basecamp",
"ref": "v0.8.0-rc.1", "ref": "v0.7.2",
"repo": "basecamp-cli", "repo": "basecamp-cli",
"type": "github" "type": "github"
} }
@@ -135,86 +97,7 @@
"type": "github" "type": "github"
} }
}, },
"dms": {
"inputs": {
"flake-compat": "flake-compat",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1785111455,
"narHash": "sha256-aTNuC9NDBnYAeEtFsleeUwmGX3AZlKOutbl+LQRPkmQ=",
"owner": "AvengeMedia",
"repo": "DankMaterialShell",
"rev": "069ddab041c738236a8910e4c39b65d9628d3018",
"type": "github"
},
"original": {
"owner": "AvengeMedia",
"ref": "stable",
"repo": "DankMaterialShell",
"type": "github"
}
},
"dms-plugin-registry": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1785375021,
"narHash": "sha256-SV24PP3ctDSAuQjg0LdYAvzN7GEustIrtZfciiSrgRI=",
"owner": "AvengeMedia",
"repo": "dms-plugin-registry",
"rev": "672e213a1e20b980708d81bd82df9bf85c15a590",
"type": "github"
},
"original": {
"owner": "AvengeMedia",
"repo": "dms-plugin-registry",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1767039857,
"narHash": "sha256-vNpUSpF5Nuw8xvDLj2KCwwksIbjua2LZCqhV1LNRDns=",
"owner": "NixOS",
"repo": "flake-compat",
"rev": "5edf11c44bc78a0d334f6334cdaf7d60d732daab",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": { "flake-parts": {
"inputs": {
"nixpkgs-lib": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1772408722,
"narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-parts_2": {
"inputs": { "inputs": {
"nixpkgs-lib": [ "nixpkgs-lib": [
"nur", "nur",
@@ -235,32 +118,6 @@
"type": "github" "type": "github"
} }
}, },
"hermes-agent": {
"inputs": {
"flake-parts": "flake-parts",
"nixpkgs": [
"nixpkgs"
],
"npm-lockfile-fix": "npm-lockfile-fix",
"pyproject-build-systems": "pyproject-build-systems",
"pyproject-nix": "pyproject-nix_2",
"uv2nix": "uv2nix_2"
},
"locked": {
"lastModified": 1782936460,
"narHash": "sha256-Wt72AQtA6Eizi7Ubj23JBhwZ7GKYcjY4mcV6upqHOaU=",
"owner": "NousResearch",
"repo": "hermes-agent",
"rev": "7c1a029553d87c43ecff8a3821336bc95872213b",
"type": "github"
},
"original": {
"owner": "NousResearch",
"ref": "v2026.7.1",
"repo": "hermes-agent",
"type": "github"
}
},
"home-manager": { "home-manager": {
"inputs": { "inputs": {
"nixpkgs": [ "nixpkgs": [
@@ -289,11 +146,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1785306346, "lastModified": 1779113444,
"narHash": "sha256-DScBkW0fOgpGPK2trNoX3ryLTlaC14+gglFo/BhGJ4g=", "narHash": "sha256-/L61sT1PIKmGWIQpIh0uJGH/ANvcsf6y4alxtb9kelg=",
"owner": "nix-community", "owner": "nix-community",
"repo": "home-manager", "repo": "home-manager",
"rev": "e705714e918c3b11affcdd15db2cbe3a070420a0", "rev": "74f170c62d57f90e656841f1f699e6bdf40f0a24",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -304,21 +161,20 @@
}, },
"m3ta-nixpkgs": { "m3ta-nixpkgs": {
"inputs": { "inputs": {
"agents": "agents_2", "agents": "agents",
"basecamp": "basecamp", "basecamp": "basecamp",
"nixpkgs": [ "nixpkgs": [
"nixpkgs" "nixpkgs"
], ],
"nixpkgs-master": "nixpkgs-master", "nixpkgs-master": "nixpkgs-master",
"opencode": "opencode",
"openspec": "openspec" "openspec": "openspec"
}, },
"locked": { "locked": {
"lastModified": 1785670526, "lastModified": 1778508052,
"narHash": "sha256-tC1CW+Kxh9ZZxJC0y472i0KoieMqNwNi+AiCmS4n7To=", "narHash": "sha256-kxzZvJv757TGfHReR21aX6N/jkGMWzGSy9GQEclYD4Y=",
"ref": "refs/heads/master", "ref": "refs/heads/master",
"rev": "69fce234a8607cd3e71233831564b8ceeba70626", "rev": "8113723a48c4afa016881ccd5bc4be3fad2c7d5f",
"revCount": 374, "revCount": 294,
"type": "git", "type": "git",
"url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs" "url": "ssh://gitea@code.m3ta.dev/m3tam3re/nixpkgs"
}, },
@@ -379,11 +235,11 @@
}, },
"nixpkgs-master": { "nixpkgs-master": {
"locked": { "locked": {
"lastModified": 1785386845, "lastModified": 1778507606,
"narHash": "sha256-CvXXTgWxbwTn6Diev4nLTP5+8tsFtth/SQAtaR9iVY0=", "narHash": "sha256-6Yc2dIhijc8G+dbMNocyclxF19dUrjaT+EeXGrXmXlg=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "3c5a718ce27c9283364d4c664fac4e4a23acdfb4", "rev": "39a7b8d815fcc8b689d56fc4a3fa8de4ef93d169",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -395,59 +251,27 @@
}, },
"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" "type": "github"
}, },
"original": { "original": {
"owner": "NixOS", "owner": "NixOS",
"ref": "nixpkgs-unstable", "ref": "nixos-unstable",
"repo": "nixpkgs", "repo": "nixpkgs",
"type": "github" "type": "github"
} }
}, },
"nixpkgs_3": { "nixpkgs_3": {
"locked": { "locked": {
"lastModified": 1776683584, "lastModified": 1777954456,
"narHash": "sha256-NuTLMrr10Tng72hurYG8jYQ4XKK8wnpJmOGcPiis96g=", "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9dd5558b06dbdacbf635a3dd36dce1b1a7ee3a89",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1785318670,
"narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1785318670,
"narHash": "sha256-dN6Ou5x/+23FZLEpYP3IffO+NyJFzUlGumt1uu3MMaY=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "0954f7ee2f6bb3dc7d4e3d0d8bcb8fd4bde4cfc5", "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -457,62 +281,22 @@
"type": "github" "type": "github"
} }
}, },
"npm-lockfile-fix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1775903712,
"narHash": "sha256-2GV79U6iVH4gKAPWYrxUReB0S41ty/Y3dBLquU8AlaA=",
"owner": "jeslie0",
"repo": "npm-lockfile-fix",
"rev": "c6093acb0c0548e0f9b8b3d82918823721930fe8",
"type": "github"
},
"original": {
"owner": "jeslie0",
"repo": "npm-lockfile-fix",
"type": "github"
}
},
"nur": { "nur": {
"inputs": { "inputs": {
"flake-parts": "flake-parts_2", "flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1785395064,
"narHash": "sha256-ZZoXKpTETeIU93xQOxleE27JWT1FcpF9pe1nSPrFbuw=",
"owner": "nix-community",
"repo": "NUR",
"rev": "cce2408845d0298ae0dcc42582c1d8b390de105c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "NUR",
"type": "github"
}
},
"opencode": {
"inputs": {
"nixpkgs": "nixpkgs_3" "nixpkgs": "nixpkgs_3"
}, },
"locked": { "locked": {
"lastModified": 1785386452, "lastModified": 1778506944,
"narHash": "sha256-iYfkMmn1ZKbi0cv8XIAXVgPH4idzsVSK4cWyi/KGMJQ=", "narHash": "sha256-lU0Bleh0reE+WU7j8Uiqsu6ekPav50L8sXsgOvEQS+0=",
"owner": "anomalyco", "owner": "nix-community",
"repo": "opencode", "repo": "NUR",
"rev": "f7204902192624481e526b1852cdedaadb914e24", "rev": "0166493cfe4e0e9927435c1cfbf5505cfb0d10d1",
"type": "github" "type": "github"
}, },
"original": { "original": {
"owner": "anomalyco", "owner": "nix-community",
"ref": "dev", "repo": "NUR",
"repo": "opencode",
"type": "github" "type": "github"
} }
}, },
@@ -524,11 +308,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1785371113, "lastModified": 1778120451,
"narHash": "sha256-r3fwnb5gMTV9UXBj7bqkKpTZIWwF4AgghULOIv2Fr4c=", "narHash": "sha256-MUSPD16+hoFBfQWYahtNLN2BIFEAlFFo2KNofrc947g=",
"owner": "Fission-AI", "owner": "Fission-AI",
"repo": "OpenSpec", "repo": "OpenSpec",
"rev": "2b3d368539132be6311e55db58899abbf5306b81", "rev": "053d8a59d587f3c027a06ad80503a6b43d4f2a92",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -537,106 +321,13 @@
"type": "github" "type": "github"
} }
}, },
"pyproject-build-systems": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
],
"pyproject-nix": "pyproject-nix",
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1772555609,
"narHash": "sha256-3BA3HnUvJSbHJAlJj6XSy0Jmu7RyP2gyB/0fL7XuEDo=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "c37f66a953535c394244888598947679af231863",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"type": "github"
}
},
"pyproject-nix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"pyproject-build-systems",
"nixpkgs"
]
},
"locked": {
"lastModified": 1769936401,
"narHash": "sha256-kwCOegKLZJM9v/e/7cqwg1p/YjjTAukKPqmxKnAZRgA=",
"owner": "nix-community",
"repo": "pyproject.nix",
"rev": "b0d513eeeebed6d45b4f2e874f9afba2021f7812",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "pyproject.nix",
"type": "github"
}
},
"pyproject-nix_2": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
]
},
"locked": {
"lastModified": 1772865871,
"narHash": "sha256-/ZTSg97aouL0SlPHaokA4r3iuH9QzHVuWPACD2CUCFY=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "e537db02e72d553cea470976b9733581bcf5b3ed",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"pyproject-nix_3": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"uv2nix",
"nixpkgs"
]
},
"locked": {
"lastModified": 1771518446,
"narHash": "sha256-nFJSfD89vWTu92KyuJWDoTQJuoDuddkJV3TlOl1cOic=",
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"rev": "eb204c6b3335698dec6c7fc1da0ebc3c6df05937",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "pyproject.nix",
"type": "github"
}
},
"root": { "root": {
"inputs": { "inputs": {
"agenix": "agenix", "agenix": "agenix",
"agent-lib": "agent-lib",
"agents": "agents",
"dms": "dms",
"dms-plugin-registry": "dms-plugin-registry",
"hermes-agent": "hermes-agent",
"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_4", "nixpkgs": "nixpkgs_2",
"nur": "nur" "nur": "nur"
} }
}, },
@@ -654,55 +345,6 @@
"repo": "default", "repo": "default",
"type": "github" "type": "github"
} }
},
"uv2nix": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"pyproject-build-systems",
"nixpkgs"
],
"pyproject-nix": [
"hermes-agent",
"pyproject-build-systems",
"pyproject-nix"
]
},
"locked": {
"lastModified": 1770770348,
"narHash": "sha256-A2GzkmzdYvdgmMEu5yxW+xhossP+txrYb7RuzRaqhlg=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "5d1b2cb4fe3158043fbafbbe2e46238abbc954b0",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"type": "github"
}
},
"uv2nix_2": {
"inputs": {
"nixpkgs": [
"hermes-agent",
"nixpkgs"
],
"pyproject-nix": "pyproject-nix_3"
},
"locked": {
"lastModified": 1773039484,
"narHash": "sha256-+boo33KYkJDw9KItpeEXXv8+65f7hHv/earxpcyzQ0I=",
"owner": "pyproject-nix",
"repo": "uv2nix",
"rev": "b68be7cfeacbed9a3fa38a2b5adc0cfb81d9bb1f",
"type": "github"
},
"original": {
"owner": "pyproject-nix",
"repo": "uv2nix",
"type": "github"
}
} }
}, },
"root": "root", "root": "root",
+9 -35
View File
@@ -16,52 +16,26 @@
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-legacy";
inputs.nixpkgs.follows = "nixpkgs";
};
hermes-agent = {
url = "github:NousResearch/hermes-agent/v2026.7.1";
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";
}; };
outputs = {self, ...} @ inputs: { outputs = {
self,
nixpkgs,
...
} @ inputs: let
lib = nixpkgs.lib;
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;
+2 -13
View File
@@ -1,16 +1,5 @@
# lib/default.nix — Entry point for m3ta-home library functions. # lib/default.nix — Entry point for m3ta-home library functions.
# #
# Called by flake.nix: import ./lib { inherit inputs; selfPath = self.outPath; } # Called by flake.nix: import ./lib { inherit inputs; selfPath = self.outPath; }
# Re-exports mkHome and focused helpers for consumers that should not depend on # Re-exports mkHome and future library functions.
# m3ta-home's implementation inputs directly. {inputs, selfPath}: import ./mkHome.nix {inherit inputs selfPath;}
{
inputs,
selfPath,
}: let
mkHomeLib = import ./mkHome.nix {inherit inputs selfPath;};
in
mkHomeLib
// {
mkHermesSkillsDir = {system, ...} @ args:
inputs.agent-lib.lib.${system}.mkHermesSkillsDir (builtins.removeAttrs args ["system"]);
}
+1 -13
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,13 +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
inputs.nix-colors.homeManagerModules.default
inputs.m3ta-nixpkgs.homeManagerModules.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
@@ -99,8 +89,6 @@ in {
++ contextImport ++ contextImport
++ setImports; ++ setImports;
_module.args.m3taHomeInputs = inputs;
# Set the flake source root for asset path resolution # Set the flake source root for asset path resolution
"m3ta-home".paths.srcRoot = selfPath; "m3ta-home".paths.srcRoot = selfPath;
+3 -9
View File
@@ -8,15 +8,11 @@
{ {
inputs, inputs,
selfPath, selfPath,
}: { }: let
lib = inputs.nixpkgs.lib;
in {
default = { default = {
imports = [ imports = [
# External modules
inputs.agent-lib.homeManagerModules.default
inputs.dms.homeModules.default
inputs.dms-plugin-registry.homeModules.default
inputs.nix-colors.homeManagerModules.default
inputs.m3ta-nixpkgs.homeManagerModules.default
# Paths — must be first, provides "m3ta-home".paths.srcRoot # Paths — must be first, provides "m3ta-home".paths.srcRoot
./paths.nix ./paths.nix
@@ -34,8 +30,6 @@
./../users/m3tam3re/identities/work.nix ./../users/m3tam3re/identities/work.nix
]; ];
_module.args.m3taHomeInputs = inputs;
# Set the source root for asset path resolution # Set the source root for asset path resolution
"m3ta-home".paths.srcRoot = selfPath; "m3ta-home".paths.srcRoot = selfPath;
}; };
+1
View File
@@ -13,6 +13,7 @@
./packages.nix ./packages.nix
./television.nix ./television.nix
./zellij.nix ./zellij.nix
./zellij-ps.nix
./zoxide.nix ./zoxide.nix
]; ];
} }
+3 -10
View File
@@ -2,19 +2,16 @@
{ {
config, config,
lib, lib,
options,
... ...
}: }:
with lib; let with lib; let
cfg = config.base.cliTools.fzf; cfg = config.base.cliTools.fzf;
changeDirWidgetCommand = "fd --type d --exclude .git --follow --hidden";
in { in {
# Enabled by default — base modules are always-on. # Enabled by default — base modules are always-on.
options.base.cliTools.fzf.enable = (mkEnableOption "enable fuzzy finder") // {default = true;}; options.base.cliTools.fzf.enable = (mkEnableOption "enable fuzzy finder") // {default = true;};
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.fzf = programs.fzf = {
{
enable = true; enable = true;
enableFishIntegration = true; enableFishIntegration = true;
colors = { colors = {
@@ -38,11 +35,7 @@ in {
"--bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort'" "--bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort'"
]; ];
defaultCommand = "fd --type f --exclude .git --follow --hidden"; defaultCommand = "fd --type f --exclude .git --follow --hidden";
} changeDirWidgetCommand = "fd --type d --exclude .git --follow --hidden";
// ( };
if options.programs.fzf ? changeDirWidget
then {changeDirWidget.command = changeDirWidgetCommand;}
else {inherit changeDirWidgetCommand;}
);
}; };
} }
+30
View File
@@ -0,0 +1,30 @@
# Zellij-ps — project-aware Zellij session manager from m3ta-nixpkgs.
# Delegates to `cli.zellij-ps` — the home-manager module namespace provided by
# m3ta-nixpkgs. Requires m3ta-nixpkgs overlays to be applied to pkgs
# (via home-manager.useGlobalPkgs = true in NixOS, or overlays in standalone).
{
config,
lib,
...
}:
with lib; let
cfg = config.base.cliTools.zellijPs;
in {
options.base.cliTools.zellijPs = {
# Enabled by default — base modules are always-on.
enable = (mkEnableOption "enable zellij-ps project session manager") // {default = true;};
projectFolders = mkOption {
type = types.listOf types.path;
description = "Project root folders scanned by zellij-ps.";
default = ["${config.home.homeDirectory}/p"];
};
};
config = mkIf cfg.enable {
cli.zellij-ps = {
enable = true;
projectFolders = cfg.projectFolders;
};
};
}
+8 -5
View File
@@ -1,6 +1,7 @@
# profiles/base/default.nix — Always loaded on every host. # profiles/base/default.nix — Always loaded on every host.
# #
# Provides: # Provides:
# - nix-colors and m3ta-nixpkgs HM module imports
# - Shell (nushell, fish, starship) with enable options # - Shell (nushell, fish, starship) with enable options
# - CLI tools (bat, carapace, direnv, eza, fzf, lf, nitch, television, zellij, zoxide) # - CLI tools (bat, carapace, direnv, eza, fzf, lf, nitch, television, zellij, zoxide)
# - Secrets management (pass-wayland) # - Secrets management (pass-wayland)
@@ -8,19 +9,21 @@
# - Base packages # - Base packages
# #
# NOTE: Overlays are NOT set here. The consuming flake (nixos-config) handles # NOTE: Overlays are NOT set here. The consuming flake (nixos-config) handles
# overlays at the NixOS level via nixpkgs.overlays. External HM modules are # overlays at the NixOS level via nixpkgs.overlays. This module only imports
# imported by mkHome/modules/default.nix. This module only imports base profile # HM modules and sets user-level preferences.
# submodules and sets user-level preferences.
# #
# When used standalone (not through NixOS), overlays should be set by the # When used standalone (not through NixOS), overlays should be set by the
# standalone HM configuration or by the consuming flake. # standalone HM configuration or by the consuming flake.
{ {
inputs,
lib, lib,
m3taHomeInputs,
pkgs, pkgs,
... ...
}: { }: {
imports = [ imports = [
inputs.nix-colors.homeManagerModules.default
inputs.m3ta-nixpkgs.homeManagerModules.default
./shell ./shell
./cli-tools ./cli-tools
./secrets ./secrets
@@ -41,7 +44,7 @@
}; };
# ── Color scheme ── # ── Color scheme ──
colorScheme = m3taHomeInputs.nix-colors.colorSchemes.dracula; colorScheme = inputs.nix-colors.colorSchemes.dracula;
# ── Base packages ── # ── Base packages ──
home.packages = with pkgs; [ home.packages = with pkgs; [
-13
View File
@@ -6,8 +6,6 @@
}: }:
with lib; let with lib; let
cfg = config.base.shell.nushell; cfg = config.base.shell.nushell;
# User-specific secrets file from agenix, resolved at build time.
secretsFile = "/run/agenix/${config.home.username}-secrets";
in { in {
# Enabled by default — base modules are always-on. # Enabled by default — base modules are always-on.
options.base.shell.nushell.enable = (mkEnableOption "enable nushell") // {default = true;}; options.base.shell.nushell.enable = (mkEnableOption "enable nushell") // {default = true;};
@@ -43,17 +41,6 @@ in {
| transpose -r -d | transpose -r -d
| load-env | load-env
} }
# Load user-specific secrets from agenix. The secret file is Nushell code
# containing a `load-env { ... }` block, not KEY=VALUE lines.
# `source` resolves literal paths at parse time, so use `null` when absent.
# Path is resolved at Nix build time via config.home.username.
const user_secrets_file = if ("${secretsFile}" | path exists) {
"${secretsFile}"
} else {
null
}
source $user_secrets_file
''; '';
configFile.text = '' configFile.text = ''
+56 -62
View File
@@ -1,7 +1,7 @@
# Desktop environment aggregator — only loaded when context=desktop. # Desktop environment aggregator — only loaded when context=desktop.
# Includes window manager, applications, theming, and desktop session config. # Includes window manager, applications, theming, and desktop session config.
{ {
m3taHomeInputs, config,
pkgs, pkgs,
... ...
}: { }: {
@@ -38,8 +38,7 @@
}; };
}; };
home = { home.sessionVariables = {
sessionVariables = {
WEBKIT_DISABLE_COMPOSITING_MODE = "1"; WEBKIT_DISABLE_COMPOSITING_MODE = "1";
NIXOS_OZONE_WL = "1"; NIXOS_OZONE_WL = "1";
TERMINAL = "ghostty"; TERMINAL = "ghostty";
@@ -49,47 +48,13 @@
XDG_SESSION_DESKTOP = "Hyprland"; XDG_SESSION_DESKTOP = "Hyprland";
}; };
sessionPath = [ home.sessionPath = [
"\${XDG_BIN_HOME}" "\${XDG_BIN_HOME}"
"\${HOME}/.cargo/bin" "\${HOME}/.cargo/bin"
"$HOME/.npm-global/bin" "$HOME/.npm-global/bin"
"$HOME/.cache/.bun/bin" "$HOME/.cache/.bun/bin"
]; ];
pointerCursor = {
enable = true;
gtk.enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 20;
};
packages = with pkgs; [
appimage-run
bemoji
google-chrome
dconf
(element-desktop.override {
commandLineArgs = "--password-store=gnome-libsecret";
})
m3taHomeInputs.hermes-agent.packages.${pkgs.stdenv.hostPlatform.system}.desktop
launch-webapp
file-roller
gsettings-desktop-schemas
seahorse
sushi
ksnip
nwg-look
qt6Packages.qt6ct
rose-pine-hyprcursor
remmina
slack
vivaldi
vivaldi-ffmpeg-codecs
vibetyper
];
};
fonts.fontconfig.enable = true; fonts.fontconfig.enable = true;
programs.ghostty = { programs.ghostty = {
@@ -99,30 +64,59 @@
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}" ];
# ];
}; };
}; };
home.pointerCursor = {
gtk.enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
size = 20;
};
home.packages = with pkgs; [
appimage-run
bemoji
eigent
(element-desktop.override {
commandLineArgs = "--password-store=gnome-libsecret";
})
launch-webapp
file-roller
hyprpanel
hyprpaper-random
seahorse
sushi
ksnip
nwg-look
rose-pine-hyprcursor
remmina
slack
vivaldi
vivaldi-ffmpeg-codecs
vibetyper
];
} }
+6 -7
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,
@@ -6,19 +6,18 @@
}: { }: {
qt = { qt = {
enable = true; enable = true;
platformTheme.name = "gtk3"; platformTheme.name = "gtk";
}; };
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;
};
};
};
}
+249 -518
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,108 +8,49 @@
}: }:
with lib; let with lib; let
cfg = config.desktop.wm.hyprland; cfg = config.desktop.wm.hyprland;
lua = lib.generators.mkLuaInline; p = config.colorScheme.palette;
luaString = builtins.toJSON;
mkEnvVar = name: value: {
_args = [
name
value
];
};
modKey = key: lua ''mainMod .. " + ${key}"'';
mkDispatcher = expression: lua expression;
execCmd = command: "hl.dsp.exec_cmd(${luaString command})";
execExpr = expression: "hl.dsp.exec_cmd(${expression})";
mkBinding = keys: dispatcher: {
_args = [
keys
(mkDispatcher dispatcher)
];
};
mkBindingWithOptions = keys: dispatcher: options: {
_args = [
keys
(mkDispatcher dispatcher)
options
];
};
startupCommand = command: {
_args = [
"hyprland.start"
(lua ''
function()
hl.exec_cmd(${luaString command})
end
'')
];
};
focusWorkspace = workspace: "hl.dsp.focus({ workspace = ${luaString workspace} })";
moveToWorkspace = workspace: "hl.dsp.window.move({ workspace = ${luaString workspace} })";
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 = "lua"; configType = "lua";
extraLuaFiles."00-dms" = {
autoLoad = true;
content = ''
-- DMS setup/runtime owns these modules. Load only the Lua equivalents
-- of the pre-migration active sources, before local Home Manager
-- settings, preserving the old source-first order without enabling new
-- DMS default binds or rules.
--
-- Keep fresh Home Manager generations usable before DMS has written
-- ~/.config/hypr/dms/*.lua.
local function require_if_present(module)
if package.searchpath(module, package.path) ~= nil then
require(module)
end
end
require_if_present("dms.colors")
require_if_present("dms.layout")
require_if_present("dms.outputs")
'';
};
settings = { settings = {
mainMod = { # ── Lua local variables (rendered as: local mainMod = "SUPER") ──
_var = "SUPER"; mainMod = {_var = "SUPER";};
}; terminal = {_var = "ghostty";};
terminal = {
_var = "ghostty";
};
# ── Config sections (rendered as: hl.config({...})) ──
config = { config = {
xwayland = { xwayland = {force_zero_scaling = true;};
force_zero_scaling = true;
};
input = { input = {
kb_layout = "us"; kb_layout = "de,us";
kb_variant = ""; kb_variant = "";
kb_model = ""; kb_model = "";
kb_rules = ""; kb_rules = "";
kb_options = "ctrl:nocaps"; kb_options = "ctrl:nocaps";
follow_mouse = 1; follow_mouse = 1;
}; };
general = { general = {
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";
}; };
decoration = { decoration = {
shadow = { shadow = {
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;
@@ -119,470 +62,258 @@ in {
active_opacity = 0.9; active_opacity = 0.9;
inactive_opacity = 0.5; inactive_opacity = 0.5;
}; };
animations = {
enabled = true; animations = {enabled = true;};
};
dwindle = { dwindle = {
# pseudotile = true; # TODO pseudotile = true;
preserve_split = true; preserve_split = true;
}; };
master = {
new_status = "master"; master = {new_status = "master";};
};
}; };
on = [ # ── Environment variables (rendered as: hl.env("KEY", "VALUE")) ──
(startupCommand "vibetyper") env = [
]; { _args = ["XCURSOR_SIZE" "32"]; }
{ _args = ["HYPRCURSOR_THEME" "Bibata-Modern-Ice"]; }
"env" = [ { _args = ["WLR_NO_HARDWARE_CURSORS" "1"]; }
(mkEnvVar "XCURSOR_SIZE" "32") { _args = ["GTK_THEME" "Dracula"]; }
(mkEnvVar "HYPRCURSOR_THEME" "Bibata-Modern-Ice") { _args = ["XDG_CURRENT_DESKTOP" "Hyprland"]; }
(mkEnvVar "WLR_NO_HARDWARE_CURSORS" "1") { _args = ["XDG_SESSION_TYPE" "wayland"]; }
(mkEnvVar "XDG_CURRENT_DESKTOP" "Hyprland") { _args = ["XDG_SESSION_DESKTOP" "Hyprland"]; }
(mkEnvVar "XDG_SESSION_TYPE" "wayland") { _args = ["XKB_DEFAULT_LAYOUT" "de"]; }
(mkEnvVar "XDG_SESSION_DESKTOP" "Hyprland") { _args = ["NIXOS_OZONE_WL" "1"]; }
(mkEnvVar "XKB_DEFAULT_LAYOUT" "de")
(mkEnvVar "NIXOS_OZONE_WL" "1")
(mkEnvVar "QT_QPA_PLATFORM" "wayland;xcb")
(mkEnvVar "QT_QPA_PLATFORMTHEME" "gtk3")
(mkEnvVar "QT_QPA_PLATFORMTHEME_QT6" "gtk3")
]; ];
# ── Per-device config (rendered as: hl.device({...})) ──
device = [ device = [
# Alle normalen Keyboards explizit auf de setzen: {name = "epic-mouse-v1"; sensitivity = -0.5;}
{ {name = "zsa-technology-labs-moonlander-mark-i"; kb_layout = "us";}
name = "video-bus"; {name = "keychron-keychron-k7"; kb_layout = "us";}
kb_layout = "de,us";
kb_options = "ctrl:nocaps";
}
{
name = "razer-razer-pro-click-v2-vertical-edition-keyboard";
kb_layout = "de,us";
kb_options = "ctrl:nocaps";
}
{
name = "razer-razer-pro-click-v2-vertical-edition-1";
kb_layout = "de,us";
kb_options = "ctrl:nocaps";
}
{
name = "vibe-typer-virtual-keyboard";
kb_layout = "de";
kb_options = "ctrl:nocaps";
}
{
name = "keychron-keychron-k7";
kb_layout = "us";
kb_options = "ctrl:nocaps";
}
# Moonlander Sub-Devices bleiben us (erben global)
{
name = "zsa-technology-labs-moonlander-mark-i-consumer-control";
kb_layout = "us";
kb_options = "ctrl:nocaps";
}
{
name = "zsa-technology-labs-moonlander-mark-i-keyboard";
kb_layout = "us";
kb_options = "ctrl:nocaps";
}
{
name = "zsa-technology-labs-moonlander-mark-i-system-control";
kb_layout = "us";
kb_options = "ctrl:nocaps";
}
];
curve = {
_args = [
"myBezier"
(lua ''{ type = "bezier", points = { { 0.05, 0.9 }, { 0.1, 1.05 } } }'')
]; ];
}; };
animation = [ # ── Complex Lua: curves, animations, binds, window rules, startup ──
{ extraConfig = ''
leaf = "windows"; -- Bezier curves
enabled = true; hl.curve("myBezier", { type = "bezier", points = { {0.05, 0.9}, {0.1, 1.05} } })
speed = 7;
bezier = "myBezier";
}
{
leaf = "windowsOut";
enabled = true;
speed = 7;
bezier = "default";
style = "popin 80%";
}
{
leaf = "border";
enabled = true;
speed = 10;
bezier = "default";
}
{
leaf = "borderangle";
enabled = true;
speed = 8;
bezier = "default";
}
{
leaf = "fade";
enabled = true;
speed = 7;
bezier = "default";
}
{
leaf = "workspaces";
enabled = true;
speed = 6;
bezier = "default";
}
];
window_rule = [ -- Animations
{ hl.animation({ leaf = "windows", enabled = true, speed = 7, bezier = "myBezier" })
match.class = "file_progress"; hl.animation({ leaf = "windowsOut", enabled = true, speed = 7, bezier = "default", style = "popin 80%" })
float = true; 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" })
match.class = "confirm"; hl.animation({ leaf = "workspaces", enabled = true, speed = 6, bezier = "default" })
float = true;
}
{
match.class = "dialog";
float = true;
}
{
match.class = "download";
float = true;
}
{
match.class = "notification";
float = true;
}
{
match.class = "error";
float = true;
}
{
match.class = "splash";
float = true;
}
{
match.class = "confirmreset";
float = true;
}
{
match.title = "Open File";
float = true;
}
{
match.title = "branchdialog";
float = true;
}
{
match.class = "pavucontrol-qt";
float = true;
}
{
match.class = "pavucontrol";
float = true;
}
{
match.class = "class:^(espanso)$";
float = true;
}
{
match.class = "wlogout";
fullscreen = true;
}
{
match.title = "wlogout";
float = true;
}
{
match.title = "wlogout";
fullscreen = true;
}
{
match.class = "mpv";
float = true;
}
{
match.class = "mpv";
idle_inhibit = "focus";
}
{
match.class = "mpv";
opacity = "1.0 override";
}
{
match.title = "^(Media viewer)$";
float = true;
}
{
match.title = "^(Volume Control)$";
float = true;
}
{
match.title = "^(Picture-in-Picture)$";
float = true;
}
{
match.title = "^(floating-pomodoro)$";
float = true;
}
{
match.title = "^(floating-pomodoro)$";
size = "250 50";
}
{
match.title = "^(floating-pomodoro)$";
move = "12 (monitor_h-150)";
}
{
match.title = "^(floating-pomodoro)$";
pin = true;
}
{
match.initial_title = ".*streamlabs.com.*";
float = true;
}
{
match.initial_title = ".*streamlabs.com.*";
pin = true;
}
{
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 = true;
}
{
match.initial_title = ".*streamlabs.com.*";
decorate = false;
}
{
match.initial_title = ".*streamlabs.com.*";
no_shadow = true;
}
{
match.initial_title = ".*streamlabs.com.*";
no_blur = true;
}
{
match = {
class = "^vibe-typer$";
title = "^Recording Indicator$";
};
no_blur = true;
}
{
match = {
class = "^vibe-typer$";
title = "^Recording Indicator$";
};
no_shadow = true;
}
{
match = {
class = "^vibe-typer$";
title = "^Recording Indicator$";
};
no_anim = true;
}
{
match = {
class = "^vibe-typer$";
title = "^Recording Indicator$";
};
border_size = 0;
}
{
match = {
class = "^vibe-typer$";
title = "^Recording Indicator$";
};
no_focus = true;
}
{
match.xwayland = true;
border_color = "rgb(ffffff)";
}
];
"bind" = [ -- Keybinds: terminals & editors
# mainMod + return intentionally remains disabled from the previous config. hl.bind(mainMod .. " + Return", hl.dsp.exec_cmd(terminal .. " nu -c zellij-ps"))
(mkBinding (modKey "t") (execExpr ''terminal .. " -e nu -c 'nitch; exec nu'"'')) hl.bind(mainMod .. " + T", hl.dsp.exec_cmd(terminal .. " -e nu -c 'nitch; exec nu'"))
(mkBinding (modKey "SHIFT + t") (execCmd "launch-timer")) hl.bind(mainMod .. " + Shift + T", hl.dsp.exec_cmd("launch-timer"))
(mkBinding (modKey "n") (execExpr ''terminal .. " -e nvim"'')) hl.bind(mainMod .. " + N", hl.dsp.exec_cmd(terminal .. " -e nvim"))
(mkBinding (modKey "z") (execCmd "uwsm app -- zeditor")) hl.bind(mainMod .. " + Z", hl.dsp.exec_cmd("uwsm app -- zeditor"))
(mkBinding (modKey "o") ''hl.dsp.window.set_prop({ prop = "opaque", value = "toggle" })'')
(mkBinding (modKey "r") ( -- Keybinds: misc
execCmd ''hyprctl dispatch focuswindow "initialtitle:.*alert-box.*" && hyprctl dispatch moveactive exact 4300 102 && hyprctl dispatch focuswindow "initialtitle:.*chat-box.*" && hyprctl dispatch moveactive exact 4300 512'' 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"))
(mkBinding (modKey "b") (execCmd "uwsm app -- thunar")) hl.bind(mainMod .. " + Shift + B", hl.dsp.exec_cmd("uwsm app -- vivaldi"))
(mkBinding (modKey "SHIFT + B") (execCmd "uwsm app -- vivaldi")) hl.bind(mainMod .. " + Escape", hl.dsp.exec_cmd("uwsm app -- wlogout -p layer-shell"))
(mkBinding (modKey "Escape") (execCmd "uwsm app -- dms ipc call powermenu toggle"))
(mkBinding (modKey "q") "hl.dsp.window.close()") -- Keybinds: window management
(mkBinding (modKey "M") "hl.dsp.exit()") hl.bind(mainMod .. " + Space", hl.dsp.window.float({ action = "toggle" }))
(mkBinding (modKey "F") "hl.dsp.window.fullscreen({})") hl.bind(mainMod .. " + Q", hl.dsp.window.close())
(mkBinding (modKey "SHIFT + V") ''hl.dsp.window.float({ action = "toggle" })'') hl.bind(mainMod .. " + M", hl.dsp.exit())
(mkBinding (modKey "D") (execCmd "uwsm app -- dms ipc call spotlight toggle")) hl.bind(mainMod .. " + F", hl.dsp.window.fullscreen())
(mkBinding (modKey "V") (execCmd "uwsm app -- dms ipc call clipboard toggle")) hl.bind(mainMod .. " + Shift + V", hl.dsp.window.float({ action = "toggle" }))
(mkBinding (modKey "C") (
execCmd "bash -c 'FILE=/tmp/screenshot_$(date +%s).png; grim -g \"$(slurp)\" \"$FILE\" && ksnip \"$FILE\"'" -- Keybinds: launchers
)) hl.bind(mainMod .. " + D", hl.dsp.exec_cmd('uwsm app -- rofi -show drun -run-command "uwsm app -- {cmd}"'))
(mkBinding (modKey "SHIFT + S") (execCmd "uwsm app -- rofi -show emoji")) hl.bind(mainMod .. " + V", hl.dsp.exec_cmd("uwsm app -- cliphist list | rofi -dmenu | cliphist decode | wl-copy"))
(mkBinding (modKey "P") (execCmd "uwsm app -- rofi-pass")) hl.bind(mainMod .. " + C", hl.dsp.exec_cmd("bash -c 'FILE=/tmp/screenshot_$(date +%s).png; grim -g \"$(slurp)\" \"$FILE\" && ksnip \"$FILE\"'"))
(mkBinding (modKey "SHIFT + P") "hl.dsp.window.pseudo({})") hl.bind(mainMod .. " + Shift + S", hl.dsp.exec_cmd("uwsm app -- rofi -show emoji"))
(mkBinding (modKey "R") (execCmd "stt-ptt start")) hl.bind(mainMod .. " + P", hl.dsp.exec_cmd("uwsm app -- rofi-pass"))
(mkBinding (modKey "S") (execCmd "stt-ptt start")) hl.bind(mainMod .. " + Shift + P", hl.dsp.window.pseudo())
(mkBinding (modKey "h") ''hl.dsp.focus({ direction = "l" })'')
(mkBinding (modKey "l") ''hl.dsp.focus({ direction = "r" })'') -- Keybinds: STT push-to-talk
(mkBinding (modKey "k") ''hl.dsp.focus({ direction = "u" })'') hl.bind(mainMod .. " + R", hl.dsp.exec_cmd("stt-ptt start"))
(mkBinding (modKey "j") ''hl.dsp.focus({ direction = "d" })'') hl.bind(mainMod .. " + R", hl.dsp.exec_cmd("stt-ptt stop"), { release = true })
(mkBinding (modKey "1") (focusWorkspace "1")) hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("stt-ptt start"))
(mkBinding (modKey "2") (focusWorkspace "2")) hl.bind(mainMod .. " + S", hl.dsp.exec_cmd("stt-ptt format-stop"), { release = true })
(mkBinding (modKey "3") (focusWorkspace "3"))
(mkBinding (modKey "4") (focusWorkspace "4")) -- Keybinds: focus
(mkBinding (modKey "5") (focusWorkspace "5")) hl.bind(mainMod .. " + H", hl.dsp.focus({ direction = "left" }))
(mkBinding (modKey "6") (focusWorkspace "6")) hl.bind(mainMod .. " + L", hl.dsp.focus({ direction = "right" }))
(mkBinding (modKey "7") (focusWorkspace "7")) hl.bind(mainMod .. " + K", hl.dsp.focus({ direction = "up" }))
(mkBinding (modKey "8") (focusWorkspace "8")) hl.bind(mainMod .. " + J", hl.dsp.focus({ direction = "down" }))
(mkBinding (modKey "9") (focusWorkspace "9"))
(mkBinding (modKey "0") (focusWorkspace "10")) -- Keybinds: workspaces (1-10)
(mkBinding (modKey "SHIFT + 1") (moveToWorkspace "1")) for i = 1, 10 do
(mkBinding (modKey "SHIFT + 2") (moveToWorkspace "2")) local key = i % 10
(mkBinding (modKey "SHIFT + 3") (moveToWorkspace "3")) hl.bind(mainMod .. " + " .. key, hl.dsp.focus({ workspace = i }))
(mkBinding (modKey "SHIFT + 4") (moveToWorkspace "4")) hl.bind(mainMod .. " + Shift + " .. key, hl.dsp.window.move({ workspace = i }))
(mkBinding (modKey "SHIFT + 5") (moveToWorkspace "5")) end
(mkBinding (modKey "SHIFT + 6") (moveToWorkspace "6")) hl.bind(mainMod .. " + mouse_down", hl.dsp.focus({ workspace = "e+1" }))
(mkBinding (modKey "SHIFT + 7") (moveToWorkspace "7")) hl.bind(mainMod .. " + mouse_up", hl.dsp.focus({ workspace = "e-1" }))
(mkBinding (modKey "SHIFT + 8") (moveToWorkspace "8"))
(mkBinding (modKey "SHIFT + 9") (moveToWorkspace "9")) -- Keybinds: mouse (drag & resize)
(mkBinding (modKey "SHIFT + 0") (moveToWorkspace "10")) hl.bind(mainMod .. " + mouse:272", hl.dsp.window.drag(), { mouse = true })
(mkBinding (modKey "mouse_down") (focusWorkspace "e+1")) hl.bind(mainMod .. " + mouse:273", hl.dsp.window.resize(), { mouse = true })
(mkBinding (modKey "mouse_up") (focusWorkspace "e-1"))
(mkBindingWithOptions (modKey "mouse:272") "hl.dsp.window.drag()" {mouse = true;}) -- Window rules: floating dialogs
(mkBindingWithOptions (modKey "mouse:273") "hl.dsp.window.resize()" {mouse = true;}) 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 = [
{
timeout = 300;
on-timeout = "hyprlock";
}
{
timeout = 420;
on-timeout = "hyprctl dispatch dpms off";
on-resume = "hyprctl dispatch dpms on";
}
]; ];
}; };
}; };
# services.hypridle = { services.hyprpaper.enable = true;
# 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(${p.base00})";
"$text" = "rgb(${p.base05})";
"$textAlpha" = "${p.base05}";
"$accentAlpha" = "${p.base0D}";
"$red" = "rgb(${p.base08})";
"$yellow" = "rgb(${p.base0A})";
# programs.hyprlock = { general = {
# enable = true; hide_cursor = 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 = { background = {
# hide_cursor = true; monitor = "";
# }; path = "${config.home.homeDirectory}/.config/hypr/wallpapers/wallhaven-lmmo8r.jpg";
blur_passes = 0;
color = "rgb(${p.base00})";
};
# background = { label = [
# monitor = ""; {
# path = "${config.home.homeDirectory}/.config/hypr/wallpapers/wallhaven-lmmo8r.jpg"; monitor = "";
# blur_passes = 0; text = "$TIME";
# color = "rgb(${config.colorScheme.palette.base00})"; 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";
}
];
# label = [ input-field = [
# { {
# monitor = ""; monitor = "";
# text = "$TIME"; size = "300, 60";
# color = "$text"; outline_thickness = 4;
# font_size = 90; dots_size = 0.2;
# font_family = "$font"; dots_spacing = 0.2;
# position = "30, 0"; dots_center = true;
# halign = "left"; outer_color = "rgb(${p.base0D})";
# valign = "top"; inner_color = "rgb(${p.base00})";
# } font_color = "rgb(${p.base05})";
# { fade_on_empty = false;
# monitor = ""; placeholder_text = ''<span foreground="##${p.base05}">󰌾 Logged in as <span foreground="##${p.base0D}">$USER</span></span>'';
# text = ''cmd[update:43200000] echo "$(date +"%A, %d %B %Y")"''; hide_input = false;
# color = "$text"; check_color = "rgb(${p.base0D})";
# font_size = 25; fail_color = "rgb(${p.base08})";
# font_family = "$font"; fail_text = ''<i>$FAIL <b>($ATTEMPTS)</b></i>'';
# position = "30, -150"; capslock_color = "rgb(${p.base0A})";
# halign = "left"; position = "0, -35";
# valign = "top"; halign = "center";
# } valign = "center";
# ]; }
];
# 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,39 +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;
};
okf.skills = {
all = true;
};
superpowers.skills = {
all = true;
};
vercel.skills.all = true;
};
};
};
}
+36 -34
View File
@@ -1,8 +1,10 @@
# AI agent system — OpenCode, Pi, and MCP server configuration. # AI agent system — OpenCode, Pi, and MCP server configuration.
# Relies on coding.agents options provided by home/common/default.nix # Relies on coding.agents options provided by home/common/default.nix
# (m3taHomeInputs.m3ta-nixpkgs.homeManagerModules.default). # (inputs.m3ta-nixpkgs.homeManagerModules.default).
{ {
m3taHomeInputs, config,
inputs,
lib,
pkgs, pkgs,
videoDrivers ? [], videoDrivers ? [],
... ...
@@ -17,46 +19,52 @@
}; };
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;
servers = { servers = {
ContextMode = {
command = "bash";
args = ["-c" "exec bunx context-mode@latest"];
};
DeepWiki = { DeepWiki = {
url = "https://mcp.deepwiki.com/mcp"; url = "https://mcp.deepwiki.com/mcp";
}; };
Exa = {
command = "bash";
args = ["-c" "EXA_API_KEY=$(cat /run/agenix/exa-key) exec bunx exa-mcp-server@latest tools=web_search_exa"];
};
Fireflies = {
url = "https://api.fireflies.ai/mcp";
};
Outline = {
url = "https://wiki.az-gruppe.com/mcp";
};
Playwright = {
command = "bash";
args = ["-c" "exec bunx @playwright/mcp@latest"];
};
Ref = { Ref = {
command = "bash"; command = "bash";
args = ["-c" "REF_API_KEY=$(cat /run/agenix/ref-key) exec bunx ref-tools-mcp@latest"]; args = ["-c" "REF_API_KEY=$(cat /run/agenix/ref-key) exec bunx ref-tools-mcp@latest"];
}; };
Teams = { Exa = {
command = "bunx"; command = "bash";
args = ["-y" "@floriscornel/teams-mcp@latest"]; args = ["-c" "EXA_API_KEY=$(cat /run/agenix/exa-key) exec bunx exa-mcp-server@latest tools=web_search_exa"];
};
Outline = {
url = "https://wiki.az-gruppe.com/mcp";
};
ContextMode = {
command = "bash";
args = ["-c" "exec bunx context-mode@latest"];
};
Honcho = {
command = "bash";
args = [
"-c"
''exec bunx mcp-remote@latest https://mcp.honcho.dev --header "Authorization:Bearer $(cat /run/agenix/honcho-key)" --header "X-Honcho-User-Name:m3tam3re"''
];
}; };
}; };
}; };
@@ -64,20 +72,14 @@
home.packages = with pkgs; [ home.packages = with pkgs; [
agenix-cli agenix-cli
agent-browser agent-browser
m3taHomeInputs.agent-lib.packages.${pkgs.stdenv.hostPlatform.system}.agent-lib-cli
beads beads
crunch
docker-sbx
herdr
pi-coding-agent pi-coding-agent
(qmd.override { (qmd.override {
vulkanSupport = videoDrivers == ["amdgpu"]; vulkanSupport = videoDrivers == ["amdgpu"];
cudaSupport = videoDrivers == ["nvidia"]; cudaSupport = videoDrivers == ["nvidia"];
}) })
opencode-desktop # opencode-desktop
openshell openshell
openspec openspec
openwork
talk
]; ];
} }
-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;
};
};
}
+34 -23
View File
@@ -1,28 +1,37 @@
{lib, ...}: { {
inputs,
lib,
...
}: {
coding.agents.opencode = {
enable = true;
agentsInput = inputs.agents;
};
coding.opencode = { coding.opencode = {
enable = true; enable = true;
ohMyOpencodeSettings = { ohMyOpencodeSettings = {
agents = { agents = {
sisyphus.model = "zai-coding-plan/glm-5.2"; sisyphus.model = "litellm/claude-opus-4-6";
oracle.model = "litellm/claude-sonnet-5"; oracle.model = "litellm/claude-sonnet-4-6";
librarian.model = "litellm/claude-sonnet-5"; librarian.model = "litellm/claude-sonnet-4-6";
explore.model = "litellm/claude-haiku-4-5"; explore.model = "litellm/claude-haiku-4-5";
multimodal-looker.model = "litellm/gpt-5.3-codex"; multimodal-looker.model = "litellm/gpt-5.3-codex";
prometheus.model = "litellm/claude-opus-4-8"; prometheus.model = "litellm/claude-opus-4-6";
metis.model = "litellm/claude-opus-4-8"; metis.model = "litellm/claude-opus-4-6";
momus.model = "zai-coding-plan/glm-5.2"; momus.model = "litellm/claude-opus-4-6";
atlas.model = "zai-coding-plan/glm-5.2"; atlas.model = "litellm/claude-sonnet-4-6";
}; };
categories = { categories = {
visual-engineering.model = "zai-coding-plan/glm-5.2"; visual-engineering.model = "zai-coding-plan/glm-5.1";
ultrabrain.model = "litellm/claude-opus-4-8"; ultrabrain.model = "litellm/claude-opus-4-6";
deep.model = "litellm/claude-sonnet-5"; deep.model = "litellm/claude-sonnet-4-6";
artistry.model = "zai-coding-plan/glm-5.2"; artistry.model = "zai-coding-plan/glm-5.1";
quick.model = "litellm/claude-haiku-4-5"; quick.model = "litellm/claude-haiku-4-5";
unspecified-low.model = "litellm/claude-sonnet-5"; unspecified-low.model = "litellm/claude-sonnet-4-6";
unspecified-high.model = "litellm/claude-opus-4-8"; unspecified-high.model = "litellm/claude-opus-4-6";
writing.model = "zai-coding-plan/glm-5.2"; writing.model = "zai-coding-plan/glm-5.1";
}; };
}; };
}; };
@@ -194,8 +203,8 @@
output = 128000; output = 128000;
}; };
}; };
"gpt-5.6-sol" = { "gpt-5.3-codex" = {
name = "GPT-5.6 Sol"; name = "GPT-5.3 Codex";
limit = { limit = {
context = 400000; context = 400000;
output = 128000; output = 128000;
@@ -214,11 +223,12 @@
output = 64000; output = 64000;
}; };
}; };
"claude-sonnet-5" = { "claude-sonnet-4-6" = {
name = "Claude Sonnet 5"; name = "Claude Sonnet 4.6";
options = { options = {
thinking = { thinking = {
type = "adaptive"; type = "enabled";
budget_tokens = 16000;
}; };
}; };
limit = { limit = {
@@ -226,11 +236,12 @@
output = 64000; output = 64000;
}; };
}; };
"claude-opus-4-8" = { "claude-opus-4-6" = {
name = "Claude Opus 4.8"; name = "Claude Opus 4.6";
options = { options = {
thinking = { thinking = {
type = "adaptive"; type = "enabled";
budget_tokens = 16000;
}; };
}; };
limit = { limit = {
+35 -5
View File
@@ -1,12 +1,41 @@
{...}: { {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:pi-agent-browser-native" "npm:pi-agent-browser-native"
"npm:pi-beads-extension" "npm:pi-beads-extension"
"npm:pi-lens" "npm:pi-lens"
@@ -17,10 +46,11 @@
"npm:pi-subagents" "npm:pi-subagents"
"npm:pi-tool-display" "npm:pi-tool-display"
"npm:pi-web-access" "npm:pi-web-access"
"git:github.com/hk-vk/pi-connect"
]; ];
defaultProvider = "openai-codex"; defaultProvider = "minimax";
defaultModel = "gpt-5.5"; defaultModel = "MiniMax-M2.7";
defaultThinkingLevel = "high"; defaultThinkingLevel = "high";
}; };
@@ -29,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
]; ];
} }
@@ -17,6 +17,9 @@ in {
bun bun
]; ];
home.file.".npmrc".text = ''
prefix=${npmGlobalPrefix}
'';
home.sessionVariables.NPM_CONFIG_PREFIX = npmGlobalPrefix; home.sessionVariables.NPM_CONFIG_PREFIX = npmGlobalPrefix;
}; };
} }
+1 -1
View File
@@ -15,7 +15,7 @@ in {
amf amf
ffmpeg_6-full ffmpeg_6-full
gst_all_1.gstreamer gst_all_1.gstreamer
gst_all_1.gst-plugins-bad gst_all_1.gst-vaapi
pamixer pamixer
pavucontrol pavucontrol
qpwgraph qpwgraph
+64 -64
View File
@@ -44,107 +44,107 @@
programs.ssh = { programs.ssh = {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
settings = { matchBlocks = {
"github.com" = { "github.com" = {
HostName = "github.com"; hostname = "github.com";
User = "m3tam3re"; user = "m3tam3re";
Port = 22; port = 22;
IdentityFile = "~/.ssh/github"; identityFile = "~/.ssh/github";
}; };
"code.m3ta.dev" = { "code.m3ta.dev" = {
HostName = "code.m3ta.dev"; hostname = "code.m3ta.dev";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/gitea"; identityFile = "~/.ssh/gitea";
}; };
"lkk-nix-1" = { "lkk-nix-1" = {
HostName = "89.58.10.189"; hostname = "89.58.10.189";
User = "lkk-admin"; user = "lkk-admin";
IdentityFile = "~/.ssh/lkk-admin"; identityFile = "~/.ssh/lkk-admin";
}; };
"m3-r1" = { "m3-r1" = {
HostName = "202.61.226.110"; hostname = "202.61.226.110";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-deck" = { "m3-deck" = {
HostName = "192.168.178.193"; hostname = "192.168.178.193";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-kratos-vm" = { "m3-kratos-vm" = {
HostName = "192.168.122.43"; hostname = "192.168.122.43";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-helios" = { "m3-helios" = {
HostName = "192.168.178.210"; hostname = "192.168.178.210";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-ares" = { "m3-ares" = {
HostName = "192.168.1.30"; hostname = "192.168.1.30";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-atlas" = { "m3-atlas" = {
HostName = "152.53.85.162"; hostname = "152.53.85.162";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-hermes" = { "m3-hermes" = {
HostName = "204.168.229.93"; hostname = "204.168.229.93";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"hermes" = { "hermes" = {
HostName = "46.224.0.92"; hostname = "46.224.0.92";
User = "admin"; user = "admin";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-zelda" = { "m3-zelda" = {
HostName = "95.217.189.186"; hostname = "95.217.189.186";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-skynet" = { "m3-skynet" = {
HostName = "m3-skynet"; hostname = "m3-skynet";
User = "admin"; user = "admin";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"m3-prox-1" = { "m3-prox-1" = {
HostName = "192.168.1.110"; hostname = "192.168.1.110";
User = "root"; user = "root";
IdentityFile = "~/.ssh/m3tam3re"; identityFile = "~/.ssh/m3tam3re";
}; };
"shp-old" = { "shp-old" = {
HostName = "95.217.3.250"; hostname = "95.217.3.250";
Port = 2222; port = 2222;
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/self-host-playbook"; identityFile = "~/.ssh/self-host-playbook";
}; };
"shp-1" = { "shp-1" = {
HostName = "95.217.189.186"; hostname = "95.217.189.186";
Port = 2222; port = 2222;
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/self-host-playbook"; identityFile = "~/.ssh/self-host-playbook";
}; };
"AZ-CLD-1" = { "AZ-CLD-1" = {
HostName = "152.53.186.119"; hostname = "152.53.186.119";
User = "sascha.koenig"; user = "sascha.koenig";
Port = 2022; port = 2022;
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
"AZ-PRM-1" = { "AZ-PRM-1" = {
HostName = "192.168.152.76"; hostname = "192.168.152.76";
User = "sascha.koenig"; user = "sascha.koenig";
Port = 2022; port = 2022;
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
"git.az-gruppe.com" = { "git.az-gruppe.com" = {
HostName = "git.az-gruppe.com"; hostname = "git.az-gruppe.com";
Port = 2022; port = 2022;
User = "sascha.koenig"; user = "sascha.koenig";
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
}; };
}; };
+16 -22
View File
@@ -44,35 +44,29 @@
programs.ssh = { programs.ssh = {
enable = true; enable = true;
enableDefaultConfig = false; enableDefaultConfig = false;
settings = { matchBlocks = {
"AZ-CLD-1" = { "AZ-CLD-1" = {
HostName = "152.53.186.119"; hostname = "152.53.186.119";
User = "sascha.koenig"; user = "sascha.koenig";
Port = 2022; port = 2022;
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
"AZ-PRM-1" = { "AZ-PRM-1" = {
HostName = "192.168.152.76"; hostname = "192.168.152.76";
User = "sascha.koenig"; user = "sascha.koenig";
Port = 2022; port = 2022;
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
};
"AZ-TC-01" = {
HostName = "192.168.153.146";
User = "sascha.koenig";
Port = 22;
IdentityFile = "~/.ssh/sascha.koenig";
}; };
"git.az-gruppe.com" = { "git.az-gruppe.com" = {
HostName = "git.az-gruppe.com"; hostname = "git.az-gruppe.com";
Port = 2022; port = 2022;
User = "sascha.koenig"; user = "sascha.koenig";
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
"code.m3ta.dev" = { "code.m3ta.dev" = {
HostName = "code.m3ta.dev"; hostname = "code.m3ta.dev";
User = "m3tam3re"; user = "m3tam3re";
IdentityFile = "~/.ssh/sascha.koenig"; identityFile = "~/.ssh/sascha.koenig";
}; };
}; };
}; };
+1 -9
View File
@@ -11,9 +11,7 @@
pkgs, pkgs,
lib, lib,
... ...
}: let }: {
npmGlobalPrefix = "${config.home.homeDirectory}/.npm-global";
in {
# ── Clipboard ── # ── Clipboard ──
services.cliphist = { services.cliphist = {
enable = true; enable = true;
@@ -27,10 +25,4 @@ in {
# These are overridden by the identity module, but provide safe defaults. # These are overridden by the identity module, but provide safe defaults.
home.username = lib.mkDefault "m3tam3re"; home.username = lib.mkDefault "m3tam3re";
home.homeDirectory = lib.mkDefault "/home/${config.home.username}"; home.homeDirectory = lib.mkDefault "/home/${config.home.username}";
home.file.".npmrc".text = ''
prefix=${npmGlobalPrefix}
@m3ta:registry=https://code.m3ta.dev/api/packages/m3tam3re/npm/
//code.m3ta.dev/api/packages/m3tam3re/npm/:_authToken=''${GITEA_TOKEN}
'';
} }