agentsclimarketplace

Obsidian pr sync

Skill oleg-koval/agent-skills/packages/software-development/obsidian-pr-sync/adapters/claude/skills/obsidian-pr-sync

Opinionated agent skill catalog for Codex, Claude, Cursor, Copilot, and launch workflows.

Install
npx -y skills add oleg-koval/agent-skills --skill obsidian-pr-sync

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Fetch open GitHub PRs where the user is an assignee or review-requested reviewer, then write or refresh a "## PRs to review" section in today's Obsidian daily note. Use this skill whenever the user asks to sync PRs to Obsidian, update their daily note with GitHub reviews, check what PRs need attention, or run a morning PR sync routine. Also suitable for scheduled/automated runs — fully idempotent (re-running replaces the section, never appends).

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

5.1 KB, ~1.2k tokens by cl100k_base, as published. Nobody here has run it

<!-- Generated by scripts/build-adapters.sh. Do not edit directly. -->

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:

  • isDraft is true
  • author.login matches any bot pattern: dependabot, copilot, renovate, github-actions, or author.is_bot is true
  • author.login equals GH_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/<login> --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 (<ORG_PREFIX>)
- [ ] [TITLE](url) by [[Author Name]] (N days old)

### Personal
- [ ] [TITLE](url) by [[Author Name]] (N days old)

Rules:

  • Work: repository.nameWithOwner starts with <ORG_PREFIX>/
  • Personal: everything else
  • Within each group, sort by createdAt ascending (oldest first — most overdue at top)
  • If a group has no PRs, omit that subsection entirely (don't render an empty ### Work header)
  • If there are zero PRs total, write: ## PRs to review\n\n_No open PRs — clear queue! 🎉_
  • Add ⚠️ after the age if days_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 review already 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 (<ORG_PREFIX>): 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.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.