| name | jj-hunk |
| description | Programmatic hunk selection for Jujutsu — split, commit, or squash specific hunks without interactive prompts. Use when making partial commits or selective squashes. |
| token_cost | 180 |
| related | ["jj-core","conventional-commits"] |
| keywords | ["hunk","split","partial","squash","select","jj"] |
jj-hunk
Programmatic hunk selection for Jujutsu. Split, commit, or squash specific hunks without interactive prompts.
Basic Workflow
List available hunks, create a spec file, then apply:
jj-hunk list
jj-hunk list --format text
jj-hunk list --files
jj-hunk split --spec-file /tmp/spec.yaml "feat: add feature A"
jj-hunk commit --spec-file /tmp/commit-spec.yaml "fix: handle edge case"
jj-hunk squash --spec-file /tmp/squash-spec.yaml
Targets any revision with -r <rev> (default is @ for working copy). Read specs from stdin with -.
Spec Format
YAML files control which hunks to keep or reset:
files:
src/main.rs:
hunks: [0, "hunk-7c3d..."]
path/to/skip:
action: reset
default: reset
hunks: [indices|ids] — select by 0-based index or stable id from jj-hunk list
ids: ["hunk-..."] — select by id string (sha256-based, stable across runs)
action: keep / action: reset — keep or discard all changes in a file
default — action for unlisted files
Use jj-hunk list --spec-template to generate an ID-based starting spec. IDs are more reliable than indices since they're stable across runs.
Example: Split by Hunk
jj-hunk list --format text
cat > /tmp/split-spec.yaml << 'EOF'
files:
src/main.rs:
hunks: [0]
default: reset
EOF
jj-hunk split --spec-file /tmp/split-spec.yaml "feat: add feature A"
Example: Commit Subset of Changes
cat > /tmp/commit-spec.yaml << 'EOF'
files:
src/fix.rs:
action: keep
default: reset
EOF
jj-hunk commit --spec-file /tmp/commit-spec.yaml "fix: handle edge case"
Tips
- IDs are stable (sha256-based), indices are not — prefer ids for reproducibility
- Use
--files for a quick summary without full hunk details
- Read spec from stdin:
cat spec.yaml | jj-hunk commit - "message"
- Use
-r <rev> with split/squash to target any revision
- When verifying after operations, always use the original change ID — see jj-core skill for template syntax (
concat(), description field)