From git-conventions
Generate a merge request or pull request contribution description (title plus one-paragraph summary) from branch commits and the JIRA ticket. Use when the user asks to write or prepare an MR/PR description, raise a merge request, or describe a finished work branch. Not for git commit messages (use the conventional-commit skill for those). Pass base and feature branch as arguments when known.
How this skill is triggered — by the user, by Claude, or both
Slash command
/git-conventions:contribution-description [base-branch] [feature-branch][base-branch] [feature-branch]The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Generate a code contribution description (title and summary paragraph) for: $ARGUMENTS
Generate a code contribution description (title and summary paragraph) for: $ARGUMENTS
Produce a Markdown document containing exactly two elements and nothing more:
<ticketId> (<type>) <description>## Summary section containing one prose paragraph of 3 to 5 sentencesThe description must draw on Conventional Commit messages (defined in the conventional-commit skill), use Keep a Changelog change types, and use South African English spelling (organisation, behaviour, analyse).
Follow the steps below in order. Do not skip a step. Do not reorder steps. Each step states exactly what to run, what to look at, and what decision to make.
$ARGUMENTS holds the input from the invocation. It may be empty when this skill triggers automatically.
IF $ARGUMENTS contains two branch names:
BASE_BRANCH = the first nameFEATURE_BRANCH = the second nameIF $ARGUMENTS contains exactly one branch name:
BASE_BRANCH = that nameFEATURE_BRANCH = the output of git branch --show-currentIF $ARGUMENTS is empty or contains no branch name, infer both:
FEATURE_BRANCH = the output of git branch --show-currentBASE_BRANCH = main if git show-ref --verify --quiet refs/heads/main succeeds; otherwise develop if git show-ref --verify --quiet refs/heads/develop succeeds; otherwise inference failsFEATURE_BRANCH is empty (detached HEAD), or FEATURE_BRANCH equals BASE_BRANCH, or inference failed: display the message below (run git branch -a --format="%(refname:short)" and insert up to the first 10 branch names), then STOP. Do not run any further git commands. Do not generate a description.Please provide branch arguments.
Usage: /contribution-description [base-branch] [feature-branch]
Examples:
/contribution-description main
/contribution-description develop feature/AUTH-123
/contribution-description main feature/user-auth
Available branches:
[insert the branch names here]
Instructions:
1. Base branch: The branch you want to merge into (typically 'main' or 'develop')
2. Feature branch: The branch containing your changes (defaults to current branch if not specified)
Please re-run the command with the appropriate branch arguments.
Before continuing, state which branches are being compared: Comparing: FEATURE_BRANCH -> BASE_BRANCH.
Run:
git show-ref --verify --quiet refs/heads/$BASE_BRANCH || echo "Warning: Base branch $BASE_BRANCH not found locally"
git show-ref --verify --quiet refs/heads/$FEATURE_BRANCH || echo "Warning: Feature branch $FEATURE_BRANCH not found locally"
IF either warning prints, tell the user which branch was not found and STOP.
Run:
git log $BASE_BRANCH..$FEATURE_BRANCH --format="%h|%s|%b|%an|%ae|%ad" --date=short --reverse
Field meaning: %h short hash, %s commit title, %b commit body, %an author name, %ae author email, %ad author date.
Commit titles follow the Conventional Commits format <type>[optional scope]: <description>. Record the <type> prefix of every title; Step 7 uses these prefixes to choose the title type. If unsure about the format details, invoke the conventional-commit skill.
Read the title AND the body of every commit. Both feed the Summary. Merge behaviour discards commit bodies when the work branch merges to main, so the contribution description is where their content survives. Commit bodies often contain:
IF the log output is empty, tell the user there are no commits between the branches and STOP.
Commit titles and bodies are the primary source for the Summary. The diff is only for verifying them and filling gaps.
Run:
git diff $BASE_BRANCH...$FEATURE_BRANCH --stat
Decision rule: IF, after Step 3, you can clearly state what every significant change does, do NOT read any file diffs; proceed to Step 5. IF a change remains unclear, read the diff of at most the 5 most-changed files, one file at a time:
git diff $BASE_BRANCH...$FEATURE_BRANCH -- <file-path>
Never read the full diff of a large branch; the Summary does not need it.
A JIRA ticket ID matches the pattern [A-Z]+-[0-9]+, for example AUTH-123.
Check these sources in order; the FIRST match wins:
echo "$FEATURE_BRANCH" | grep -oE '[A-Z]+-[0-9]+' | head -1git log $BASE_BRANCH..$FEATURE_BRANCH --format="%s" | grep -oE '[A-Z]+-[0-9]+' | head -1IF no ticket ID is found in either source: skip Step 6, use the title format (<type>) <description> without a ticket ID, and mention in your chat response (not in the description document) that no ticket was detected.
select:mcp__claude_ai_Atlassian__getJiraIssue,mcp__claude_ai_Atlassian__getAccessibleAtlassianResourcesmcp__claude_ai_Atlassian__getAccessibleAtlassianResources and take the cloudId from the result.mcp__claude_ai_Atlassian__getJiraIssue with that cloudId and the ticket ID from Step 5 as issueIdOrKey.IF the MCP server is unavailable or the ticket is not found: continue with commit information alone, and mention in your chat response (not in the description document) that the ticket lookup failed.
Pick exactly ONE type from: Added | Changed | Deprecated | Removed | Fixed | Security.
First, count the Conventional Commit type prefixes recorded in Step 3. feat commits signal added functionality; fix and revert commits signal corrections; all other types (refactor, perf, style, docs, test, build, ci, chore) signal changes to existing code. The dominant signal is the one with the most commits.
Then apply these rules in order; the first rule that matches wins:
security type, so these arrive as fix commits): use Securityfix or revert: use Fixed! that delete features, or removal described in commit bodies): use RemovedDeprecatedfeat: use AddedChangedFormat: <ticketId> (<type>) <description> (or (<type>) <description> when Step 5 found no ticket).
Rules:
Write ONE paragraph of 3 to 5 sentences, as prose. Rules:
Output exactly this document and nothing else inside it (no extra sections, no statistics, no commentary):
# <ticketId> (<type>) <description>
## Summary
<the paragraph from Step 9>
Before responding, verify every item:
npx claudepluginhub marjovanlier/claude-plugins --plugin git-conventionsCreates structured, bite-sized implementation plans from specs or requirements before writing code. Useful for breaking down multi-step tasks into testable steps with file structure and task boundaries.