diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index dd8622d..6d5388d 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -42,7 +42,6 @@ jobs: architecture: - aarch64-darwin package: - - gh-stack - mcp-remote - nix-docker - oh-my-tmux diff --git a/flake.lock b/flake.lock index 0e165a6..10a7260 100644 --- a/flake.lock +++ b/flake.lock @@ -26,7 +26,7 @@ "inputs": { "crane": "crane", "flake-compat": "flake-compat_5", - "flake-parts": "flake-parts_7", + "flake-parts": "flake-parts_8", "nixpkgs": [ "tilde-secrets", "tilde", @@ -52,6 +52,64 @@ "type": "github" } }, + "blueprint": { + "inputs": { + "nixpkgs": [ + "llm-agents", + "nixpkgs" + ], + "systems": [ + "llm-agents", + "systems" + ] + }, + "locked": { + "lastModified": 1776249299, + "narHash": "sha256-Dt9t1TGRmJFc0xVYhttNBD6QsAgHOHCArqGa0AyjrJY=", + "owner": "numtide", + "repo": "blueprint", + "rev": "56131e8628f173d24a27f6d27c0215eff57e40dd", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "blueprint", + "type": "github" + } + }, + "bun2nix": { + "inputs": { + "flake-parts": [ + "llm-agents", + "flake-parts" + ], + "nixpkgs": [ + "llm-agents", + "nixpkgs" + ], + "systems": [ + "llm-agents", + "systems" + ], + "treefmt-nix": [ + "llm-agents", + "treefmt-nix" + ] + }, + "locked": { + "lastModified": 1778446047, + "narHash": "sha256-oQvcadh2BCkrog+SGrG6YffKJrveYpjj3TdQJWaKhaM=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "f2bc12af1a6369648aac41041ceeaa0b866599c6", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "bun2nix", + "type": "github" + } + }, "cachix": { "inputs": { "devenv": "devenv_2", @@ -186,27 +244,6 @@ "type": "github" } }, - "charmbracelet": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1780087526, - "narHash": "sha256-MIW62CNple/GJkrUheM5WdqrEOfdYaiS/EUUnxK63F0=", - "owner": "charmbracelet", - "repo": "nur", - "rev": "3a33c13df4a7b076ba77b13e3219cb1cf38e341a", - "type": "github" - }, - "original": { - "owner": "charmbracelet", - "repo": "nur", - "type": "github" - } - }, "crane": { "inputs": { "nixpkgs": [ @@ -1003,6 +1040,24 @@ } }, "flake-parts_10": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_5" + }, + "locked": { + "lastModified": 1726153070, + "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_11": { "inputs": { "nixpkgs-lib": [ "tilde-secrets", @@ -1029,7 +1084,7 @@ "type": "github" } }, - "flake-parts_11": { + "flake-parts_12": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_6" }, @@ -1047,7 +1102,7 @@ "type": "github" } }, - "flake-parts_12": { + "flake-parts_13": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_7" }, @@ -1065,7 +1120,7 @@ "type": "github" } }, - "flake-parts_13": { + "flake-parts_14": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_8" }, @@ -1083,7 +1138,7 @@ "type": "github" } }, - "flake-parts_14": { + "flake-parts_15": { "inputs": { "nixpkgs-lib": [ "tilde-secrets", @@ -1112,7 +1167,7 @@ "type": "github" } }, - "flake-parts_15": { + "flake-parts_16": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_9" }, @@ -1130,7 +1185,7 @@ "type": "github" } }, - "flake-parts_16": { + "flake-parts_17": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_10" }, @@ -1148,7 +1203,7 @@ "type": "github" } }, - "flake-parts_17": { + "flake-parts_18": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_11" }, @@ -1185,6 +1240,27 @@ } }, "flake-parts_3": { + "inputs": { + "nixpkgs-lib": [ + "llm-agents", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-parts_4": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_2" }, @@ -1202,7 +1278,7 @@ "type": "github" } }, - "flake-parts_4": { + "flake-parts_5": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_3" }, @@ -1220,7 +1296,7 @@ "type": "github" } }, - "flake-parts_5": { + "flake-parts_6": { "inputs": { "nixpkgs-lib": [ "tilde-secrets", @@ -1245,7 +1321,7 @@ "type": "github" } }, - "flake-parts_6": { + "flake-parts_7": { "inputs": { "nixpkgs-lib": "nixpkgs-lib_4" }, @@ -1263,7 +1339,7 @@ "type": "github" } }, - "flake-parts_7": { + "flake-parts_8": { "inputs": { "nixpkgs-lib": [ "tilde-secrets", @@ -1290,7 +1366,7 @@ "type": "github" } }, - "flake-parts_8": { + "flake-parts_9": { "inputs": { "nixpkgs-lib": [ "tilde-secrets", @@ -1318,24 +1394,6 @@ "type": "github" } }, - "flake-parts_9": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib_5" - }, - "locked": { - "lastModified": 1726153070, - "narHash": "sha256-HO4zgY0ekfwO5bX0QH/3kJ/h4KvUDFZg8YpkNwIbg1U=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "bcef6817a8b2aa20a5a6dbb19b43e63c5bf8619a", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, "flake-root": { "locked": { "lastModified": 1723604017, @@ -1428,7 +1486,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems" + "systems": "systems_2" }, "locked": { "lastModified": 1731533236, @@ -1446,7 +1504,7 @@ }, "flake-utils_10": { "inputs": { - "systems": "systems_4" + "systems": "systems_5" }, "locked": { "lastModified": 1710146030, @@ -1464,7 +1522,7 @@ }, "flake-utils_11": { "inputs": { - "systems": "systems_5" + "systems": "systems_6" }, "locked": { "lastModified": 1701680307, @@ -1482,7 +1540,7 @@ }, "flake-utils_12": { "inputs": { - "systems": "systems_6" + "systems": "systems_7" }, "locked": { "lastModified": 1689068808, @@ -1500,7 +1558,7 @@ }, "flake-utils_13": { "inputs": { - "systems": "systems_7" + "systems": "systems_8" }, "locked": { "lastModified": 1701680307, @@ -1518,7 +1576,7 @@ }, "flake-utils_14": { "inputs": { - "systems": "systems_8" + "systems": "systems_9" }, "locked": { "lastModified": 1701680307, @@ -1611,7 +1669,7 @@ }, "flake-utils_2": { "inputs": { - "systems": "systems_2" + "systems": "systems_3" }, "locked": { "lastModified": 1731533236, @@ -1629,7 +1687,7 @@ }, "flake-utils_20": { "inputs": { - "systems": "systems_9" + "systems": "systems_10" }, "locked": { "lastModified": 1701680307, @@ -1647,7 +1705,7 @@ }, "flake-utils_21": { "inputs": { - "systems": "systems_10" + "systems": "systems_11" }, "locked": { "lastModified": 1701680307, @@ -1665,7 +1723,7 @@ }, "flake-utils_22": { "inputs": { - "systems": "systems_11" + "systems": "systems_12" }, "locked": { "lastModified": 1685518550, @@ -1683,7 +1741,7 @@ }, "flake-utils_23": { "inputs": { - "systems": "systems_12" + "systems": "systems_13" }, "locked": { "lastModified": 1701680307, @@ -1701,7 +1759,7 @@ }, "flake-utils_24": { "inputs": { - "systems": "systems_13" + "systems": "systems_14" }, "locked": { "lastModified": 1685518550, @@ -1719,7 +1777,7 @@ }, "flake-utils_25": { "inputs": { - "systems": "systems_14" + "systems": "systems_15" }, "locked": { "lastModified": 1701680307, @@ -1737,7 +1795,7 @@ }, "flake-utils_3": { "inputs": { - "systems": "systems_3" + "systems": "systems_4" }, "locked": { "lastModified": 1689068808, @@ -2558,6 +2616,31 @@ "type": "github" } }, + "llm-agents": { + "inputs": { + "blueprint": "blueprint", + "bun2nix": "bun2nix", + "flake-parts": "flake-parts_3", + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems", + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1780535869, + "narHash": "sha256-2Uf4igNstI/FHFkUtn//4FAaqAL/ofHImmX4CGh1tCs=", + "owner": "numtide", + "repo": "llm-agents.nix", + "rev": "3ae355a78b82a254cc6525b5b32a4d742c3d57d7", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "llm-agents.nix", + "type": "github" + } + }, "lowdown-src": { "flake": false, "locked": { @@ -2982,7 +3065,7 @@ "devenv", "flake-compat" ], - "flake-parts": "flake-parts_8", + "flake-parts": "flake-parts_9", "libgit2": "libgit2", "nixpkgs": "nixpkgs_5", "nixpkgs-23-11": "nixpkgs-23-11", @@ -4045,7 +4128,7 @@ }, "nixvim": { "inputs": { - "flake-parts": "flake-parts_5", + "flake-parts": "flake-parts_6", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4073,7 +4156,7 @@ "inputs": { "devshell": "devshell", "flake-compat": "flake-compat_9", - "flake-parts": "flake-parts_10", + "flake-parts": "flake-parts_11", "git-hooks": "git-hooks_2", "home-manager": "home-manager_5", "nix-darwin": "nix-darwin_5", @@ -4105,7 +4188,7 @@ }, "nixvim_3": { "inputs": { - "flake-parts": "flake-parts_14", + "flake-parts": "flake-parts_15", "home-manager": "home-manager_7", "nix-darwin": "nix-darwin_7", "nixpkgs": [ @@ -4340,7 +4423,7 @@ }, "pragmatapro_3": { "inputs": { - "flake-parts": "flake-parts_6", + "flake-parts": "flake-parts_7", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4365,7 +4448,7 @@ }, "pragmatapro_4": { "inputs": { - "flake-parts": "flake-parts_11", + "flake-parts": "flake-parts_12", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4392,7 +4475,7 @@ }, "pragmatapro_5": { "inputs": { - "flake-parts": "flake-parts_15", + "flake-parts": "flake-parts_16", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4759,7 +4842,7 @@ "crane": "crane_2", "devshell": "devshell_2", "fenix": "fenix", - "flake-parts": "flake-parts_12", + "flake-parts": "flake-parts_13", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4789,7 +4872,7 @@ "crane": "crane_3", "devshell": "devshell_3", "fenix": "fenix_2", - "flake-parts": "flake-parts_16", + "flake-parts": "flake-parts_17", "nixpkgs": [ "tilde-secrets", "tilde", @@ -4819,13 +4902,13 @@ "root": { "inputs": { "actions-nix": "actions-nix", - "charmbracelet": "charmbracelet", "emacs-overlay": "emacs-overlay", "flake-compat": "flake-compat_2", "flake-parts": "flake-parts_2", "flake-root": "flake-root", "haumea": "haumea", "home-manager": "home-manager", + "llm-agents": "llm-agents", "nix-darwin": "nix-darwin", "nixpkgs": "nixpkgs", "nixpkgs-master": "nixpkgs-master", @@ -5002,6 +5085,21 @@ "type": "github" } }, + "systems_15": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, "systems_2": { "locked": { "lastModified": 1681028828, @@ -5126,7 +5224,7 @@ "inputs": { "emacs-overlay": "emacs-overlay_2", "flake-compat": "flake-compat_3", - "flake-parts": "flake-parts_3", + "flake-parts": "flake-parts_4", "flake-root": "flake-root_2", "haumea": "haumea_2", "home-manager": "home-manager_2", @@ -5480,7 +5578,7 @@ "tilde_2": { "inputs": { "flake-compat": "flake-compat_4", - "flake-parts": "flake-parts_4", + "flake-parts": "flake-parts_5", "flake-root": "flake-root_3", "haumea": "haumea_3", "home-manager": "home-manager_3", @@ -5511,7 +5609,7 @@ "attic": "attic", "devenv": "devenv", "flake-compat": "flake-compat_8", - "flake-parts": "flake-parts_9", + "flake-parts": "flake-parts_10", "flake-root": "flake-root_4", "haumea": "haumea_4", "home-manager": "home-manager_4", @@ -5541,7 +5639,7 @@ "tilde_4": { "inputs": { "devenv": "devenv_4", - "flake-parts": "flake-parts_13", + "flake-parts": "flake-parts_14", "flake-root": "flake-root_5", "haumea": "haumea_5", "home-manager": "home-manager_6", @@ -5571,7 +5669,7 @@ "tilde_5": { "inputs": { "devenv": "devenv_6", - "flake-parts": "flake-parts_17", + "flake-parts": "flake-parts_18", "flake-root": "flake-root_6", "haumea": "haumea_6", "home-manager": "home-manager_8", @@ -5628,16 +5726,16 @@ "treefmt-nix": { "inputs": { "nixpkgs": [ - "charmbracelet", + "llm-agents", "nixpkgs" ] }, "locked": { - "lastModified": 1769353635, - "narHash": "sha256-J0G1ACrUK29M0THPAsz429eZX07GmR9Bs/b0pB3N0dQ=", + "lastModified": 1780220602, + "narHash": "sha256-eynAfOmbmxJnkp7YewvCEbShNnnYJ9gLLqkzsYtBPeM=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "f46bb205f239b415309f58166f8df6919fa88377", + "rev": "db947814a175b7ca6ded66e21383d938df01c227", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 107a654..0fb7b34 100644 --- a/flake.nix +++ b/flake.nix @@ -11,6 +11,7 @@ "https://tilde.cachix.org" "https://nix-community.cachix.org" "https://numtide.cachix.org" + "https://cache.numtide.com" ]; extra-trusted-public-keys = [ @@ -20,6 +21,7 @@ "tilde.cachix.org-1:vjup2ixrsWKk+v8FXCqusKWBRwU0l7EzumjnMV4n2Vg=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" "numtide.cachix.org-1:2ps1kLBUWjxIneOy1Ik6cQjb41X0iXVXeHigGmycPPE=" + "niks3.numtide.com-1:DTx8wZduET09hRmMtKdQDxNNthLQETkc/yaX7M4qK0g=" ]; }; @@ -54,8 +56,8 @@ emacs-overlay.url = "github:nix-community/emacs-overlay"; emacs-overlay.inputs.nixpkgs.follows = "nixpkgs"; - charmbracelet.url = "github:charmbracelet/nur"; - charmbracelet.inputs.nixpkgs.follows = "nixpkgs"; + llm-agents.url = "github:numtide/llm-agents.nix"; + llm-agents.inputs.nixpkgs.follows = "nixpkgs"; pragmatapro.url = "git+ssh://git@github.com/ethnt/pragmatapro"; pragmatapro.inputs.nixpkgs.follows = "nixpkgs"; @@ -104,6 +106,7 @@ self.overlays.default pragmatapro.overlays.default emacs-overlay.overlays.default + llm-agents.overlays.default ]; config.allowUnfree = true; diff --git a/hosts/mercury/configuration.nix b/hosts/mercury/configuration.nix index 343878a..ecb4e72 100644 --- a/hosts/mercury/configuration.nix +++ b/hosts/mercury/configuration.nix @@ -15,7 +15,7 @@ }; homebrew = { - casks = [ "bruno" "figma" "jabra-direct" "linear-linear" "loom" "postico" ]; + casks = [ "bruno" "figma" "jabra-direct" "linear" "loom" "postico" ]; masApps = { "Flow" = 1423210932; }; }; diff --git a/lib/src/hm.nix b/lib/src/hm.nix index 1f7b64a..bb6d2ed 100644 --- a/lib/src/hm.nix +++ b/lib/src/hm.nix @@ -5,10 +5,8 @@ let l = inputs.nixpkgs.lib // builtins; - sharedModules = l.attrValues flake.homeModules ++ (with inputs; [ - sops-nix.homeManagerModules.sops - charmbracelet.homeModules.crush - ]); + sharedModules = l.attrValues flake.homeModules + ++ (with inputs; [ sops-nix.homeManagerModules.sops ]); extraSpecialArgs = { inherit flake inputs secrets; diff --git a/modules/packages/default.nix b/modules/packages/default.nix index 3e71b11..49afad7 100644 --- a/modules/packages/default.nix +++ b/modules/packages/default.nix @@ -4,14 +4,15 @@ perSystem = { config, pkgs, ... }: { overlayAttrs = { inherit (config.packages) - nix-docker oh-my-tmux sf-pro gh-stack mcp-remote; + firehydrant-mcp mcp-remote nix-docker oh-my-tmux postgres-mcp sf-pro; }; packages = { - gh-stack = pkgs.callPackage ./gh-stack.nix { }; + firehydrant-mcp = pkgs.callPackage ./firehydrant-mcp.nix { }; mcp-remote = pkgs.callPackage ./mcp-remote.nix { }; nix-docker = pkgs.callPackage ./nix-docker.nix { }; oh-my-tmux = pkgs.callPackage ./oh-my-tmux.nix { }; + postgres-mcp = pkgs.callPackage ./postgres-mcp.nix { }; sf-pro = pkgs.callPackage ./fonts/sf-pro.nix { }; }; }; diff --git a/modules/packages/firehydrant-mcp.nix b/modules/packages/firehydrant-mcp.nix new file mode 100644 index 0000000..7c4284b --- /dev/null +++ b/modules/packages/firehydrant-mcp.nix @@ -0,0 +1,25 @@ +{ lib, buildNpmPackage, fetchFromGitHub }: + +buildNpmPackage (finalAttrs: { + pname = "firehydrant-mcp"; + version = "0.0.4"; + + src = fetchFromGitHub { + owner = "firehydrant"; + repo = "firehydrant-mcp"; + tag = "v${finalAttrs.version}"; + hash = "sha256-mVsKKah5REjcOz9is1AxzduRNL75+YHYaTBRPvn5cf8="; + }; + + npmDepsHash = "sha256-IxHcnPrXrCDcZW695D5u4fIz65L4MSKl4t8V27pdu7k="; + + npmPackFlags = [ "--ignore-scripts" ]; + + meta = { + description = "Official FireHydrant MCP server"; + homepage = "https://github.com/firehydrant/firehydrant-mcp"; + license = lib.licenses.mit; + platforms = lib.platforms.all; + mainProgram = "firehydrant-mcp"; + }; +}) diff --git a/modules/packages/fonts/sf-pro.nix b/modules/packages/fonts/sf-pro.nix index 1a02efc..4224126 100644 --- a/modules/packages/fonts/sf-pro.nix +++ b/modules/packages/fonts/sf-pro.nix @@ -1,7 +1,8 @@ { stdenv, lib, fetchFromGitHub }: stdenv.mkDerivation { - name = "sf-pro"; + pname = "sf-pro"; + version = "2021-06-22"; src = fetchFromGitHub { owner = "sahibjotsaggu"; @@ -19,7 +20,7 @@ stdenv.mkDerivation { runHook postInstall ''; - meta = with lib; { + meta = { homepage = "https://developer.apple.com/fonts/"; description = '' This neutral, flexible, sans-serif typeface is the system font for iOS, @@ -27,7 +28,7 @@ stdenv.mkDerivation { sizes for optimal legibility, and includes a rounded variant. SF Pro supports over 150 languages across Latin, Greek, and Cyrillic scripts. ''; - platforms = platforms.all; - licence = licences.unfree; + platforms = lib.platforms.all; + license = lib.licenses.unfree; }; } diff --git a/modules/packages/gh-stack.nix b/modules/packages/gh-stack.nix deleted file mode 100644 index b926c21..0000000 --- a/modules/packages/gh-stack.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ lib, fetchFromGitHub, buildGoModule, }: -let version = "0.0.1"; -in buildGoModule { - pname = "gh-stack"; - inherit version; - - src = fetchFromGitHub { - owner = "github"; - repo = "gh-stack"; - tag = "v${version}"; - hash = "sha256-om7ekHez08X1YjP0W+3p0PxmjU/za6+/gHX5GPakKAw="; - }; - - vendorHash = "sha256-s85Lz6yfY1TiIFPolU1qESDyw8XoBORyuOMdiHj6Grc="; - - meta = { - homepage = "https://github.com/github/gh-stack"; - description = "GitHub Stacked PRs"; - license = lib.licenses.mit; - mainProgram = "gh-stack"; - }; -} diff --git a/modules/packages/mcp-remote.nix b/modules/packages/mcp-remote.nix index 2c1a20d..cd024e3 100644 --- a/modules/packages/mcp-remote.nix +++ b/modules/packages/mcp-remote.nix @@ -40,8 +40,7 @@ in stdenv.mkDerivation (finalAttrs: rec { mkdir -p $out/bin - cp -r node_modules $out/ - cp -r dist $out/ + cp -r {node_modules,dist} $out/ echo '#!${lib.getExe bash}' > $out/bin/mcp-remote @@ -54,9 +53,10 @@ in stdenv.mkDerivation (finalAttrs: rec { meta = { description = - "Connect an MCP Client that only supports local (stdio) servers to a Remote MCP Server, with auth support:"; + "Connect an MCP Client that only supports local (stdio) servers to a Remote MCP Server, with auth support"; homepage = "https://github.com/geelen/mcp-remote"; license = lib.licenses.mit; + platforms = lib.platforms.all; mainProgram = "mcp-remote"; }; }) diff --git a/modules/packages/nix-docker.nix b/modules/packages/nix-docker.nix index 2ae371e..e8db78d 100644 --- a/modules/packages/nix-docker.nix +++ b/modules/packages/nix-docker.nix @@ -1,13 +1,14 @@ { stdenv, fetchFromGitHub, lib }: stdenv.mkDerivation { - name = "nix-docker"; + pname = "nix-docker"; + version = "2022-04-02"; src = fetchFromGitHub { owner = "LnL7"; repo = "nix-docker"; rev = "277b1ad6b6d540e4f5979536eff65366246d4582"; - sha256 = "F8QizIR9A1Axt0C+NQHxDkNEMtRKALgLxuqfqXMAMgM="; + hash = "sha256-F8QizIR9A1Axt0C+NQHxDkNEMtRKALgLxuqfqXMAMgM="; }; installPhase = '' @@ -16,10 +17,10 @@ stdenv.mkDerivation { chmod 0400 $out/ssh/insecure_rsa ''; - meta = with lib; { + meta = { homepage = "https://github.com/LnL7/nix-docker"; description = "Docker images for the Nix package manager"; - platforms = platforms.all; - licence = licences.mit; + platforms = lib.platforms.all; + license = lib.licenses.mit; }; } diff --git a/modules/packages/oh-my-tmux.nix b/modules/packages/oh-my-tmux.nix index ea8dc3e..77cf0fa 100644 --- a/modules/packages/oh-my-tmux.nix +++ b/modules/packages/oh-my-tmux.nix @@ -1,28 +1,34 @@ { stdenv, lib }: stdenv.mkDerivation { - name = "oh-my-tmux"; + pname = "oh-my-tmux"; + version = "2026-02-01"; # fetchFromGitHub has trouble with the extracted directory from the ZIP file having a # preceding dot, so use fetchTarball instead - src = builtins.fetchTarball { + src = fetchTarball { url = - "https://github.com/gpakosz/.tmux/archive/87dcd13a28aeb5f18baee630e24b3f5765ae3a4f.tar.gz"; - sha256 = "sha256-rfJkL4EMMunbC7wGiw7O/1E/0XTzA2N+RR7gXEoalAY="; + "https://github.com/gpakosz/.tmux/archive/af33f07134b76134acca9d01eacbdecca9c9cda6.tar.gz"; + sha256 = "sha256-nXm664l84YSwZeRM4Hsweqgz+OlpyfwXcgEdyNGhaGA="; }; - phases = [ "unpackPhase" "installPhase" ]; + dontConfigure = true; + dontBuild = true; installPhase = '' + runHook preInstall + mkdir $out cp -r ./.tmux.conf* $out + + runHook postInstall ''; - meta = with lib; { + meta = { homepage = "https://github.com/gpakosz/.tmux"; description = "Oh my tmux! My self-contained, pretty & versatile tmux configuration made with love"; - platforms = platforms.all; - licence = licences.mit; + platforms = lib.platforms.all; + license = lib.licenses.mit; }; } diff --git a/modules/packages/postgres-mcp.nix b/modules/packages/postgres-mcp.nix new file mode 100644 index 0000000..55021ae --- /dev/null +++ b/modules/packages/postgres-mcp.nix @@ -0,0 +1,45 @@ +{ lib, python312Packages, fetchFromGitHub, }: +python312Packages.buildPythonApplication { + pname = "postgres-mcp"; + version = "0.3.0"; + pyproject = true; + + src = fetchFromGitHub { + owner = "crystaldba"; + repo = "postgres-mcp"; + rev = "7179ab0336396f819e23b0b012a9c284be10fac3"; + hash = "sha256-VCU7qVPbYyBBkLwtmNf+I0XxGzY4Qd7JFHEwbI8eU+I="; + }; + + build-system = [ python312Packages.hatchling ]; + + # psycopg-pool defaults to 30s timeout for acquiring connections, causing MCP initialize + # to time out in Claude Code. Reduce to 5s so the server starts quickly even when DB + # is temporarily unreachable. + postPatch = '' + substituteInPlace src/postgres_mcp/sql/sql_driver.py \ + --replace-fail \ + "min_size=1," \ + "min_size=1, timeout=5.0," + ''; + + dependencies = with python312Packages; [ + mcp + psycopg + psycopg-pool + pglast + humanize + attrs + instructor + ]; + + # postgres-mcp pins pglast==7.2.0 but nixpkgs ships 7.11 which is compatible + pythonRelaxDeps = [ "pglast" ]; + + meta = { + description = "PostgreSQL MCP server with tuning and analysis capabilities"; + homepage = "https://github.com/crystaldba/postgres-mcp"; + license = lib.licenses.mit; + mainProgram = "postgres-mcp"; + }; +} diff --git a/modules/profiles/home/claude-code.nix b/modules/profiles/home/claude-code.nix index 87e8bda..29cd429 100644 --- a/modules/profiles/home/claude-code.nix +++ b/modules/profiles/home/claude-code.nix @@ -1,6 +1,7 @@ -{ +{ pkgs, ... }: { programs.claude-code = { enable = true; + package = pkgs.llm-agents.claude-code; enableMcpIntegration = true; }; } diff --git a/modules/profiles/home/crush.nix b/modules/profiles/home/crush.nix deleted file mode 100644 index 1008579..0000000 --- a/modules/profiles/home/crush.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ config, ... }: { - programs.crush = { - enable = true; - settings.mcp = config.programs.mcp.servers; - }; -} diff --git a/modules/profiles/home/gh.nix b/modules/profiles/home/gh.nix index 2b97580..b53f971 100644 --- a/modules/profiles/home/gh.nix +++ b/modules/profiles/home/gh.nix @@ -1,7 +1,7 @@ { config, lib, pkgs, ... }: { programs.gh = { enable = true; - extensions = with pkgs; [ gh-poi gh-stack ]; + extensions = with pkgs; [ gh-poi ]; settings = { aliases = { co = "pr checkout"; diff --git a/modules/profiles/home/ghostty.nix b/modules/profiles/home/ghostty.nix index e467781..81dbc11 100644 --- a/modules/profiles/home/ghostty.nix +++ b/modules/profiles/home/ghostty.nix @@ -10,6 +10,7 @@ font-size = 16; theme = "nord"; window-padding-x = 8; + confirm-close-surface = false; }; }; } diff --git a/modules/profiles/home/opencode/default.nix b/modules/profiles/home/opencode/default.nix new file mode 100644 index 0000000..f0bb180 --- /dev/null +++ b/modules/profiles/home/opencode/default.nix @@ -0,0 +1,27 @@ +{ config, pkgs, ... }: { + sops.secrets = { + opencode_api_key = { + sopsFile = ./secrets.json; + path = "${config.xdg.dataHome}/secrets/opencode/opencode-api-key"; + }; + }; + + programs.opencode = { + enable = true; + package = pkgs.llm-agents.opencode; + enableMcpIntegration = true; + tui = { theme = "nord"; }; + settings = { + formatter = true; + lsp = true; + provider = { + opencode = { + options = { + apiKey = "{file:${config.sops.secrets.opencode_api_key.path}}"; + }; + }; + }; + permission = { "*" = "ask"; }; + }; + }; +} diff --git a/modules/profiles/home/opencode/secrets.json b/modules/profiles/home/opencode/secrets.json new file mode 100644 index 0000000..3ba86c7 --- /dev/null +++ b/modules/profiles/home/opencode/secrets.json @@ -0,0 +1,27 @@ +{ + "opencode_api_key": "ENC[AES256_GCM,data:333eY+xGFF4h9vKRdSDNEx0mNQWV385a5tyJcEVUJuzXYpj3uW2M+knQbDsz54oEOOjrz/oC1HKhssh5qtAjuuKhMA==,iv:2vQ0o2GVvl6jEdJQOzY8GCfWRfdF0lrk3Iud7aqmeUw=,tag:uHRXtK/6tzLxhZVRd8hQzg==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBsM1pHSHArWjkwUlFBQm04\nNGVlVE1BY1R5Y1hlS0xYcExtTlNVbGI0R0JnCk9uem80M08vK1NxQzBqQ3JzMlBF\nRytNakVmOUlkSjU4VVRsdVZIRmozUlEKLS0tIHV6Z0RYZVhtZ3ZNRTdtcmRxODlw\nV3dFMUppQ2VBS1JUWUtmTmdFaStneG8KCTGA1liCwWhU6mlL5gUigl/0KxaFh5UV\njrOsKtbe/2v0bPAdgMNV6z8QA2xgp/ASP9TZb2sDZvDBMb7lA+pnbQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age10539mc6shf02hpa8huyjktdw3nfyavxdg8pt247wwvq4xrv8h5zs8nc0k0" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIcXk3Y2VrU0Z0SDk1U0RL\nNnFMYmV0YkwwdnROejhjNG9RQy9Ea3FVRXdvCnIxMnovTE4rVklwVWRzdjcrVXdY\nMU5mbmdIZ0ZIWVJ5amozL29wVG5wWk0KLS0tIFY2WFdlMXM1ZHQ0NTU5c05Mc0ZZ\nNG9xSnN0eDZ5c1g0ekRiMlZNRVpvU2sKthGrP7Z/zP9W4/36RhRRZePNlL3Kv0ux\nLvRhBtGWMKx3Bc2Ln7SdLMIZedlyFMTN0cxj5aSuR8SrHUux25nnQA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1s2dhv789xf9jjfr9pdjsww7rf4dutl3qmavgpurlwj6l5khdkfasd4v7xn" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBOUDVQbk52OWNtYTBGWEFV\nczhlRFJBbGpCaUhDbmpxcGJ6enpIcDVlNGtnClliV0NnN0YxcG1zT29ldHdKeGVP\nSDZIbkhuUmI1emtIYUc2aDBlZFJGOXMKLS0tIEpQZXRtdXBIWkxpMmcrWnlPN09N\nYkkzQ3RHNC83T1pMalhGbDlYUk9UMWcKX6BqVRDSVfYPP7O0cgxt7yunLxs6UwsS\nv6Fqb4YahxElRMzst4+kP2hdCjytuX2g+x8tbRpxQSNhN0m7jpsyeg==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1hqq6znfaedyrmqkqqnaafa243cus77nts3e5vunxdl5xkfm6ffgqmf70r8" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCS1dMck5jTVVydnJXUita\nSmlMRXpDcXArQzluUGhQT3VLYzNZYzhubWhZCjVrd3QyU3ZNdmFQNjdhRVVLV1FD\nTXc5V00rR05zNjh2eGRLaDh1UzNGT3cKLS0tIHpYTDVDeXFxSXNkVVJBVGFET0I3\naTJWcVVrc2c2eDZuejFMak1lS0d5TG8KcdjMUbOln+vGMo+eNEoBS1yNyIc6EEHN\n6mX+35H7hbMRATxTaPWN+45vpy8HECNyXSv90aa9otAey6WNH2sUsQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1zkx88lththygcwj07xtz54tcvy6ltavnedrpskfpzcdh9tt2ngyq9gvqv5" + } + ], + "lastmodified": "2026-06-04T05:02:48Z", + "mac": "ENC[AES256_GCM,data:EnFFxnZowxtZEc6LPJqsgCiWKMKHp19bWJkPInEvPhmhfPtPyBdfJi54Nod5XGpfVk5efruEaIyqyTHisJg6sDkNgNryN+Q+exyq7uJraOaeDy5newmFp+wXlaVTW60N1H6mWVJw3cmIIhPXEY3fbi8Hx6FZ3gPqKD+DlcLUfDk=,iv:l4BRPHIebkr7diSIfTwivjf/DzTQNk+PGqXmxXqlI04=,tag:NWDGtWOVeRLmm7VPhEvO+w==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.13.1" + } +} diff --git a/modules/profiles/home/tuicr.nix b/modules/profiles/home/tuicr.nix new file mode 100644 index 0000000..59890ca --- /dev/null +++ b/modules/profiles/home/tuicr.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: { + home.packages = [ pkgs.llm-agents.tuicr ]; + + xdg.configFile."tuicr/config.toml".text = '' + theme = "nord-dark" + mouse = true + ''; +} diff --git a/modules/profiles/home/zed-editor.nix b/modules/profiles/home/zed-editor.nix index 3cbace2..725d53e 100644 --- a/modules/profiles/home/zed-editor.nix +++ b/modules/profiles/home/zed-editor.nix @@ -28,6 +28,7 @@ ui_font_size = 16; buffer_font_family = "PragmataPro Mono Liga"; buffer_font_size = 16; + terminal.font_family = "PragmataPro Mono Liga"; # Theme theme = { diff --git a/modules/suites/home.nix b/modules/suites/home.nix index 865c065..a570dec 100644 --- a/modules/suites/home.nix +++ b/modules/suites/home.nix @@ -9,7 +9,6 @@ with profiles; autojump bat certs - crush direnv fish fzf @@ -44,6 +43,8 @@ with profiles; mcp.memory mcp.nixos mise + opencode.default + tuicr vscode ]; diff --git a/users/et/home.nix b/users/et/home.nix index 82bde24..993e83e 100644 --- a/users/et/home.nix +++ b/users/et/home.nix @@ -4,9 +4,15 @@ ++ (with profiles; [ haskell nodejs ]) ++ [ secrets.users.et.home ] ++ [ ./profiles/git.nix ./profiles/jujutsu.nix - ./profiles/mcp/figma.nix + # ./profiles/mcp/figma.nix + ./profiles/mcp/firehydrant/default.nix + ./profiles/mcp/grafana/default.nix + ./profiles/mcp/honeycomb.nix ./profiles/mcp/linear.nix ./profiles/mcp/notion.nix + ./profiles/mcp/postgres/default.nix + ./profiles/mcp/sentry.nix + ./profiles/opencode/default.nix ./profiles/tmuxp.nix ./profiles/tools.nix ./profiles/vscode.nix diff --git a/users/et/profiles/mcp/firehydrant/default.nix b/users/et/profiles/mcp/firehydrant/default.nix new file mode 100644 index 0000000..9f3b4db --- /dev/null +++ b/users/et/profiles/mcp/firehydrant/default.nix @@ -0,0 +1,11 @@ +{ config, lib, pkgs, ... }: { + sops.secrets = { firehydrant_mcp_api_key.sopsFile = ./secrets.json; }; + + programs.mcp.servers.firehydrant = { + command = lib.getExe pkgs.firehydrant-mcp; + args = [ + "start" + "--api-key=$(cat ${config.sops.secrets.firehydrant_mcp_api_key.path})" + ]; + }; +} diff --git a/users/et/profiles/mcp/firehydrant/secrets.json b/users/et/profiles/mcp/firehydrant/secrets.json new file mode 100644 index 0000000..ea83351 --- /dev/null +++ b/users/et/profiles/mcp/firehydrant/secrets.json @@ -0,0 +1,27 @@ +{ + "firehydrant_mcp_api_key": "ENC[AES256_GCM,data:1jBps4EJQ4kUU2BJ5AWk6gKGz/g7fEYTOIVi0kCxvuDeh9Wv,iv:iqdhDY82U4yDx5VpRvo2CJmoo7Xe7hBQpaJsKCcNxgQ=,tag:fKbajn0ox23ZiFbQDMCDXg==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBORDExdGowSGFaR3pEUVFo\nbVJpWmNianhBanJ3LzdpR21uamhxaWh2U3pvCmZ1WUpBMzNnK3IyVFdJWXZEKzk2\nQkJkMW5ub0xtS3FTNnJhZGZCck9INFUKLS0tIFZWdXZFaHNCa21TWVhKU3h0RzRx\nejNDZUZQZmNiWUhMeDhjTXd5YjY5aWcKag+7rzLHTUyMK8MDLLGa67ziYHVbKrKy\n8RVWhKxTvx6zwIQ7kfjhj8dpRthsOfL8pToQ7cxkYVyj1wwFJdd7GA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age10539mc6shf02hpa8huyjktdw3nfyavxdg8pt247wwvq4xrv8h5zs8nc0k0" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBhYzFvdEtaa3k5c1o4K0hP\neTRiR1lVRFBhbHkvd2dVNlExeFd6cGRsSDFBCmFDOTRrOXBaMVFzZVY3R2FBVUNk\nTzBDc1B2WlE2b1ZkbkMxSUJZUHFwRzgKLS0tIHYwR25iZWZnU2tSanRvR0I1R1FW\nQzdQODdpVnk2RFZ1blBUQ0RON25VTjgKZ2WEuAsThAr0mPmuO6N+Ehr6Dt3+F2tr\n9lPnhbpWyEyRCOxFaIWqdQet1Cd6VNF6JvOwFIycrDMxAUQIzbKQpA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1s2dhv789xf9jjfr9pdjsww7rf4dutl3qmavgpurlwj6l5khdkfasd4v7xn" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGL2NPV0c0cHVBdlpGcDBu\nc3FTWm8zNlRBeUpsV0dBZGNUTG9GdnZsUEFNCng4TFdrZVFEUXVIMFoxOXZzdnZi\nTjRHOUlrT21STFFtS2sySHZ3UzdqbVkKLS0tIHBhUExhUHR5MTBDVDhwZDZ2N280\nU3ZEUXFYWnhvYkxOREVrZ3AxdGF1b0EK2Sye3XBDmARPGAh4UtHvZOyspV3LIKe4\nMnf9PP2ScuF1Dnxd0UHD/X7TDwndsXVcoEbuE40IHORhbwKAN2rRQg==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1hqq6znfaedyrmqkqqnaafa243cus77nts3e5vunxdl5xkfm6ffgqmf70r8" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyY2l1Y3gzeDNWUGR6cG52\nLzNtQUhmWnpEY3hpWm8zcHFIZi90WlpVRjBFCmtXcXMrOFZqTFJlWmdocWNzaTRM\nTDQ0UzFZbGRGVGpZYWx4R3c2Mm4wQXMKLS0tIEszd3Q5NDVkWEN3NUx4WEUrdWVt\nVWQ2OW0xZmx4UGptd1NQMGhhRnFNN00KsJnezUCMiMxG8YiVhnoPTuxhPgEkLjG7\nJwEpiklr1DKPTeQmMeyECkFe9dtP2MhoHgGqJyv9QTjql0vwHjP6ng==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1zkx88lththygcwj07xtz54tcvy6ltavnedrpskfpzcdh9tt2ngyq9gvqv5" + } + ], + "lastmodified": "2026-06-08T16:05:55Z", + "mac": "ENC[AES256_GCM,data:k0p1QjBvxFD4Dyn4kb2VeeKWEokquYlItYqpwMKox/PP9IJYlU8pD+PlH/gHNipITrKVZAKegXuLMYW+CCERYPYv6RpyeiBOfE7dyQa0juh29Vgb/p0DryE9K+BewUQ27nSYuk92vw+8GtDKgn/u8L08wKTLD7m/Mr0B082yk8g=,iv:2ovMtlBn3Bqp9YJEg8h5O1+9cUIe1ANLV/4VfZkJVsA=,tag:oKIk2eydsWHp4Wq7U4/3kw==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.13.1" + } +} diff --git a/users/et/profiles/mcp/grafana/default.nix b/users/et/profiles/mcp/grafana/default.nix new file mode 100644 index 0000000..88b6d80 --- /dev/null +++ b/users/et/profiles/mcp/grafana/default.nix @@ -0,0 +1,15 @@ +{ config, lib, pkgs, ... }: { + sops.secrets = { + grafana_mcp_url.sopsFile = ./secrets.json; + grafana_mcp_service_account_token.sopsFile = ./secrets.json; + }; + + programs.mcp.servers.grafana = { + command = lib.getExe pkgs.mcp-grafana; + env = { + GRAFANA_URL = "$(cat ${config.sops.secrets.grafana_mcp_url.path}})"; + GRAFANA_SERVICE_ACCOUNT_TOKEN = + "$(cat ${config.sops.secrets.grafana_mcp_service_account_token.path}})"; + }; + }; +} diff --git a/users/et/profiles/mcp/grafana/secrets.json b/users/et/profiles/mcp/grafana/secrets.json new file mode 100644 index 0000000..b183449 --- /dev/null +++ b/users/et/profiles/mcp/grafana/secrets.json @@ -0,0 +1,28 @@ +{ + "grafana_mcp_url": "ENC[AES256_GCM,data:QXJY5ZR3SXhdStT2LwwdjcmXitGRfNkcthpAcmST7yZfVfcw0gXg,iv:kVgHXzlT6L3N0BVGM1agCDr2zdORnAifsbYj3IDeRHI=,tag:uwDKoeVmWNuo8a5atFSDng==,type:str]", + "grafana_mcp_service_account_token": "ENC[AES256_GCM,data:AlR9QmDUfLOVKsBXIiPQh5LMxaAVwyJJnSatVGSiNAR+5X87c4JwumZIMrHh7w==,iv:KmIAVm7ttRWIi232cySyJae/xTbisSShRPTkMOCtu+E=,tag:XsNIFAX9h1eDAdM6TdCzNQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXVFRKS0xpRVF1eis5M3Uz\nWWFTYUttQTlPWmI2Q25VOVdCS3pzWTE4VVFBClFJR2pBcS9UQU80bzhmek1DaW16\nd0dtRFp2N1NsdVJPelZMbHFtUitGSzQKLS0tIE9qeWxlWTNoVHhGcnJEeGdRUW0z\nVnVpZkUzOWV0R0dwTGVibitraEsxWnMKpTQdMSuzmxFUnjAnYt4w40ZWMOxZwuTb\nU1/V1Ei98kKn9zQoYh2OawBt0bnv2HzR6g1IQ43OOMrao8jVPJCeoA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age10539mc6shf02hpa8huyjktdw3nfyavxdg8pt247wwvq4xrv8h5zs8nc0k0" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuSUVwNUE5QlAwS2VnUGNz\nNk9OUG9CekdvUGF4cmh4ZjdKN0h5bi9aOGtnClJyRnJEbTJPSkE5MWNSWmUxcjlO\ndTV4bW9aVTMzRm9XRHdMT2U4b1FKZGcKLS0tIE5FUXh3UkhVeEM0ZXl1dThDcFZK\nY0lGaDlaN3c3b0NrVVJIcFdBVmlBMm8KB3vnW+j9L1YZsgqvCg7urIoPF5ww1t/N\nTeMR85HyPVMTrBXz6Zm927ws7N7atvyS21eWNLWayyRnms4rqAs8kw==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1s2dhv789xf9jjfr9pdjsww7rf4dutl3qmavgpurlwj6l5khdkfasd4v7xn" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB1SUU1MHJ0dmlnSENpNXhR\neUJVQTVjUmxZWG9YTmtaMzlaNDVVVVBCUzNVClVLRWxOaWRFU2loQTZxeUNnQjFh\nMGRTUjhuS3RXSmxSajc3elp0cWpOOGMKLS0tIEhqQkU3c2dPQXFlK0s3dWFpeWdk\nMWU5bkhGMmZwaGtuMUxiOEhRSURtZEkKO++eDVeYbnUhapLvE0zSUqhVe5dwZSlO\ncP6MQ3HD9rHhb8XAJf73qS6603h8rorjO8PuV3QeR+kt9Rf+gLRcSA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1hqq6znfaedyrmqkqqnaafa243cus77nts3e5vunxdl5xkfm6ffgqmf70r8" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIaUxHMUVKbUZkN1FzM0tq\nckZMTE0vUEFUdTh4U09XVy9La0E3VnJHbGxrCm9FRUFqcWNsQm90L2QvcFMzUmkx\nT2FOOGV6T1k1L0hIUXc2dmxyeEM3MGMKLS0tIG9GaERHcksvL1BrRkhjWExBQ1hG\ncTAvUWdsdGp6UC9ZaEljR2d2T29XeU0K1AEVkfNdU06/o1t/+cNqtZXj6hHGTzsL\nDT4rVgSmPqg0osaHgCNUB0zrx43WT5SjcghXtP1ako1Mk/I5A14VNQ==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1zkx88lththygcwj07xtz54tcvy6ltavnedrpskfpzcdh9tt2ngyq9gvqv5" + } + ], + "lastmodified": "2026-06-04T16:23:02Z", + "mac": "ENC[AES256_GCM,data:Y5hoN9ODzEfvKbAtfNd6MAMe5rQ/6W1ktx5Ppr6ueeSxFR4/3FxakZG8qc2s23NVIxI5gQHfbPR+twclr//hGFFeX2izwEJpnk0TYASdsAknqVffWTBt4dnztXqT/uROzwtdU54itdAaNVxdm3WdFDPrjjwyRD4ngBPBvoKZ74Q=,iv:+5CXK8jWg7F+Tw8UBKzJGsh+v5dmpL791HS5QzzEZ7k=,tag:Hz3JEKqry1rpjUUACMs95g==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.13.1" + } +} diff --git a/users/et/profiles/mcp/honeycomb.nix b/users/et/profiles/mcp/honeycomb.nix new file mode 100644 index 0000000..d974a54 --- /dev/null +++ b/users/et/profiles/mcp/honeycomb.nix @@ -0,0 +1,7 @@ +{ pkgs, lib, ... }: { + programs.mcp.servers.honeycomb = { + type = "stdio"; + command = lib.getExe pkgs.mcp-remote; + args = [ "https://mcp.honeycomb.io/mcp" ]; + }; +} diff --git a/users/et/profiles/mcp/postgres/default.nix b/users/et/profiles/mcp/postgres/default.nix new file mode 100644 index 0000000..3832511 --- /dev/null +++ b/users/et/profiles/mcp/postgres/default.nix @@ -0,0 +1,23 @@ +{ config, lib, pkgs, ... }: { + sops.secrets = { + postgres_mcp_connection_string_production.sopsFile = ./secrets.json; + postgres_mcp_connection_string_development.sopsFile = ./secrets.json; + }; + + programs.mcp.servers = { + postgres-production = { + command = lib.getExe pkgs.postgres-mcp; + env = { + DATABASE_URI = + "$(cat ${config.sops.secrets.postgres_mcp_connection_string_production.path}})"; + }; + }; + postgres-development = { + command = lib.getExe pkgs.postgres-mcp; + env = { + DATABASE_URI = + "$(cat ${config.sops.secrets.postgres_mcp_connection_string_development.path}})"; + }; + }; + }; +} diff --git a/users/et/profiles/mcp/postgres/secrets.json b/users/et/profiles/mcp/postgres/secrets.json new file mode 100644 index 0000000..7354b35 --- /dev/null +++ b/users/et/profiles/mcp/postgres/secrets.json @@ -0,0 +1,28 @@ +{ + "postgres_mcp_connection_string_production": "ENC[AES256_GCM,data:r/lCJ30Eg1UhzFeVooQP1hb9Lg8Z8SvD+8yNDjcd1Q5R7kOoJvDbuZ0bC34sGNo9OCyhQP4gMjtKPDNl4v8jbA==,iv:TfjpqU9tOJ9tBmDem1xOgD3Ymia/oxfbznqSYCiB63M=,tag:4v/DmzoBlb8pgjDbXE48YA==,type:str]", + "postgres_mcp_connection_string_development": "ENC[AES256_GCM,data:l74zaipYEBfj18fzb805IO0oDZynrYoUSUij5k7sfKSToOUUoAEcCRxB+DNcw8aEgDzhXr//CaEy,iv:7mfUna7x2wTfz5qW0cuS2t8LzRNwO/jNH9eqBI0oKb4=,tag:2gcW8HmeF86Ew56s3gRqbQ==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2TjlLLy84ZVhpTUFRamQr\nT0FUcU03cktuMkJieGpxY3k4M0c5WXhScldzCjFRNjZSVmdWR1VHaDFyemZuVGRN\nZkRYYWZVUmE4TEZVUXR0RXltWENqUWMKLS0tIEVFS2tUbm1ra1pFcFVnU1IvOTJI\nOEc2MVFzRU0wVE1jNnY4T2tYY3FqL1EKJglXrctmaFGIO3vJR+Bc+V0nNgMrJean\nH2Zm6Al5GDqegFhxY7kSCEkIuPukay1jrIYvgXfC7GlpXQxFR7N8Lw==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age10539mc6shf02hpa8huyjktdw3nfyavxdg8pt247wwvq4xrv8h5zs8nc0k0" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBIQ0ZOR2tuVGxXVEZwTTNU\nSXNFRjlYeEU3MHFuNTM0K2pFMk83WTlTdzFRCkJvSGpYd0lBbWZQSmFOUXZaRzVn\nUmtsQnFtb0tNTytxOHJHTEJDRkF3NjQKLS0tIFM1ck1RbFN0YlhxNnliSVZtTGFx\nclB0OVBPWU13dnZEV3A1V29CaEJyZTgKzpYMz8ccnJbPf2po7jIMymAlmGEf/Jy2\nBnFat+CtVVFqFyxkNnHHX1ffetELE0yyB2uWFmesQeM7Q7beIcfngA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1s2dhv789xf9jjfr9pdjsww7rf4dutl3qmavgpurlwj6l5khdkfasd4v7xn" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjNDVpNHMyaEF1TzZ0SW5V\nRE55disrNDJ6WTh3b05hZ3gvR05HUUF1WDJBClNoT04xZE4zdWJNdXp2QlhqTEU5\nQWRqcEh4RkFFRjUrWXcrRW9sQU94YmMKLS0tIHphbTg5dS9DSGVNYUI1cHA0eHJW\nekN4Z2hkdTVrNHZwTHJrRDRENzYwdDAKMrw5b53VJiWjopZLrt2oPa/JI8+1rbk2\nOZMn59HDkyFTdHCvr2w5u1+Z6DAOTxh1nfWtCTMiH4bMpqzn211r5A==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1hqq6znfaedyrmqkqqnaafa243cus77nts3e5vunxdl5xkfm6ffgqmf70r8" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBvV3BQaW82ZFIxd0l2Sy9r\nODg4WWpjWlcvbUNyWmg1TlBhN0RjaWN0eG5vCkVUQ2djSkhHQUpVd2tjT3hOVzNH\nTzdvMnpFT1k1WEtvWFJkWDE2YWQxUUkKLS0tIHRlcVNBV255a0VNSzZ6SnZNUHN0\nVXY1ZklWbS9sVnVYa1JGV1VzU0FPalkKvZDyHSRgFx7PURHlopI2obe7xJWu7UPv\nwErm6T5vS1f+AdkMQGNMb0xX8CNCfhNDGh/E0Fq34rkEncS+6QDkjg==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1zkx88lththygcwj07xtz54tcvy6ltavnedrpskfpzcdh9tt2ngyq9gvqv5" + } + ], + "lastmodified": "2026-06-08T12:55:00Z", + "mac": "ENC[AES256_GCM,data:CuU1woDfTMEIpfiWc+C/Hbt2TAcKG5/z6alTEdpYKfrVj3L3PoXMVO6WZVDMeRzEwXdTBhKwoJ3ENI9iVZbAJH2wTw96jE713hSBsAlNrWjgB79XguJi7YzQESt8PJ6RAMtn7gCGqjyQh2fohfqQfVxPF1roc3UQw3/IaywM2pU=,iv:hS553iRiPokx0Owy1Je3Tg6mS3YShLHhlPru8m3ye3g=,tag:5UGhhE3vfWH3E8oDrmhysA==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.13.1" + } +} diff --git a/users/et/profiles/mcp/sentry.nix b/users/et/profiles/mcp/sentry.nix new file mode 100644 index 0000000..0c0e88c --- /dev/null +++ b/users/et/profiles/mcp/sentry.nix @@ -0,0 +1,7 @@ +{ pkgs, lib, ... }: { + programs.mcp.servers.sentry = { + type = "stdio"; + command = lib.getExe pkgs.mcp-remote; + args = [ "https://mcp.sentry.dev/mcp" ]; + }; +} diff --git a/users/et/profiles/opencode/default.nix b/users/et/profiles/opencode/default.nix new file mode 100644 index 0000000..6d22abf --- /dev/null +++ b/users/et/profiles/opencode/default.nix @@ -0,0 +1,18 @@ +{ config, ... }: { + sops.secrets = { + opencode_anthropic_api_key = { + sopsFile = ./secrets.json; + path = + "${config.xdg.dataHome}/secrets/opencode/opencode-anthropic-api-key"; + }; + }; + + programs.opencode.settings = { + provider.anthropic = { + options = { + apiKey = + "{file:${config.sops.secrets.opencode_anthropic_api_key.path}}"; + }; + }; + }; +} diff --git a/users/et/profiles/opencode/secrets.json b/users/et/profiles/opencode/secrets.json new file mode 100644 index 0000000..40965b6 --- /dev/null +++ b/users/et/profiles/opencode/secrets.json @@ -0,0 +1,27 @@ +{ + "opencode_anthropic_api_key": "ENC[AES256_GCM,data:bILPPOpNjXOIUnrfQg0I+5shCZzXdX2iWQj/TBMlyzcLcDcnGwD+Nifrr8u6+AjI9u9bnCIen8Ju34tKl40b6AZXHWpToivt7Rl3efXf4VIMEibOfSBsfYsC04XE5+Eh5nmC3RmbdVSucbOQ,iv:yN601hfoYDu7xBjyPK9PC/nkAqJAzWp0HdM8sp1+TA0=,tag:mVgDznMYcEj6en8IIsD+kg==,type:str]", + "sops": { + "age": [ + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0T3Jjb1ZqVnI1VzR1VHhn\nVjJQK242ajg1YWhVQXFXMnZyT25TWTYxYjNzCk5SMU5yenAvZ0tjOGY1QTRRR1Zl\neGpBUjJ3OThlR01tRitUclAyZk9DWkUKLS0tIDAxS2xEem53eDRySmFmZzNiV1hy\nNzdNYnI0czNwNWtxZk8ySjNuUGo1dEUKMh/9Mv1Jatc3Co7J5IeA4V6HpGTMiJvK\nIfUzUCrwvt1Mrw9nbz9Sqf1J6Xbzn2fL3gcXK8lT8ejljCeAuK7qbA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age10539mc6shf02hpa8huyjktdw3nfyavxdg8pt247wwvq4xrv8h5zs8nc0k0" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBCWFc3WDdFSSs2WXhHbFkw\nSk1UQ2RET1Bqbjlhb0dyWXpGYlBQT0RnVzFJCmIxODVXZHJ5Ym5NZUhPaU9HcUEw\nNk1oaHhQVE0wUHJPOVR6WkMrQ2dCVTQKLS0tIGRLalN0NUUwdGNKamV6YStyNE5s\nZnhSYVNva0xUOFEyZWRIOGIvWVpCZ2MKfbBTd7YNZXZ4n1DjegjINbt+srATa4OT\nIGQD+R+ez3toH0ECotSu5TTQ47MlQlHG9sRiewBTDVGGywH/sqTAoA==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1s2dhv789xf9jjfr9pdjsww7rf4dutl3qmavgpurlwj6l5khdkfasd4v7xn" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2Ly9QbWFZdW1xcWZrbkFG\nMmNha1creWo5OGcvUXlXZC9FYXozNDFZQTFFClBXSnZjTStYYUxna09POFYzeVJX\nTUxwNTlEaG9rNjYyWURFcXhjRXBOWmsKLS0tIEZmMVF0Z2Q4OTZIM29pYWtPMzlC\nOEExbnVuQnRVUDRjNUZVS0t5TU93bFUKglXjMIqrygF/ZytJG4ml+ac7R/4p7U9u\ns3RxJAMMmhdRGun5y2LYMunSK4IuD+ESakjS0+dSj2QzjBPg/KxVIg==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1hqq6znfaedyrmqkqqnaafa243cus77nts3e5vunxdl5xkfm6ffgqmf70r8" + }, + { + "enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoNVVMMmM2UTJwdXYydHpa\ndTYrSW91ZSt0SVN3UDBtR0oyUWpMYTdxTkFRCko3c1d6ZlltZVhQbms0OVVJMmxZ\nNCsvN200ZktQcW0xUFhkTFRzb1VtUk0KLS0tIENCQlhEWEFVRWhKNGhrM081SUwz\nWmg4VmY0d1BNcnI4WHFzUDdPMmFWcHMKpA7iY2xxbar4hwqnsygoJSA+ytZH4zdd\nSoVJBpj0H6f2K6jeQKa++NxaFvA06uOFYrDnDWRh91rtrYbUjLAZ0Q==\n-----END AGE ENCRYPTED FILE-----\n", + "recipient": "age1zkx88lththygcwj07xtz54tcvy6ltavnedrpskfpzcdh9tt2ngyq9gvqv5" + } + ], + "lastmodified": "2026-06-04T15:28:05Z", + "mac": "ENC[AES256_GCM,data:f/tzq8e1qqzWOTez7pAAxSfHcHcavhkCclxw1EAVgMsToJEYg+Y7cSjjldU7//PNuzj5rnkzpwbkMYaAtc4IZqShz2Ehf5vFBL79C+Jq+vrZWt8YwgjV0n6MdflZVSTw6xEnbzwGqI+UDUQzUzXNokSd4wX9EOA4LFI9UDeZuL0=,iv:FjL6h4hhRIdIKqWyQjIUruz4kO/fKaRp3WO0FeTmZPY=,tag:AKjd5NRPoJ3D9Y9GlwAbEw==,type:str]", + "unencrypted_suffix": "_unencrypted", + "version": "3.13.1" + } +}