document conventional commit format and best practices for writing clear, consistent commit messages in the jj skill
3.9 KiB
3.9 KiB
Jujutsu Description Style Guide
this guide defines the style conventions for commit descriptions in jujutsu repositories.
Header Format
the header is a single line in the imperative mood that summarizes the change.
Basic Structure
<prefix>: <summary>
or with scope:
<prefix>(<scope>): <summary>
Capitalization Rules
- use lowercase for all text, including the start of sentences
- exception: preserve original capitalization when referencing code elements (module names, class names, API names, functions, etc.)
examples:
fix: resolve authentication timeout issuefeat(api): add new GetUser endpointtest: ensure AuthManager handles expired tokensrefactor(protocol): simplify MessageParser logic
Common Prefixes
follow conventional commit conventions:
- feat: new feature or functionality
- fix: bug fix
- test: adding or modifying tests
- refactor: code restructuring without changing behavior
- docs: documentation changes
- style: formatting, whitespace changes
- perf: performance improvements
- build: build system or dependency changes
- ci: continuous integration configuration
- chore: maintenance tasks
- devex: developer experience improvements
Scope Guidelines
the scope provides context about which part of the codebase is affected:
feat(protocol):- protocol-related featurestest(web):- web-related testsfix(api):- API bug fixesrefactor(cli):- CLI refactoring
scopes are optional but helpful for larger projects.
Body Format (Optional)
the body provides additional context about the reasoning behind the change. it should be:
- separated from the header by one blank line
- written in lowercase (except for code references)
- 1-3 sentences explaining the "why" rather than the "what"
example:
feat(workspace): add support for nested workspaces
this enables better organization for monorepo structures where multiple
sub-projects need their own working directories while sharing history.
Lists (Optional)
if a commit includes several sub-changes, use a bulleted list after the optional body:
- maintain lowercase style (except for code references)
- use hyphens
-for list items - keep formatting consistent with header and explanation
example:
refactor(core): improve change tracking performance
this reduces memory usage and speeds up operations on large repositories.
- cache ChangeId lookups to avoid repeated hash calculations
- use lazy evaluation for descendant queries
- optimize ConflictMarker serialization format
Complete Examples
Simple header only
fix: handle empty commit messages correctly
With scope
feat(rebase): add interactive mode for selecting changes
With body
feat(api): add GetChangesByAuthor query method
this allows filtering changes by author name or email, which is useful
for reviewing team member contributions and generating reports.
With body and list
refactor(diff): restructure diff generation pipeline
the previous implementation had redundant tree traversals and unclear
separation of concerns.
- extract LineComparator into dedicated module
- introduce DiffFormatter interface for extensibility
- cache file content hashes during tree walk
- remove deprecated ThreeWayMerge implementation
Code references preserving capitalization
test(protocol): add tests for MessageEncoder edge cases
- verify MessageEncoder handles empty payloads
- ensure ProtocolVersion validation rejects invalid versions
- test SerializationError includes full context
Summary
- always use lowercase, except for code element references
- header is single line, imperative mood
- use prefixes like
feat:,fix:,test:, optionally with scope - body is optional, provides reasoning in 1-3 sentences
- lists are optional, maintain consistent style
- follow conventional commit conventions