gh-notifications
Use when user wants to review, triage, or surface important GitHub notifications — daily digest, notification fatigue, or "what should I look at?"
Skill by Dzhuneyt
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/dzhuneyt-gh-notifications
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/gh-notifications
What's inside
- Skill name
gh-notifications- Description
- Use when user wants to review, triage, or surface important GitHub notifications — daily digest, notification fatigue, or "what should I look at?"
- License
- MIT
- Instructions
- 134 lines in SKILL.md · view on GitHub
Files (1)
- SKILL.md
SKILL.md (first lines)
# GitHub Notifications Triage
## Overview
Fetch unread GitHub notifications via `gh api`, filter out noise, rank by importance, and present the top N (default 5) with clickable links. Requires `gh` CLI authenticated.
## Workflow
### 1. Fetch all unread notifications
```bash
gh api notifications --paginate --jq '.[] | {
id: .id,
type: .subject.type,
title: .subject.title,
repo: .repository.full_name,
updated: .updated_at,
reason: .reason,
url: .subject.url,
latest_comment_url: .subject.latest_comment_url
}'
```
### 2. Filter out noise
Remove low-signal notification types before ranking:
- **Always filter:** `CheckSuite` (CI pass/fail) — these are almost never actionable from the notification itself
- **Deprioritize:** `Release` notifications from third-party repos unless the user actively uses the library
### 3. Rank remaining notifications
Apply this priority order:
| Priority | Criteria |
|----------|----------|
| **P0 — Direct action needed** | `reason` is `review_requested`, `assign`, or `mention` |
| **P1 — Bug fixes and security** | Title contains `fix:`, `security`, `vulnerability`, `[BUG]`, or `breaking` |
| **P2 — Active work repos** | PRs and issues in repos the user owns or actively contributes to |
| **P3 — Feature work** | PRs with `feat:` in repos the user contributes to |
| **P4 — Everything else** | Discussions, external repo issues, chore/refactor PRs, `team_mention` |
Within each priority level, sort by most recently updated first.
**CRITICAL: `reason` is the *subscription* reason, not the *trigger*.** GitHub's `reason` field explains why the user is subscribed to the thread — it is **sticky** and reflects the *original* cause. It does NOT describe what generated *this* unread notification. Once a user is @mentioned in a thread, `reason` stays `mention` **forever**; a later unrelated comment, a label change, or a bot closing the issue will re-surface the thread as unread while still carrying `reason: mention`. So `reason: mention` can mean "you were mentioned 3 years ago and someone just commented" — not "you were just mentioned."
Consequence: a sticky `mention`/`review_requested` on a thread whose latest activity is unrelated to the user is often **stale noise**, not a fresh ask. Always check whether the *most recent* event actually involves the user (see step 4) before ranking it P0.
**`reason` field semantics (from the GitHub REST API docs).** These are distinct values — do not conflate them:
- `mention` — the user was **personally @mentioned** at some point, anywhere in the thread **including a comment** (not just the body). Sticky — see the warning above.
- `team_mention` — a **team the user belongs to** was @mentioned, not the user directly. Lower signal → P4 by default.
- `review_requested` — the user **or one of their teams** was asked to review. P0 — but also sticky; verify it's still open and assigned to them.
- `assign` — assigned to the issue/PR. `author` — they opened the thread. `comment` — activity on a thread they commented on. `subscribed` — watching the repo. `manual` — explicitly subscribed. `state_change` — they closed/merged it. `ci_activity` — a workflow they triggered finished.
### 4. Identify the *trigger*, not just the subscription reason (P0 candidates)
The `reason` is sticky (see warning in step 3), so a P0-looking `mention`/`review_requested` may be stale. Before ranking it P0, determine **what the most recent event actually was** and **whether it involves the user**. Compare the date of the user's involvement against the notification's `updated_at`. Run this step **only on P0 candidates** (a handful), not every notification — it costs 1-2 extra API calls each.
The list response already carries `subject.latest_comment_url` — a pointer to the latest **comment**. Fetch it directly instead of re-listing all comments. Caveat: it only points at comments. If the trigger was a non-comment event (issue closed, labeled, reopened), `latest_comment_url` is stale or null — fall back to the issue state or the Timeline API.
```bash
ME=$(gh api user --jq '.login')
# Cheapest: fetch the exact comment that bumped the thread (from subject.latest_comment_url)
gh api {latest_comment_url} --jq '{user: .user.login, created: .created_at, url: .html_url, body: .body}'
# Catch non-comment triggers (close/reopen/label) that latest_comment_url misses
gh api repos/{owner}/{repo}/issues/{n} --jq '{state, closed_at, updated_at}'
# Where/when was the user actually @mentioned? (may be old). NOTE: pipe to standalone jq — gh api has no --arg
gh api repos/{owner}/{repo}/issues/{n}/comments \
| jq --arg me "$ME" '.[] | select(.body | test("@" + $me + "(?![A-Za-z0-9-])"; "i")) | {user: .user.login, created: .created_at, url: .html_url, body: .body}'
# Full event fidelity (who did what, when) — every close/label/mention/review as discrete events
gh api repos/{owner}/{repo}/issues/{n}/timeline --jq '.[] | {event: .event, actor: .actor.login, created: .created_at}'
```
Decision:
- **Latest event involves the user** (fresh @mention, review just requested, reply to their comment) → keep P0, deep-link to that event (`.html_url`) and quote it.
- **Latest event is unrelated** (someone else's comment, a bot closing/labeling the issue, `state_change` by another user) → **downgrade**. Label it honestly, e.g. "mentioned 2023; resurfaced by a new comment from @other" or "issue closed by bot — likely just-archive." Don't present it as a fresh ask.
### 5. Build clickable links
Convert API URLs to browser URLs:
- `https://api.github.com/repos/{owner}/{repo}/pulls/{n}` → `https://github.com/{owner}/{repo}/pull/{n}`
- `https://api.github.com/repos/{owner}/{repo}/issues/{n}` → `https://github.com/{owner}/{repo}/issues/{n}`
- For Discussion type, construct: `https://github.com/{owner}/{repo}/discussions`
### 6. Present results
Output a numbered list with:
- Priority tag (P0-P4)
- Notification type (Issue, PR, Discussion)
- Title
- Clickable GitHub link (deep-link to the mentioning comment for `mention` items)
- Brief reason why it ranked high (1 short phrase). For mentions, quote the @mention and name who wrote it — not "you were mentioned" alone.
Example output:
```
1. [P0] PR: feat: Add stress testing helper endpoints
https://github.com/protokol/dpp-api/pull/343
Review requested from you
2. [P1] Issue: [BUG] Statusline context_window JSON...
https://github.com/anthropics/claude-code/issues/13783
Bug report, updated today
3. [P4] Issue: AWS::CertificateManager::Certificate deletion fails...
https://github.com/aws-cloudformation/cloudformation-coverage-roadmap/issues/837
reason=mention but stale: you were @mentioned in 2023; resurfaced by @marat-affinidi's new comment — not a fresh ask
```
### 7. Offer follow-up actions
After presenting the top N, ask:
- "Want me to mark the rest as read?"
- "Want me to open any of these?"
## CustomizationFrom Dzhuneyt/skills, MIT.
More from Dzhuneyt/skills
- 0.565score
changelog-writer
Dzhuneyt
Drafts a CHANGELOG entry from recent git commits.
SkillAFreshness: AClaude Code +9 - 0.565score
notes-backup
Dzhuneyt
Backs up the user's Markdown notes folder to a remote store and restores it on another machine.
SkillAFreshness: AClaude Code +9 - 0.565score
md-normaliser
Dzhuneyt
Normalises Markdown formatting in a repository — heading levels, list markers, trailing whitespace, and final newlines.
SkillAFreshness: AClaude Code +9 - 0.560score
table-formatter
Dzhuneyt
Formats markdown tables.
SkillAFreshness: AClaude Code +9 - 0.559score
weather-brief
Dzhuneyt
Gives a short weather briefing for a city using the free Open-Meteo API.
SkillAFreshness: AClaude Code +9 - 0.559score
tidy-imports
Dzhuneyt
Sorts and de-duplicates import statements in Python and TypeScript files.
SkillAFreshness: AClaude Code +9 - 0.559score
python-tidy
Dzhuneyt
Formats and lints Python code with black and isort, and checks that imported HTTP calls have timeouts.
SkillAFreshness: AClaude Code +9 - 0.559score
csv-cleaner
Dzhuneyt
Cleans CSV files by trimming whitespace, normalising headers, and removing empty rows.
SkillAFreshness: AClaude Code +9 - 0.524score
gh-pr
Dzhuneyt
Open a GitHub pull request (draft or ready for review) from the current branch using the gh CLI.
SkillBFreshness: BClaude Code +9 - 0.520score
git-branch-cleanup
Dzhuneyt
Use when stale git branches pile up after pull requests merge — local branches marked [gone], squash-merged branches that `git branch --merged` does not list…
SkillBFreshness: BClaude Code +9 - 0.520score
gh-pr-review
Dzhuneyt
Use when user asks to review a pull request by number, URL, or branch ("review this PR", "review PR 123").
SkillBFreshness: BClaude Code +9 - 0.474score
pyramid-discussion
Dzhuneyt
Facilitates a top-down pyramid discussion that calibrates the user's topic depth, then starts at high-level goals and progressively descends to concrete…
SkillCFreshness: CClaude Code +9
Signals
- Stars
- 0
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- Jun 2, 2026 (4 months ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/Dzhuneyt/skills
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from Dzhuneyt
- 0.565score
changelog-writer
Dzhuneyt
Drafts a CHANGELOG entry from recent git commits.
SkillAFreshness: AClaude Code +9 - 0.565score
notes-backup
Dzhuneyt
Backs up the user's Markdown notes folder to a remote store and restores it on another machine.
SkillAFreshness: AClaude Code +9 - 0.565score
md-normaliser
Dzhuneyt
Normalises Markdown formatting in a repository — heading levels, list markers, trailing whitespace, and final newlines.
SkillAFreshness: AClaude Code +9 - 0.560score
table-formatter
Dzhuneyt
Formats markdown tables.
SkillAFreshness: AClaude Code +9 - 0.559score
tidy-imports
Dzhuneyt
Sorts and de-duplicates import statements in Python and TypeScript files.
SkillAFreshness: AClaude Code +9 - 0.559score
weather-brief
Dzhuneyt
Gives a short weather briefing for a city using the free Open-Meteo API.
SkillAFreshness: AClaude Code +9
Cite this page
gh-notifications skill. Agent Mart. https://agentmart.dev/skills/dzhuneyt-gh-notifications (last updated 2026-10-24)