Tags: omarkohl/jip
Tags
feat: include commit body in PR description The jj template was only fetching description.first_line(), so the commit body was never available for PRs. Now fetches the full description, splits it into Title()/Body(), and passes the body through to PR creation and stack body updates. Stacked PRs show a "## Description" heading above the commit body to distinguish it from jip metadata. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
fix: separate stdout/stderr in jj runner to avoid parse errors jj can write warnings to stderr (e.g. "Refused to snapshot some files"). Using CombinedOutput() mixed these into the JSONL output, causing ParseChanges to fail. Switch Log() and BookmarkList() to capture stderr separately via cmd.Output().
fix: escape code fences in diff comments when content contains backticks Diffs of markdown files can contain triple backticks which prematurely close the outer code fence, breaking the rendered comment. Use a longer fence (N+1 backticks) when the diff content contains N consecutive backticks.
fix: use jj's synced() instead of unreliable ahead/behind counts Bug: after rebasing a change onto a main branch with many new commits (~10+), `jj send` would skip the change with "remote is ahead of local" instead of pushing it. Root cause: the bookmark list template used jj's tracking_ahead_count and tracking_behind_count with .exact(), falling back to 0 when the SizeHint couldn't compute the value. With many commits between old and new parent, the behind count silently fell to 0, making a legitimate rebase (ahead>0, behind>0) look like "remote is ahead" (ahead>0, behind=0). Fix: replace ahead/behind counts with jj's synced() template function, which reliably indicates whether local and remote agree. Push safety is now determined by !conflict && !synced, matching jj's own model. This eliminates the SyncBehind state entirely — when conflict is false and not synced, the local side is always authoritative (jj auto-fast-forwards on fetch, so a non-conflicting difference means the local was deliberately moved).
PreviousNext