{"id":"86d2f9d1-96c4-454e-9a40-b35c5f64da96","shortId":"bTCzUS","kind":"skill","title":"commit-message-storyteller","tagline":"Analyzes git diffs or staged changes and generates narrative commit messages that explain WHY a change was made, not just what changed — following Conventional Commits format. Use when asked to \"write a commit message\", \"generate a commit\", \"describe my changes\", \"what should I c","description":"# Commit Message Storyteller\n\nTransforms raw git diffs and change descriptions into clear, story-driven commit messages that follow the [Conventional Commits](https://www.conventionalcommits.org/) specification. Instead of \"update file.js\", you get messages that communicate intent, context, and impact.\n\n## When to Use This Skill\n\n- User says \"write a commit message\", \"help me commit\", or \"generate a commit\"\n- User pastes a git diff or describes code changes\n- User says \"what should I commit this as?\" or \"summarize my diff\"\n- User wants better commit history for their team or open-source project\n- User is preparing a pull request and wants meaningful commit messages\n\n## Prerequisites\n\nHave at least one of the following ready:\n- Output from `git diff` or `git diff --staged`\n- A description of what you changed and why\n- A list of modified files\n\n## How It Works\n\n### Step 1: Gather the Change Context\n\nAsk the user (or infer from the diff) for:\n\n1. **What changed** — files, functions, logic affected\n2. **Why it changed** — bug fix, new feature, refactor, performance, etc.\n3. **Who/what triggered it** — issue number, user request, tech debt, etc.\n\nIf the user provides a raw `git diff`, extract this context automatically from the diff.\n\n### Step 2: Identify the Commit Type\n\nMap the change to a Conventional Commits type using this guide:\n\n| Type | Use When |\n|------|----------|\n| `feat` | A new feature or capability is added |\n| `fix` | A bug or incorrect behavior is corrected |\n| `refactor` | Code restructured without changing behavior |\n| `perf` | A change that improves performance |\n| `docs` | Documentation only changes |\n| `style` | Formatting, whitespace, missing semicolons (no logic change) |\n| `test` | Adding or updating tests |\n| `chore` | Build process, dependency updates, config changes |\n| `ci` | CI/CD pipeline changes |\n| `revert` | Reverting a previous commit |\n\nSee `references/conventional-commits-guide.md` for detailed examples.\n\n### Step 3: Write the Commit Message\n\nFollow this structure:\n\n```\n<type>(<optional scope>): <short imperative summary>\n\n<body — the story: why this change was made, what problem it solves>\n\n<footer — issue refs, breaking change notices>\n```\n\n#### Rules for Each Part\n\n**Subject line (first line):**\n- Use imperative mood: \"add\", \"fix\", \"remove\" — not \"added\" or \"fixes\"\n- Max 72 characters\n- No period at the end\n- Lowercase after the colon\n\n**Body (the story):**\n- Explain the *why*, not the *what* (the diff already shows the what)\n- Describe the problem that existed before this change\n- Mention any alternatives considered if relevant\n- Keep lines under 100 characters\n- Separate from subject with a blank line\n\n**Footer:**\n- Reference issues: `Closes #123`, `Fixes #456`, `Refs #789`\n- Mark breaking changes: `BREAKING CHANGE: <description>`\n\n### Step 4: Generate Output\n\nProduce the commit message in a copyable code block, followed by a one-line plain-English explanation of the story you told.\n\n**Example output:**\n\n```\nfix(auth): prevent token refresh loop on expired sessions\n\nWhen a user's session expired mid-request, the auth middleware was\ntriggering a token refresh, which itself failed validation and triggered\nanother refresh — causing an infinite retry loop that crashed the app.\n\nThis adds a recursion guard flag that aborts the refresh cycle if a\nrefresh is already in progress, returning a clean 401 instead.\n\nCloses #312\n```\n\n> **Story told:** A silent infinite loop on session expiry was crashing the app; this stops the cycle early and returns a clean error.\n\n---\n\n## Multiple Commits from One Diff\n\nIf the diff contains **logically separate changes**, split them into multiple commit messages and tell the user. Use this heuristic:\n\n- Different files with unrelated purposes → likely separate commits\n- Same file but distinct concerns (e.g., bug fix + refactor) → suggest splitting\n- Everything tightly coupled → one commit is fine\n\n---\n\n## Edge Cases\n\n| Situation | How to Handle |\n|-----------|---------------|\n| User provides no context beyond a diff | Infer type and scope from file names and changed symbols |\n| Changes span many files with no clear theme | Ask: \"Is this one logical change, or multiple?\" |\n| Breaking change detected | Add `BREAKING CHANGE:` footer automatically |\n| User says \"keep it short\" | Omit body, just write a strong subject line |\n| No issue number available | Omit the footer entirely |\n\n---\n\n## Quick Reference\n\n```bash\n# Get your staged diff to paste into Copilot\ngit diff --staged\n\n# Or get the last uncommitted working tree changes\ngit diff\n```\n\nSee `references/conventional-commits-guide.md` for type examples and scope guidelines.","tags":["commit","message","storyteller","awesome","copilot","github","agent-skills","agents","custom-agents","github-copilot","hacktoberfest","prompt-engineering"],"capabilities":["skill","source-github","skill-commit-message-storyteller","topic-agent-skills","topic-agents","topic-awesome","topic-custom-agents","topic-github-copilot","topic-hacktoberfest","topic-prompt-engineering"],"categories":["awesome-copilot"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/github/awesome-copilot/commit-message-storyteller","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add github/awesome-copilot","source_repo":"https://github.com/github/awesome-copilot","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 33270 github stars · SKILL.md body (4,666 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T18:52:07.109Z","embedding":null,"createdAt":"2026-05-04T06:51:37.507Z","updatedAt":"2026-05-18T18:52:07.109Z","lastSeenAt":"2026-05-18T18:52:07.109Z","tsv":"'/)':73 '1':185,199 '100':418 '123':431 '2':206,244 '3':217,330 '312':538 '4':442 '401':535 '456':433 '72':375 '789':435 'abort':521 'ad':270,304,371 'add':367,515,655 'affect':205 'alreadi':397,529 'altern':411 'analyz':5 'anoth':503 'app':513,551 'ask':33,190,644 'auth':472,490 'automat':239,659 'avail':676 'bash':683 'behavior':276,284 'better':129 'beyond':623 'blank':425 'block':453 'bodi':338,386,666 'break':353,437,439,652,656 'bug':210,273,601 'build':309 'c':48 'capabl':268 'case':614 'caus':505 'chang':10,20,26,44,57,114,173,188,201,209,251,283,287,294,302,314,318,343,354,408,438,440,573,634,636,649,653,657,702 'charact':376,419 'chore':308 'ci':315 'ci/cd':316 'clean':534,560 'clear':60,642 'close':430,537 'code':113,280,452 'colon':385 'commit':2,14,29,37,41,49,64,70,97,101,105,120,130,149,247,255,323,333,447,563,578,594,610 'commit-message-storytel':1 'communic':83 'concern':599 'config':313 'consid':412 'contain':570 'context':85,189,238,622 'convent':28,69,254 'copilot':691 'copyabl':451 'correct':278 'coupl':608 'crash':511,549 'cycl':524,555 'debt':226 'depend':311 'describ':42,112,401 'descript':58,169 'detail':327 'detect':654 'diff':7,55,110,126,163,166,197,235,242,396,566,569,625,687,693,704 'differ':587 'distinct':598 'doc':291 'document':292 'driven':63 'e.g':600 'earli':556 'edg':613 'end':381 'english':462 'entir':680 'error':561 'etc':216,227 'everyth':606 'exampl':328,469,709 'exist':405 'expir':478,485 'expiri':547 'explain':17,389 'explan':463 'extract':236 'fail':499 'feat':263 'featur':213,266 'file':180,202,588,596,631,639 'file.js':78 'fine':612 'first':362 'fix':211,271,368,373,432,471,602 'flag':519 'follow':27,67,158,335,454 'footer':350,427,658,679 'format':30,296 'function':203 'gather':186 'generat':12,39,103,443 'get':80,684,696 'git':6,54,109,162,165,234,692,703 'guard':518 'guid':259 'guidelin':712 'handl':618 'help':99 'heurist':586 'histori':131 'identifi':245 'impact':87 'imper':365 'improv':289 'incorrect':275 'infer':194,626 'infinit':507,543 'instead':75,536 'intent':84 'issu':221,351,429,674 'keep':415,662 'last':698 'least':154 'like':592 'line':361,363,416,426,459,672 'list':177 'logic':204,301,571,648 'loop':476,509,544 'lowercas':382 'made':22,345 'mani':638 'map':249 'mark':436 'max':374 'meaning':148 'mention':409 'messag':3,15,38,50,65,81,98,150,334,448,579 'mid':487 'mid-request':486 'middlewar':491 'miss':298 'modifi':179 'mood':366 'multipl':562,577,651 'name':632 'narrat':13 'new':212,265 'notic':355 'number':222,675 'omit':665,677 'one':155,458,565,609,647 'one-lin':457 'open':137 'open-sourc':136 'output':160,444,470 'part':359 'past':107,689 'perf':285 'perform':215,290 'period':378 'pipelin':317 'plain':461 'plain-english':460 'prepar':142 'prerequisit':151 'prevent':473 'previous':322 'problem':347,403 'process':310 'produc':445 'progress':531 'project':139 'provid':231,620 'pull':144 'purpos':591 'quick':681 'raw':53,233 'readi':159 'recurs':517 'ref':352,434 'refactor':214,279,603 'refer':428,682 'references/conventional-commits-guide.md':325,706 'refresh':475,496,504,523,527 'relev':414 'remov':369 'request':145,224,488 'restructur':281 'retri':508 'return':532,558 'revert':319,320 'rule':356 'say':94,116,661 'scope':629,711 'see':324,705 'semicolon':299 'separ':420,572,593 'session':479,484,546 'short':664 'show':398 'silent':542 'situat':615 'skill':92 'skill-commit-message-storyteller' 'solv':349 'sourc':138 'source-github' 'span':637 'specif':74 'split':574,605 'stage':9,167,686,694 'step':184,243,329,441 'stop':553 'stori':62,340,388,466,539 'story-driven':61 'storytel':4,51 'strong':670 'structur':337 'style':295 'subject':360,422,671 'suggest':604 'summar':124 'symbol':635 'team':134 'tech':225 'tell':581 'test':303,307 'theme':643 'tight':607 'token':474,495 'told':468,540 'topic-agent-skills' 'topic-agents' 'topic-awesome' 'topic-custom-agents' 'topic-github-copilot' 'topic-hacktoberfest' 'topic-prompt-engineering' 'transform':52 'tree':701 'trigger':219,493,502 'type':248,256,260,627,708 'uncommit':699 'unrel':590 'updat':77,306,312 'use':31,90,257,261,364,584 'user':93,106,115,127,140,192,223,230,482,583,619,660 'valid':500 'want':128,147 'whitespac':297 'who/what':218 'without':282 'work':183,700 'write':35,95,331,668 'www.conventionalcommits.org':72 'www.conventionalcommits.org/)':71","prices":[{"id":"b93c02f9-446d-426a-b982-0dbfca05af55","listingId":"86d2f9d1-96c4-454e-9a40-b35c5f64da96","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"github","category":"awesome-copilot","install_from":"skills.sh"},"createdAt":"2026-05-04T06:51:37.507Z"}],"sources":[{"listingId":"86d2f9d1-96c4-454e-9a40-b35c5f64da96","source":"github","sourceId":"github/awesome-copilot/commit-message-storyteller","sourceUrl":"https://github.com/github/awesome-copilot/tree/main/skills/commit-message-storyteller","isPrimary":false,"firstSeenAt":"2026-05-04T06:51:37.507Z","lastSeenAt":"2026-05-18T18:52:07.109Z"}],"details":{"listingId":"86d2f9d1-96c4-454e-9a40-b35c5f64da96","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"github","slug":"commit-message-storyteller","github":{"repo":"github/awesome-copilot","stars":33270,"topics":["agent-skills","agents","ai","awesome","custom-agents","github-copilot","hacktoberfest","prompt-engineering"],"license":"mit","html_url":"https://github.com/github/awesome-copilot","pushed_at":"2026-05-18T01:26:59Z","description":"Community-contributed instructions, agents, skills, and configurations to help you make the most of GitHub Copilot.","skill_md_sha":"21f0dd15cc7129469a4f02ab2a300dbdb9b3e5ae","skill_md_path":"skills/commit-message-storyteller/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/github/awesome-copilot/tree/main/skills/commit-message-storyteller"},"layout":"multi","source":"github","category":"awesome-copilot","frontmatter":{"name":"commit-message-storyteller","description":"Analyzes git diffs or staged changes and generates narrative commit messages that explain WHY a change was made, not just what changed — following Conventional Commits format. Use when asked to \"write a commit message\", \"generate a commit\", \"describe my changes\", \"what should I commit this as\", \"commit this\", \"summarize my diff\", or \"help me commit\". Works with git diff output, staged files, or plain descriptions of changes."},"skills_sh_url":"https://skills.sh/github/awesome-copilot/commit-message-storyteller"},"updatedAt":"2026-05-18T18:52:07.109Z"}}