Replace jj with git, use lazygit in neovim

This commit is contained in:
2026-02-03 10:26:22 +00:00
parent f07e0be31d
commit 682889f878
16 changed files with 61 additions and 225 deletions

View File

@@ -1,8 +1,5 @@
# AGENTS.md
## ⚠️ VERSION CONTROL: JUJUTSU (jj) ONLY
**NEVER run git commands.** This repo uses Jujutsu (`jj`). Use `jj status`, `jj diff`, `jj commit`, etc.
## Build Commands
### Local Development

View File

@@ -40,11 +40,6 @@
url = "github:jnsahaj/lumen";
inputs.nixpkgs.follows = "nixpkgs";
};
jj-ryu = {
url = "github:dmmulroy/jj-ryu";
flake = false;
};
jj-starship.url = "github:dmmulroy/jj-starship";
nono = {
url = "github:lukehinds/nono";
flake = false;

View File

@@ -31,8 +31,6 @@
../../profiles/ghostty.nix
../../profiles/git.nix
../../profiles/home.nix
../../profiles/jjui.nix
../../profiles/jujutsu.nix
../../profiles/lazygit.nix
../../profiles/lumen.nix
../../profiles/mise.nix

View File

@@ -30,8 +30,6 @@
../../profiles/ghostty.nix
../../profiles/git.nix
../../profiles/home.nix
../../profiles/jjui.nix
../../profiles/jujutsu.nix
../../profiles/lazygit.nix
../../profiles/lumen.nix
../../profiles/mise.nix

View File

@@ -31,8 +31,6 @@
../../profiles/fzf.nix
../../profiles/git.nix
../../profiles/home.nix
../../profiles/jjui.nix
../../profiles/jujutsu.nix
../../profiles/lazygit.nix
../../profiles/lumen.nix
../../profiles/mise.nix

View File

@@ -1,7 +0,0 @@
{inputs}: final: prev: {
jj-ryu =
import ../lib/build-rust-package.nix {
inherit prev;
input = inputs.jj-ryu;
};
}

View File

@@ -1 +0,0 @@
{inputs}: inputs.jj-starship.overlays.default

View File

@@ -1,5 +0,0 @@
{
programs.jjui = {
enable = true;
};
}

View File

@@ -1,60 +0,0 @@
{
programs.jujutsu = {
enable = true;
settings = {
user = {
name = "Christoph Schmatzler";
email = "christoph@schmatzler.com";
};
git = {
sign-on-push = true;
subprocess = true;
write-change-id-header = true;
private-commits = "description(glob:'wip:*') | description(glob:'WIP:*') | description(exact:'')";
};
fsmonitor = {
backend = "watchman";
};
ui = {
default-command = "status";
diff-formatter = ":git";
pager = ["delta" "--pager" "less -FRX"];
diff-editor = ["nvim" "-c" "DiffEditor $left $right $output"];
movement = {
edit = true;
};
};
aliases = {
n = ["new"];
tug = ["bookmark" "move" "--from" "closest_bookmark(@-)" "--to" "@-"];
stack = ["log" "-r" "stack()"];
retrunk = ["rebase" "-d" "trunk()"];
bm = ["bookmark"];
gf = ["git" "fetch"];
gp = ["git" "push"];
};
revset-aliases = {
"closest_bookmark(to)" = "heads(::to & bookmarks())";
"closest_pushable(to)" = "heads(::to & mutable() & ~description(exact:\"\") & (~empty() | merges()))";
"mine()" = "author(\"christoph@schmatzler.com\")";
"wip()" = "mine() ~ immutable()";
"open()" = "mine() ~ ::trunk()";
"current()" = "@:: & mutable()";
"stack()" = "reachable(@, mutable())";
};
templates = {
draft_commit_description = ''
concat(
coalesce(description, default_commit_description, "\n"),
surround(
"\nJJ: This commit contains the following changes:\n", "",
indent("JJ: ", diff.stat(72)),
),
"\nJJ: ignore-rest\n",
diff.git(),
)
'';
};
};
};
}

View File

@@ -8,7 +8,6 @@
./plugins/grug-far.nix
./plugins/harpoon.nix
./plugins/hunk.nix
./plugins/jj-diffconflicts.nix
./plugins/lsp.nix
./plugins/mini.nix
./plugins/oil.nix

View File

@@ -118,21 +118,15 @@
options.desc = "Visit paths (cwd)";
}
# g - git
{
mode = "n";
key = "<leader>gc";
action = ":JJDiffConflicts<CR>";
options.desc = "Resolve conflicts";
}
{
mode = "n";
key = "<leader>gg";
action.__raw = ''
function()
require('toggleterm.terminal').Terminal:new({ cmd = 'jjui', direction = 'float' }):toggle()
require('toggleterm.terminal').Terminal:new({ cmd = 'lazygit', direction = 'float' }):toggle()
end
'';
options.desc = "jjui";
options.desc = "lazygit";
}
# l - lsp/formatter
{

View File

@@ -1,14 +0,0 @@
{pkgs, ...}: {
programs.nixvim.extraPlugins = [
(pkgs.vimUtils.buildVimPlugin {
name = "jj-diffconflicts";
src =
pkgs.fetchFromGitHub {
owner = "rafikdraoui";
repo = "jj-diffconflicts";
rev = "main";
hash = "sha256-hvMXpslucywVYA9Sdxx6IcXQXYcYNWK8s9jr+KtStdI=";
};
})
];
}

View File

@@ -1,70 +0,0 @@
---
name: vcs-detect
description: Detect whether the current project uses jj (Jujutsu) or git for version control. Run this BEFORE any VCS command to use the correct tool.
---
# VCS Detection Skill
Detect the version control system in use before running any VCS commands.
## Why This Matters
- jj (Jujutsu) and git have different CLIs and workflows
- Running `git` commands in a jj repo (or vice versa) causes errors
- Some repos use jj with git colocated (both `.jj/` and `.git/` exist)
## Detection Logic
Both `jj root` and `git rev-parse --show-toplevel` walk up the filesystem to find repo root.
**Priority order:**
1. `jj root` succeeds → jj (handles colocated too)
2. `git rev-parse` succeeds → git
3. Both fail → no VCS
## Detection Command
```bash
if jj root &>/dev/null; then echo "jj"
elif git rev-parse --show-toplevel &>/dev/null; then echo "git"
else echo "none"
fi
```
## Command Mappings
| Operation | git | jj |
|-----------|-----|-----|
| Status | `git status` | `jj status` |
| Log | `git log` | `jj log` |
| Diff | `git diff` | `jj diff` |
| Commit | `git commit` | `jj commit` / `jj describe` |
| Branch list | `git branch` | `jj branch list` |
| New branch | `git checkout -b <name>` | `jj branch create <name>` |
| Push | `git push` | `jj git push` |
| Pull/Fetch | `git pull` / `git fetch` | `jj git fetch` |
| Rebase | `git rebase` | `jj rebase` |
## Usage
Before any VCS operation:
1. Run detection command
2. Use appropriate CLI based on result
3. If `none`, warn user directory is not version controlled
## Example Integration
```
User: Show me the git log
Agent: [Runs detection] -> Result: jj
Agent: [Runs `jj log` instead of `git log`]
```
## Colocated Repos
When both `.jj/` and `.git/` exist, the repo is "colocated":
- jj manages the working copy
- git is available for compatibility (GitHub, etc.)
- **Always prefer jj commands** in colocated repos

View File

@@ -27,8 +27,6 @@ with pkgs;
hledger
htop
hyperfine
jj-ryu
jj-starship
jq
killall
lsof

View File

@@ -5,7 +5,7 @@
settings = {
add_newline = true;
command_timeout = 2000;
format = "[$directory$\{custom.scm}]($style)$character";
format = "$directory$git_branch$git_status$character";
character = {
error_symbol = "[ ](bold #e64553)";
success_symbol = "[](bold #40a02b)[](bold #df8e1d)[](bold #dc8a78)";
@@ -16,10 +16,26 @@
repo_root_style = "bold cyan";
repo_root_format = "[$repo_root]($repo_root_style)[$path]($style)[$read_only]($read_only_style) ";
};
custom.scm = {
when = "jj-starship detect";
shell = ["jj-starship" "--strip-bookmark-prefix" "cschmatzler/" "--truncate-name" "20" "--bookmarks-display-limit" "1"];
format = "$output ";
git_branch = {
format = "[$symbol$branch(:$remote_branch)]($style) ";
symbol = " ";
style = "bold #8839ef";
truncation_length = 20;
truncation_symbol = "";
};
git_status = {
format = "([$all_status$ahead_behind]($style) )";
style = "bold #df8e1d";
conflicted = "=$count ";
ahead = "$count ";
behind = "$count ";
diverged = "$ahead_count$behind_count ";
untracked = "?$count ";
stashed = "\\$$count ";
modified = "!$count ";
staged = "+$count ";
renamed = "»$count ";
deleted = "$count ";
};
};
};