/ system / home / jujutsu.nix
jujutsu.nix
  1  { config, pkgs, ... }:
  2  let
  3    inherit (pkgs) dusk-treefmt makeWrapper symlinkJoin;
  4  
  5    treefmt = symlinkJoin {
  6      name = "jujutsu-treefmt";
  7      paths = [ dusk-treefmt ];
  8      buildInputs = [ makeWrapper ];
  9      postBuild = ''
 10        wrapProgram $out/bin/treefmt \
 11          --set NO_COLOR 1 \
 12          --set TREEFMT_VERBOSE 0
 13      '';
 14    };
 15  in
 16  {
 17    config = {
 18      home = {
 19        file.".config/rustfmt/rustfmt.toml".text = ''
 20          edition = "2024"
 21  
 22          reorder_imports = true
 23          imports_granularity = "Crate"
 24          imports_layout = "HorizontalVertical"
 25          max_width = 102
 26          group_imports = "StdExternalCrate"
 27          trailing_comma = "Vertical"
 28          trailing_semicolon = true
 29        '';
 30  
 31        packages = with pkgs; [
 32          jjui
 33          radicle-node
 34        ];
 35      };
 36  
 37      programs.jujutsu = {
 38        enable = true;
 39  
 40        settings = {
 41          aliases = {
 42            ai-describe = [
 43              "util"
 44              "exec"
 45              "--"
 46              "${pkgs.dusk-ai-tools}/bin/ai-describe"
 47            ];
 48            my-remotes = [
 49              "log"
 50              "-r"
 51              "my(upstreams)"
 52            ];
 53            remotes = [
 54              "log"
 55              "-r"
 56              "upstreams"
 57            ];
 58            sync-main = [
 59              "rebase"
 60              "-s"
 61              "roots(main@origin)..trunk-"
 62              "-d"
 63              "main"
 64              "--skip-emptied"
 65            ];
 66            update-trunk = [
 67              "rebase"
 68              "-s"
 69              "trunk"
 70              "-d"
 71              "main"
 72              "-d"
 73              "all:heads(my(upstreams))"
 74              "--skip-emptied"
 75            ];
 76            xl = [
 77              "log"
 78              "-r"
 79              "::mine() | ::remote_bookmarks()"
 80            ];
 81          };
 82  
 83          fix.tools.treefmt = {
 84            command = [
 85              "${treefmt}/bin/treefmt"
 86              "--no-cache"
 87              "$path"
 88              "--stdin"
 89            ];
 90  
 91            patterns = [
 92              "glob:'**/*.js'"
 93              "glob:'**/*.jsx'"
 94              "glob:'**/*.lua'"
 95              "glob:'**/*.nix'"
 96              "glob:'**/*.py'"
 97              "glob:'**/*.rs'"
 98              "glob:'**/*.sh'"
 99              "glob:'**/*.toml'"
100              "glob:'**/*.ts'"
101              "glob:'**/*.tsx'"
102            ];
103          };
104  
105          git = {
106            private-commits = "private | trunk";
107            push-bookmark-prefix = "${config.dusk.accounts.github}/";
108          };
109  
110          revset-aliases = {
111            upstreams = ''
112              tracked_remote_bookmarks() ~ ::main@origin
113            '';
114  
115            "clean(a)" = "a ~ conflicts()";
116            "broken(a)" = "a & conflicts()";
117            "my(a)" = "a & mine()";
118  
119            private = "description(glob:'wip:*') | description(glob:'private:*') | trunk::";
120            trunk = ''bookmarks("trunk") & mine()'';
121          };
122  
123          snapshot.max-new-file-size = "10MiB";
124  
125          signing = {
126            behavior = "own";
127            backend = "gpg";
128          };
129  
130          template-aliases = {
131            "format_short_signature(signature)" = "signature.email()";
132            "format_short_id(id)" = "id.shortest()";
133          };
134  
135          user = {
136            inherit (config.dusk) name;
137            email = config.dusk.emails.primary;
138          };
139  
140          ui = {
141            default-command = [ "status" ];
142            diff-editor = ":builtin";
143            diff.format = "git";
144            editor = "nvim";
145            pager = "delta";
146          };
147        };
148      };
149    };
150  }