Generate a monthly documentation report from git history. Use this skill when the user asks to create a monthly docs report, monthly newsletter, or wants to summarize documentation changes for a specific month. Trigger when user mentions "monthly report", "docs newsletter", "documentation changes for [month]", or similar phrasing.
76
78%
Does it follow best practices?
Impact
70%
1.94xAverage score across 2 eval scenarios
Passed
No findings from the security scan
Fix and improve this skill with Tessl
tessl review fix ./skills/monthly-docs-report/SKILL.mdGenerate a structured monthly report of documentation changes from git commit history.
Analyzes git commits for a specified month and produces a markdown report categorizing documentation changes. The report is formatted for easy copying into Google Docs and uses clear, factual language without hyperbole.
The report should follow this exact structure:
# [Month YYYY] Documentation Updates
## Summary Statistics
- Total commits: [N] (excluding dependency updates and merges)
- New documentation pages: [N]
- Configuration reference updates: [N]
- Contributors: [N]
## New Pages
- **[Page Title]** ([PR #]) - Contributor Name
- Brief description of what the page covers
- Key topics or use cases addressed
## Major Features and Updates
- **[Feature/Update Name]** ([PR #]) - Contributor Name
- What changed or was added
- Impact or purpose of the change
## Reference Updates
- **[What was added to config reference]** ([PR #]) - Contributor Name
- Brief description of the addition
## Infrastructure and Tooling Updates
- **[Tool/Infrastructure Change]** ([PR #]) - Contributor Name
- What changed and why it mattersAsk the user which month and year they want to analyze if not specified.
Important: Do NOT use --since/--until or --after/--before date filters directly on git log. Those filter by author date, which means commits from a PR opened in month X but merged in month Y will appear in the wrong month's results.
Instead, find the exact state of main at the start and end of the month, then diff between them:
# Find the boundary SHAs — last commit on main before the month started and ended
MONTH_END=$(git rev-list --max-count=1 --before="YYYY-MM-31T23:59:59" main)
MONTH_START=$(git rev-list --max-count=1 --before="YYYY-MM-01T00:00:00" main)
# Get all non-merge commits that actually landed on main during the month
git log --no-merges ${MONTH_START}..${MONTH_END} --oneline
# Get commits excluding dependency updates
git log --no-merges ${MONTH_START}..${MONTH_END} --oneline | \
grep -vE "(chore\(deps\)|fix\(deps\)|Update dependency|Update Node.js|Update aws-sdk|Update module|Update tailwindcss|Update cimg/|feat: update Xcode|feat: add Xcode|Bump )"
# For key commits, get details with file changes
git show --stat --oneline <commit-hash>This approach correctly handles PRs that were opened in one month but merged in another.
Review the commits and categorize them:
New Pages: Look for commits that add new .adoc files or mention "new page", "new guide", "new documentation"
Major Features and Updates: Look for:
Reference Updates: Look for commits that modify configuration-reference.adoc or explicitly mention adding to the config reference
Infrastructure and Tooling: Look for:
Exclude these from detailed listings:
You can mention large cleanup campaigns (e.g., "Vale linting cleanup across 60+ files") as a single infrastructure item.
For each significant change:
(#10123))--format="%an")To get contributor names along with commits:
git log --no-merges ${MONTH_START}..${MONTH_END} --pretty=format:"%h | %s | %an"When multiple people contribute to related changes, list all contributors (e.g., "Contributor A, Contributor B")
# Get unique contributor count for the month
git log --since="YYYY-MM-01" --until="YYYY-MM-31" --format="%an" | \
grep -vE "(dependabot|renovate)" | sort -u | wc -lWrite the markdown file to [month]-[year]-newsletter.md (e.g., april-2026-newsletter.md).
Be factual and concise:
Good examples:
Avoid:
Per-item format: Each item should have:
Example:
- **Slack Integration Guide** (#10146) - Henna
- Setup instructions for CircleCI Slack integration
- Includes org and project-level configurationEmpty month: If no substantive commits, say so clearly:
# [Month YYYY] Documentation Updates
No significant documentation updates were made in [Month YYYY].Mixed types: If a PR affects multiple categories, list it in the most relevant one, don't duplicate.
Large cleanup campaigns: Group related small changes (e.g., 50 Vale linting fixes) into one infrastructure item rather than listing each individually.
Changes that don't fit the categories: If you find commits that don't fit into any of the 5 categories, inform the user and ask if a new section is needed. List the commits that don't fit and suggest potential category names. For example:
I found [N] commits that don't fit the existing categories:
- [commit description] (#PR)
- [commit description] (#PR)
These seem to be related to [theme]. Should I add a new section called "[Suggested Name]"?Save the report to a file named [month]-[year]-newsletter.md in the current working directory and inform the user where it was saved.
ae66960
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.