Claude Code Plugins

Community-maintained marketplace

Feedback

Setting Up Jujutsu Repositories and Tool Integration

@edmundmiller/dotfiles
40
0

Set up jj repositories including colocation decisions, integrate with development tools like Vite/Vitest, and choose between jj library and CLI for tooling. Use when setting up new repositories, experiencing tool integration issues, or building jj integrations.

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name Setting Up Jujutsu Repositories and Tool Integration
description Set up jj repositories including colocation decisions, integrate with development tools like Vite/Vitest, and choose between jj library and CLI for tooling. Use when setting up new repositories, experiencing tool integration issues, or building jj integrations.
allowed-tools Bash(jj init:*), Bash(jj git:*), Read(*/jj-repository-setup/*.md), Edit(.jjconfig.toml), Edit(jj:*.toml), Edit(vite:*.config.*)

Setting Up Jujutsu Repositories and Tool Integration

Overview

Key decisions:

  • Colocation: Should you use jj and git in the same directory?
  • Tool integration: How to configure development tools to work with jj
  • Programmatic access: Library vs CLI for building jj integrations

Understanding these choices helps you set up repositories correctly and avoid common integration issues.

Repository Setup

Colocation Decision

What is colocation?

Using jj and git in the same working directory:

my-repo/
├── .git/     # Git repository
├── .jj/      # Jujutsu repository
└── src/      # Shared working directory

Creating colocated repository:

# Initialize jj in existing git repo
cd my-git-repo
jj git init --colocate

# Or create new colocated repo
jj git init --colocate my-repo
cd my-repo

Creating jj-only repository:

# Pure jj repository (no colocation)
jj git init my-repo
cd my-repo

Should You Colocate?

Advantages:

  • ✅ Use both Git and Jujutsu tools on same repo
  • ✅ Easier transition/learning (can fall back to git)
  • ✅ Works with git-only tools (IDEs, CI/CD)
  • ✅ Single working directory

Drawbacks:

  • ❌ Potential bookmark/branch conflicts
  • ❌ Confusing diffs in conflicted files (shows both tools' markers)
  • ❌ Slight performance overhead in large repos
  • ❌ Can accidentally use git commands (bad practice in jj)

Recommendation:

Scenario Recommendation
Learning jj Colocate (easier transition)
Team migration Colocate (gradual adoption)
New personal project jj-only (cleaner)
Legacy git project Colocate (tool compatibility)
CI/CD requirements Colocate (git tooling)

Tool Integration

Vite/Vitest Issues

Problem: jj commands slow or hang in Vite/Vitest projects.

Cause: Vite's file watcher monitors .jj directory, causing conflicts and slowdowns.

Solution: Configure Vite to ignore .jj:

// vite.config.js or vite.config.ts
export default {
  server: {
    watch: {
      ignored: ['**/.jj/**']
    }
  }
}

For Vitest:

// vitest.config.js or vitest.config.ts
export default {
  test: {
    // ... other config
    watch: {
      ignored: ['**/.jj/**']
    }
  }
}

Complete example:

import { defineConfig } from 'vite'

export default defineConfig({
  server: {
    watch: {
      ignored: [
        '**/.jj/**',      // Ignore jj directory
        '**/.git/**',     // Good practice to ignore git too
        '**/node_modules/**'
      ]
    }
  }
})

General Tool Integration

Common issues and fixes:

File watchers:

  • Exclude .jj/ from watching
  • Pattern: **/.jj/** or .jj

IDEs (VS Code, IntelliJ, etc.):

// .vscode/settings.json
{
  "files.watcherExclude": {
    "**/.jj/**": true
  },
  "search.exclude": {
    "**/.jj/**": true
  }
}

Build tools:

  • Add .jj/ to ignore patterns
  • Similar to .git/ configuration

Linters/formatters:

# .prettierignore or .eslintignore
.jj/

Programmatic Integration

Library vs CLI Trade-offs

Question: Should I use the jj library or parse CLI output?

Answer: Both have trade-offs. Library avoids parsing but isn't stable. CLI is also unstable but more flexible.

Using the Library

Pros:

  • ✅ Native Rust integration
  • ✅ No parsing needed
  • ✅ Direct access to data structures

Cons:

  • ❌ API not stable (frequent breaking changes)
  • ❌ Rust only (no other languages)
  • ❌ Won't detect custom backends
  • ❌ Requires Rust knowledge

When to use:

  • Building Rust tools
  • Need high performance
  • Want type safety
  • Willing to handle API changes

Using the CLI

Pros:

  • ✅ Language-agnostic (any language can run commands)
  • ✅ Works with custom jj binaries
  • ✅ Easier to prototype
  • ✅ Matches user experience

Cons:

  • ❌ Output format can change (also unstable)
  • ❌ Parsing overhead
  • ❌ Process spawning overhead
  • ❌ Need to handle errors/edge cases

When to use:

  • Building scripts (bash, python, etc.)
  • Need portability
  • Rapid prototyping
  • Want consistency with user commands

Best Practices for CLI Integration

# Use --no-pager for scripting
jj log --no-pager

# Use templates for structured output
jj log --template 'commit_id ++ "\t" ++ description.first_line() ++ "\n"'

# Use revsets for precise queries
jj log -r 'mine() & after("1 week ago")'

# Check exit codes
if jj status &>/dev/null; then
  echo "In jj repository"
fi

Example Python integration:

import subprocess
import json

def jj_log(revset="@"):
    result = subprocess.run(
        ["jj", "log", "-r", revset, "--no-pager",
         "--template", "json"],
        capture_output=True,
        text=True
    )
    return json.loads(result.stdout)

When to Use This Skill

Use this skill when:

  • ✅ Setting up new jj repositories
  • ✅ Deciding on colocation strategy
  • ✅ Experiencing tool integration issues (Vite, IDEs, watchers)
  • ✅ Building integrations with jj
  • ✅ Choosing between library and CLI approach

Don't use this skill for:

  • ❌ Daily jj operations (see jj-workflow skill)
  • ❌ Commit management (see commit-curation skill)
  • ❌ Understanding jj concepts (see other jj skills)

Progressive Disclosure

For detailed setup guides, configuration examples, and integration patterns:

📚 See detailed docs: faq-reference.md

This includes:

  • Complete colocation analysis
  • Tool-specific integration guides
  • Advanced configuration examples
  • Library API patterns
  • CLI parsing strategies

Quick Reference

# Repository initialization
jj git init --colocate           # Colocated repo (jj + git)
jj git init                      # jj-only repo
jj git init --colocate existing-git-repo  # Add jj to git repo

# Configuration
~/.jjconfig.toml                 # Global config
.jj/repo/config.toml             # Repository config

# Tool integration
# Vite: Add to vite.config.js
server.watch.ignored = ['**/.jj/**']

# VS Code: Add to .vscode/settings.json
"files.watcherExclude": {"**/.jj/**": true}

Remember

Colocation is a choice, not a requirement. Use it when you need git compatibility, prefer pure jj otherwise. Always configure development tools to ignore .jj/ directory to avoid conflicts and performance issues.