| 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:
cd my-git-repo
jj git init --colocate
jj git init --colocate my-repo
cd my-repo
Creating jj-only repository:
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:
export default {
server: {
watch: {
ignored: ['**/.jj/**']
}
}
}
For Vitest:
export default {
test: {
watch: {
ignored: ['**/.jj/**']
}
}
}
Complete example:
import { defineConfig } from 'vite'
export default defineConfig({
server: {
watch: {
ignored: [
'**/.jj/**',
'**/.git/**',
'**/node_modules/**'
]
}
}
})
General Tool Integration
Common issues and fixes:
File watchers:
- Exclude
.jj/ from watching
- Pattern:
**/.jj/** or .jj
IDEs (VS Code, IntelliJ, etc.):
{
"files.watcherExclude": {
"**/.jj/**": true
},
"search.exclude": {
"**/.jj/**": true
}
}
Build tools:
- Add
.jj/ to ignore patterns
- Similar to
.git/ configuration
Linters/formatters:
.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
jj log --no-pager
jj log --template 'commit_id ++ "\t" ++ description.first_line() ++ "\n"'
jj log -r 'mine() & after("1 week ago")'
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
jj git init --colocate
jj git init
jj git init --colocate existing-git-repo
~/.jjconfig.toml
.jj/repo/config.toml
server.watch.ignored = ['**/.jj/**']
"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.