Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Research open-source libraries with evidence-backed answers and GitHub permalinks. Use when the user asks about library internals, needs implementation details with source code references, wants to understand why something was changed, or needs authoritative answers backed by actual code. Excels at navigating large open-source repos and providing citations to exact lines of code.
.claude/skills/dicklesworthstone-librarian/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 27% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 62% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 189% | 0% |
Answer questions about open-source libraries by finding evidence with GitHub permalinks. Every claim backed by actual code.
Pi executes tool calls sequentially, even when you emit multiple calls in one turn. But batching independent calls in a single turn still saves LLM round-trips (~5-10s each). Use these patterns:
| Pattern | When | Actually parallel? | |---------|------|-------------------| | Batch tool calls in one turn | Independent ops (web_search + fetch_content + read) | No, but saves round-trips | | fetch_content({ urls: [...] }) | Multiple URLs to fetch | Yes (3 concurrent) | | Bash with & + wait | Multiple git/gh commands | Yes (OS-level) |
Before doing anything, classify the request to pick the right research strategy.
| Type | Trigger | Primary Approach | |------|---------|-----------------| | Conceptual | "How do I use X?", "Best practice for Y?" | web_search + fetch_content (README/docs) | | Implementation | "How does X implement Y?", "Show me the source" | fetch_content (clone) + code search | | Context/History | "Why was this changed?", "History of X?" | git log + git blame + issue/PR search | | Comprehensive | Complex or ambiguous requests, "deep dive" | All of the above |
Batch these in one turn:
"library-name topic" via Perplexity for recent articles and discussionsSynthesize web results + repo docs. Cite official documentation and link to relevant source files.
The core workflow -- clone, find, permalink:
grep -rn "function_name", find . -name "*.ts"cd /tmp/pi-github-repos/owner/repo && git rev-parse HEADhttps://github.com/owner/repo/blob/<sha>/path/to/file#L10-L20Batch the initial calls: fetch_content (clone) + web_search (recent discussions) in one turn. Then dig into the clone with grep/read once it's available.
Use git operations on the cloned repo:
bashcd /tmp/pi-github-repos/owner/repo # Recent changes to a specific file git log --oneline -n 20 -- path/to/file.ts # Who changed what and when git blame -L 10,30 path/to/file.ts # Full diff for a specific commit git show <sha> -- path/to/file.ts # Search commit messages git log --oneline --grep="keyword" -n 10
For issues and PRs, use bash:
bash# Search issues gh search issues "keyword" --repo owner/repo --state all --limit 10 # Search merged PRs gh search prs "keyword" --repo owner/repo --state merged --limit 10 # View specific issue/PR with comments gh issue view <number> --repo owner/repo --comments gh pr view <number> --repo owner/repo --comments # Release notes gh api repos/owner/repo/releases --jq '.[0:5] | .[].tag_name'
Combine everything. Batch these in one turn:
gh search issues "keyword" --repo owner/repo --limit 10 & gh search prs "keyword" --repo owner/repo --state merged --limit 10 & waitThen dig into the clone with grep, read, git blame, git log as needed.
Permalinks are the whole point. They make your answers citable and verifiable.
https://github.com/<owner>/<repo>/blob/<commit-sha>/<filepath>#L<start>-L<end>Getting the SHA from a cloned repo:
bashcd /tmp/pi-github-repos/owner/repo && git rev-parse HEAD
Getting the SHA from a tag:
bashgh api repos/owner/repo/git/refs/tags/v1.0.0 --jq '.object.sha'
Always use full commit SHAs, not branch names. Branch links break when code changes. Permalinks don't.
Every code-related claim needs a permalink. Format:
markdownThe stale time check happens in [`notifyManager.ts`](https://github.com/TanStack/query/blob/abc123/packages/query-core/src/notifyManager.ts#L42-L50): \`\`\`typescript function isStale(query: Query, staleTime: number): boolean { return query.state.dataUpdatedAt + staleTime < Date.now() } \`\`\`
For conceptual answers, link to official docs and relevant source files. For implementation answers, every function/class reference should have a permalink.
For questions about video tutorials, conference talks, or screen recordings:
typescript// Full extraction (transcript + visual descriptions) fetch_content({ url: "https://youtube.com/watch?v=abc" }) // Ask a specific question about a video fetch_content({ url: "https://youtube.com/watch?v=abc", prompt: "What libraries are imported in this tutorial?" }) // Single frame at a known moment fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41" }) // Range scan for visual discovery fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41-25:00" }) // Custom density across a range fetch_content({ url: "https://youtube.com/watch?v=abc", timestamp: "23:41-25:00", frames: 3 }) // Whole-video sampling fetch_content({ url: "https://youtube.com/watch?v=abc", frames: 6 }) // Analyze a local recording fetch_content({ url: "/path/to/demo.mp4", prompt: "What error message appears on screen?" }) // Batch multiple videos with the same question fetch_content({ urls: ["https://youtube.com/watch?v=abc", "https://youtube.com/watch?v=def"], prompt: "What packages are installed?" })
Use single timestamps for known moments, ranges for visual scanning, and frames-alone for a quick overview of the whole video.
The prompt parameter only applies to video content (YouTube URLs and local video files). For non-video URLs, it's ignored.
| Failure | Recovery | |---------|----------| | grep finds nothing | Broaden the query, try concept names instead of exact function names | | gh CLI rate limited | Use the already-cloned repo in /tmp/pi-github-repos/ for git operations | | Repo too large to clone | fetch_content returns an API-only view automatically; use that or add forceClone: true | | File not found in clone | Branch name with slashes may have misresolved; list the repo tree and navigate manually | | Uncertain about implementation | State your uncertainty explicitly, propose a hypothesis, show what evidence you did find | | Video extraction fails | Ensure Chrome is signed into gemini.google.com (free) or set GEMINI_API_KEY | | Page returns 403/bot block | Gemini fallback triggers automatically; no action needed if Gemini is configured | | web_search fails | Check provider config; try explicit provider: "gemini" if Perplexity key is missing |
fetch_content("https://github.com/owner/repo/tree/v1.0.0")| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→fail | 10,674 | 16,472 | +54% | 1 | 1 | 0% | 1,855 | 2,451 | +32% | 0 | 0 | — |
case-02 | fail→fail | 6,889 | 5,559 | -19% | 1 | 1 | 0% | 1,222 | 2,509 | +105% | 0 | 0 | — |
case-03 | pass→fail | 11,289 | 6,178 | -45% | 1 | 1 | 0% | 1,960 | 2,420 | +23% | 0 | 0 | — |
case-04 | fail→pass | 10,283 | 3,843 | -63% | 1 | 1 | 0% | 1,596 | 2,724 | +71% | 0 | 0 | — |
case-05 | fail→pass | 15,271 | 7,203 | -53% | 1 | 1 | 0% | 2,608 | 3,306 | +27% | 0 | 0 | — |
case-06 | fail→pass | 13,229 | 5,228 | -60% | 1 | 1 | 0% | 1,920 | 3,103 | +62% | 0 | 0 | — |
case-07 | fail→pass | 16,220 | 8,649 | -47% | 1 | 1 | 0% | 2,387 | 3,311 | +39% | 0 | 0 | — |
case-08 | fail→fail | 8,379 | 10,315 | +23% | 1 | 1 | 0% | 1,603 | 2,703 | +69% | 0 | 0 | — |
case-09 | fail→pass | 7,020 | 3,525 | -50% | 1 | 1 | 0% | 941 | 2,721 | +189% | 0 | 0 | — |
case-10 | pass→fail | 12,265 | 7,773 | -37% | 1 | 1 | 0% | 1,839 | 2,600 | +41% | 0 | 0 | — |
case-11 | fail→pass | 11,147 | 5,341 | -52% | 1 | 1 | 0% | 2,246 | 2,788 | +24% | 0 | 0 | — |
case-12 | fail→fail | 13,469 | 7,833 | -42% | 1 | 1 | 0% | 2,341 | 2,436 | +4% | 0 | 0 | — |
case-13 | fail→fail | 14,045 | 10,742 | -24% | 1 | 1 | 0% | 2,213 | 2,359 | +7% | 0 | 0 | — |
case-14 | pass→pass | 6,365 | 4,362 | -31% | 1 | 1 | 0% | 969 | 2,842 | +193% | 0 | 0 | — |
case-15 | pass→pass | 4,271 | 5,012 | +17% | 1 | 1 | 0% | 748 | 2,878 | +285% | 0 | 0 | — |
case-16 | pass→fail | 3,371 | 6,134 | +82% | 1 | 1 | 0% | 576 | 2,315 | +302% | 0 | 0 | — |
case-17 | pass→fail | 9,326 | 7,488 | -20% | 1 | 1 | 0% | 1,606 | 2,351 | +46% | 0 | 0 | — |
case-18 | fail→fail | 5,973 | 4,478 | -25% | 1 | 1 | 0% | 962 | 2,264 | +135% | 0 | 0 | — |
case-19 | pass→pass | 5,490 | 4,674 | -15% | 1 | 1 | 0% | 995 | 2,727 | +174% | 0 | 0 | — |
case-20 | pass→pass | 13,091 | 6,846 | -48% | 1 | 1 | 0% | 1,864 | 3,120 | +67% | 0 | 0 | — |
case-21 | fail→fail | 13,445 | 20,887 | +55% | 1 | 1 | 0% | 2,027 | 3,758 | +85% | 0 | 0 | — |
case-22 | pass→fail | 10,815 | 9,839 | -9% | 1 | 1 | 0% | 1,704 | 2,687 | +58% | 0 | 0 | — |
case-23 | pass→fail | 19,797 | 7,660 | -61% | 1 | 1 | 0% | 3,083 | 2,341 | -24% | 0 | 0 | — |
case-24 | pass→fail | 5,142 | 7,306 | +42% | 1 | 1 | 0% | 974 | 2,369 | +143% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 11 counted toward the lift figure. The other 13 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of -8 percentage points is the difference between those two pass rates over the 11 comparable cases. 8 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.