Install
$ agentstack add skill-oleg-koval-agent-skills-obsidian-pr-sync ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Obsidian PR Sync
Fetch all open PRs where the user is assigned or requested as reviewer, filter out noise (bots, drafts, self-authored), and write a clean grouped section into today's daily note.
Configuration
Before running, confirm:
VAULT_DAILY— absolute path to the daily notes folder (e.g./Users/you/obsidian/vault/Lead/Daily)GH_USERNAME— GitHub login to exclude self-authored PRs (e.g.oleg-koval)ORG_PREFIX— org name to group as "Work" (e.g.Teifi-Digital); everything else goes to "Personal"
If not specified by the user, infer from context (git config, existing vault files).
Step 1 — Fetch PRs
Run two gh queries and merge results, deduplicating by URL:
# Review-requested
gh search prs --review-requested=@me --state=open \
--json title,url,repository,author,createdAt,isDraft --limit 50
# Assigned
gh search prs --assignee=@me --state=open \
--json title,url,repository,author,createdAt,isDraft --limit 50
Merge both lists, deduplicate by url. The union is what needs attention.
Step 2 — Filter
Discard entries where:
isDraftistrueauthor.loginmatches any bot pattern:dependabot,copilot,renovate,github-actions, orauthor.is_botistrueauthor.loginequalsGH_USERNAME— self-authored PRs are not reviews; they're your own work
Step 3 — Enrich authors
For each unique author login, resolve a display name for the Obsidian wiki-link:
gh api /users/ --jq '.name // .login'
If the API returns a name, use it (e.g. Rutger Klaassen). If it returns null, fall back to the login with first letter uppercased. This gives [[Rutger Klaassen]] or [[Merlijnmacgillavry]].
Batch these lookups — run them in parallel if possible to keep the sync fast.
Step 4 — Calculate age
For each PR: days_old = (today - createdAt).days. Use today's date in local time.
Step 5 — Build the section
Format the section exactly as:
## PRs to review
### Work ()
- [ ] [TITLE](url) by [[Author Name]] (N days old)
### Personal
- [ ] [TITLE](url) by [[Author Name]] (N days old)
Rules:
- Work:
repository.nameWithOwnerstarts with/ - Personal: everything else
- Within each group, sort by
createdAtascending (oldest first — most overdue at top) - If a group has no PRs, omit that subsection entirely (don't render an empty
### Workheader) - If there are zero PRs total, write:
## PRs to review\n\n_No open PRs — clear queue! 🎉_ - Add
⚠️after the age ifdays_old >= 7
Example line:
- [ ] [RSL-108] Image sync from InRiver by [[Merlijn Mac Gillavry]] (12 days old ⚠️)
Step 6 — Write to today's daily note
Find today's note:
TODAY=$(date +%Y-%m-%d)
NOTE="${VAULT_DAILY}/${TODAY}.md"
If the file doesn't exist, create it with standard daily template frontmatter first, then append the section. If the file exists:
Replacement logic (idempotent):
- If
## PRs to reviewalready exists: replace everything from that line up to (but not
including) the next ## heading or end-of-file with the newly built section.
- If it doesn't exist: append the section at the end of the file (before the nav footer
line *← [[... if present, otherwise at the very end).
This ensures re-running the skill produces the same result, not a growing list.
Invocation patterns
Manual (user-triggered): The user says something like "sync my PRs to today's note" or "update obsidian with my reviews". Run the full flow and confirm how many PRs were written.
Scheduled morning routine: Same flow. No user prompt needed — just run, update the note, and report a one-line summary: "PR sync: 3 work PRs, 2 personal PRs written to 2026-05-11.md".
In a remote CCR agent: Clone the vault repo, run the sync, commit and push. The local Obsidian Git plugin pulls the changes automatically.
Output to user
After writing the file, show a brief confirmation:
Synced N PRs to Lead/Daily/YYYY-MM-DD.md
Work (): X PRs
Personal: Y PRs
Skipped: Z bots/drafts
If any gh call fails (e.g. auth expired), surface the error clearly rather than writing a partial/corrupt section.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: oleg-koval
- Source: oleg-koval/agent-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.