Skip to content

Commit 438d54b

Browse files
authored
Merge pull request #722 from ashleywolf/sponsor-finder-tone-update
Update sponsor-finder: /sponsor trigger + friendlier tone
2 parents ff2123f + 7a7ae4e commit 438d54b

File tree

2 files changed

+62
-61
lines changed

2 files changed

+62
-61
lines changed

docs/README.skills.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ Skills differ from other primitives by supporting bundled assets (scripts, code
5757
| [refactor](../skills/refactor/SKILL.md) | Surgical code refactoring to improve maintainability without changing behavior. Covers extracting functions, renaming variables, breaking down god functions, improving type safety, eliminating code smells, and applying design patterns. Less drastic than repo-rebuilder; use for gradual improvements. | None |
5858
| [scoutqa-test](../skills/scoutqa-test/SKILL.md) | This skill should be used when the user asks to "test this website", "run exploratory testing", "check for accessibility issues", "verify the login flow works", "find bugs on this page", or requests automated QA testing. Triggers on web application testing scenarios including smoke tests, accessibility audits, e-commerce flows, and user flow validation using ScoutQA CLI. IMPORTANT: Use this skill proactively after implementing web application features to verify they work correctly - don't wait for the user to ask for testing. | None |
5959
| [snowflake-semanticview](../skills/snowflake-semanticview/SKILL.md) | Create, alter, and validate Snowflake semantic views using Snowflake CLI (snow). Use when asked to build or troubleshoot semantic views/semantic layer definitions with CREATE/ALTER SEMANTIC VIEW, to validate semantic-view DDL against Snowflake via CLI, or to guide Snowflake CLI installation and connection setup. | None |
60-
| [sponsor-finder](../skills/sponsor-finder/SKILL.md) | Find which of a GitHub repository's dependencies are sponsorable via GitHub Sponsors. Uses deps.dev API for dependency resolution across npm, PyPI, Cargo, Go, RubyGems, Maven, and NuGet. Checks npm funding metadata, FUNDING.yml files, and web search. Verifies every link. Shows direct and transitive dependencies with OSSF Scorecard health data. Invoke by providing a GitHub owner/repo (e.g. "find sponsorable dependencies in expressjs/express"). | None |
60+
| [sponsor-finder](../skills/sponsor-finder/SKILL.md) | Find which of a GitHub repository's dependencies are sponsorable via GitHub Sponsors. Uses deps.dev API for dependency resolution across npm, PyPI, Cargo, Go, RubyGems, Maven, and NuGet. Checks npm funding metadata, FUNDING.yml files, and web search. Verifies every link. Shows direct and transitive dependencies with OSSF Scorecard health data. Invoke with /sponsor followed by a GitHub owner/repo (e.g. "/sponsor expressjs/express"). | None |
6161
| [terraform-azurerm-set-diff-analyzer](../skills/terraform-azurerm-set-diff-analyzer/SKILL.md) | Analyze Terraform plan JSON output for AzureRM Provider to distinguish between false-positive diffs (order-only changes in Set-type attributes) and actual resource changes. Use when reviewing terraform plan output for Azure resources like Application Gateway, Load Balancer, Firewall, Front Door, NSG, and other resources with Set-type attributes that cause spurious diffs due to internal ordering changes. | `references/azurerm_set_attributes.json`<br />`references/azurerm_set_attributes.md`<br />`scripts/.gitignore`<br />`scripts/README.md`<br />`scripts/analyze_plan.py` |
6262
| [vscode-ext-commands](../skills/vscode-ext-commands/SKILL.md) | Guidelines for contributing commands in VS Code extensions. Indicates naming convention, visibility, localization and other relevant attributes, following VS Code extension development guidelines, libraries and good practices | None |
6363
| [vscode-ext-localization](../skills/vscode-ext-localization/SKILL.md) | Guidelines for proper localization of VS Code extensions, following VS Code extension development guidelines, libraries and good practices | None |

skills/sponsor-finder/SKILL.md

Lines changed: 61 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
---
22
name: sponsor-finder
3-
description: Find which of a GitHub repository's dependencies are sponsorable via GitHub Sponsors. Uses deps.dev API for dependency resolution across npm, PyPI, Cargo, Go, RubyGems, Maven, and NuGet. Checks npm funding metadata, FUNDING.yml files, and web search. Verifies every link. Shows direct and transitive dependencies with OSSF Scorecard health data. Invoke by providing a GitHub owner/repo (e.g. "find sponsorable dependencies in expressjs/express").
3+
description: Find which of a GitHub repository's dependencies are sponsorable via GitHub Sponsors. Uses deps.dev API for dependency resolution across npm, PyPI, Cargo, Go, RubyGems, Maven, and NuGet. Checks npm funding metadata, FUNDING.yml files, and web search. Verifies every link. Shows direct and transitive dependencies with OSSF Scorecard health data. Invoke with /sponsor followed by a GitHub owner/repo (e.g. "/sponsor expressjs/express").
44
---
55

66
# Sponsor Finder
77

8-
Find which of a repository's open source dependencies accept sponsorship via GitHub Sponsors (or Open Collective, Ko-fi, etc.). Accepts a GitHub `owner/repo`, uses the deps.dev API for dependency resolution and project health data, and produces a verified sponsorship report covering both direct and transitive dependencies.
8+
Discover opportunities to support the open source maintainers behind your project's dependencies. Accepts a GitHub `owner/repo` (e.g. `/sponsor expressjs/express`), uses the deps.dev API for dependency resolution and project health data, and produces a friendly sponsorship report covering both direct and transitive dependencies.
99

1010
## Your Workflow
1111

12-
When the user provides a repository in `owner/repo` format:
12+
When the user types `/sponsor {owner/repo}` or provides a repository in `owner/repo` format:
1313

1414
1. **Parse the input** — Extract `owner` and `repo`.
1515
2. **Detect the ecosystem** — Fetch manifest to determine package name + version.
@@ -125,10 +125,20 @@ Use `web_fetch` on `https://registry.npmjs.org/{package-name}/latest` and check
125125
- **Object:** `{"type": "opencollective", "url": "https://opencollective.com/express"}` → use `url`
126126
- **Array:** collect all URLs
127127

128-
### 5b: `.github/FUNDING.yml`
128+
### 5b: `.github/FUNDING.yml` (repo-level, then org-level fallback)
129+
130+
**Step 5b-i — Per-repo check:**
129131
Use `get_file_contents` to fetch `{owner}/{repo}` path `.github/FUNDING.yml`.
130132

131-
Parse the YAML:
133+
**Step 5b-ii — Org/user-level fallback:**
134+
If 5b-i returned 404 (no FUNDING.yml in the repo itself), check the owner's default community health repo:
135+
Use `get_file_contents` to fetch `{owner}/.github` path `FUNDING.yml`.
136+
137+
GitHub supports a [default community health files](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/creating-a-default-community-health-file) convention: a `.github` repository at the user/org level provides defaults for all repos that lack their own. For example, `isaacs/.github/FUNDING.yml` applies to all `isaacs/*` repos.
138+
139+
Only look up each unique `{owner}/.github` repo **once** — reuse the result for all repos under that owner. Process in batches of **10 owners at a time**.
140+
141+
Parse the YAML (same for both 5b-i and 5b-ii):
132142
- `github: [username]``https://github.com/sponsors/{username}`
133143
- `open_collective: slug``https://opencollective.com/{slug}`
134144
- `ko_fi: username``https://ko-fi.com/{username}`
@@ -147,6 +157,8 @@ Skip packages known to be corporate-maintained (React/Meta, TypeScript/Microsoft
147157
- **Check 5a and 5b for all deps.** Only use 5c for top unfunded ones.
148158
- Skip npm registry calls for non-npm ecosystems.
149159
- Deduplicate repos — check each repo only once.
160+
- **One `{owner}/.github` check per unique owner** — reuse the result for all their repos.
161+
- Process org-level lookups in batches of **10 owners at a time**.
150162

151163
---
152164

@@ -165,72 +177,59 @@ Verify in batches of **5 at a time**. Never present unverified links.
165177

166178
## Step 7: Output the Report
167179

168-
```
169-
## 💜 Sponsor Finder Report
180+
### Output discipline
170181

171-
**Repository:** {owner}/{repo}
172-
**Scanned:** {current date}
173-
**Ecosystem:** {ecosystem} · {package}@{version}
182+
**Minimize intermediate output during data gathering.** Do NOT announce each batch ("Batch 3 of 7…", "Now checking funding…"). Instead:
183+
- Show **one brief status line** when starting each major phase (e.g., "Resolving 67 dependencies…", "Checking funding links…")
184+
- **Collect ALL data before producing the report.** Never drip-feed partial tables.
185+
- Output the final report as a **single cohesive block** at the end.
174186

175-
---
187+
### Report template
176188

177-
### Summary
189+
```
190+
## 💜 Sponsor Finder Report
178191
179-
- **{total}** total dependencies ({direct} direct + {transitive} transitive)
180-
- **{resolved}** resolved to GitHub repos
181-
- **💜 {sponsorable}** have verified funding links ({percentage}%)
182-
- **{destinations}** unique funding destinations
183-
- All links verified ✅
192+
**Repository:** {owner}/{repo} · {ecosystem} · {package}@{version}
193+
**Scanned:** {date} · {total} deps ({direct} direct + {transitive} transitive)
184194
185195
---
186196
187-
### Verified Funding Links
197+
### 🎯 Ways to Give Back
188198
189-
| Dependency | Repo | Funding | Direct? | How Verified |
190-
|------------|------|---------|---------|--------------|
191-
| {name} | [{owner}/{repo}](https://github.com/{owner}/{repo}) | 💜 [GitHub Sponsors](https://github.com/sponsors/{user}) | ✅ | FUNDING.yml |
192-
| {name} | [{owner}/{repo}](https://github.com/{owner}/{repo}) | 🟠 [Open Collective](https://opencollective.com/{slug}) | ⛓️ | npm funding |
193-
| ... | ... | ... | ... | ... |
199+
Sponsoring just {N} people/orgs supports {sponsorable} of your {total} dependencies — a great way to invest in the open source your project depends on.
194200
195-
Use ✅ for direct dependencies, ⛓️ for transitive.
201+
1. **💜 @{user}** — {N} direct + {M} transitive deps · ⭐ Maintained
202+
{dep1}, {dep2}, {dep3}, ...
203+
https://github.com/sponsors/{user}
196204
197-
---
198-
199-
### Funding Destinations (by impact)
200-
201-
| Destination | Deps | Health | Link |
202-
|-------------|------|--------|------|
203-
| 🟠 Open Collective: {name} | {N} direct | ⭐ Maintained | [opencollective.com/{name}](https://opencollective.com/{name}) |
204-
| 💜 @{user} | {N} direct + {M} transitive | ⭐ Maintained | [github.com/sponsors/{user}](https://github.com/sponsors/{user}) |
205-
| ... | ... | ... | ... |
205+
2. **🟠 Open Collective: {name}** — {N} direct + {M} transitive deps · ⭐ Maintained
206+
{dep1}, {dep2}, {dep3}, ...
207+
https://opencollective.com/{name}
206208
207-
Sort by total number of dependencies (direct + transitive), descending.
209+
3. **💜 @{user2}** — {N} direct dep · 💤 Low activity
210+
{dep1}
211+
https://github.com/sponsors/{user2}
208212
209213
---
210214
211-
### No Verified Funding Found
212-
213-
| Dependency | Repo | Why | Direct? |
214-
|------------|------|-----|---------|
215-
| {name} | {owner}/{repo} | Corporate (Meta) | ✅ |
216-
| {name} | {owner}/{repo} | No FUNDING.yml or metadata | ⛓️ |
217-
| ... | ... | ... | ... |
218-
219-
Only show the top 10 unfunded direct deps. If more, note "... and {N} more".
215+
### 📊 Coverage
220216
221-
---
222-
223-
### 💜 {percentage}% verified funding coverage · {destinations} destinations · {sponsorable} dependencies
224-
### 💡 Sponsoring just {N} people/orgs covers all {sponsorable} funded dependencies
217+
- **{sponsorable}/{total}** dependencies have funding options ({percentage}%)
218+
- **{destinations}** unique funding destinations
219+
- **{unfunded_direct}** direct deps don't have funding set up yet ({top_names}, ...)
220+
- All links verified ✅
225221
```
226222

227-
### Format notes
228-
- **Direct?** column: ✅ = direct dependency, ⛓️ = transitive
229-
- **Health** column: ⭐ Maintained (7+), ⚠️ Partial (4–6), 💤 Low (0–3) — from OSSF Scorecard
230-
- **How Verified**: `FUNDING.yml`, `npm funding`, `PyPI metadata`, `Web search`
223+
### Report format rules
224+
225+
- **Lead with "🎯 Ways to Give Back"** — this is the primary output. Numbered list, sorted by total deps covered (descending).
226+
- **Bare URLs on their own line** — not wrapped in markdown link syntax. This ensures they're clickable in any terminal emulator.
227+
- **Inline dep names** — list the covered dependency names in a comma-separated line under each sponsor, so the user sees exactly what they're funding.
228+
- **Health indicator inline** — show ⭐/⚠️/💤 next to each destination, not in a separate table column.
229+
- **One "📊 Coverage" section** — compact stats. No separate "Verified Funding Links" table, no "No Funding Found" table.
230+
- **Unfunded deps as a brief note** — just the count + top names. Frame as "don't have funding set up yet" rather than highlighting a gap. Never shame projects for not having funding — many maintainers prefer other forms of contribution.
231231
- 💜 GitHub Sponsors, 🟠 Open Collective, ☕ Ko-fi, 🔗 Other
232-
- Prioritize GitHub Sponsors links when multiple funding sources exist
233-
- The **💡 summary line** tells the user the minimum number of sponsorships to cover everything
232+
- Prioritize GitHub Sponsors links when multiple funding sources exist for the same maintainer.
234233

235234
---
236235

@@ -248,10 +247,12 @@ Only show the top 10 unfunded direct deps. If more, note "... and {N} more".
248247

249248
1. **NEVER present unverified links.** Fetch every URL before showing it. 5 verified links > 20 guessed links.
250249
2. **NEVER guess from training knowledge.** Always check — funding pages change over time.
251-
3. **Be transparent.** Show "How Verified" and "Direct?" columns so users understand the data.
252-
4. **Use deps.dev as primary resolver.** Fall back to registry APIs only if deps.dev is unavailable.
253-
5. **Always use GitHub MCP tools** (`get_file_contents`), `web_fetch`, and `web_search` — never clone or shell out.
254-
6. **Be efficient.** Batch API calls, deduplicate repos, respect sampling limits.
255-
7. **Focus on GitHub Sponsors.** Most actionable platform — show others but prioritize GitHub.
256-
8. **Deduplicate by maintainer.** Group to show real impact of sponsoring one person.
257-
9. **Show the actionable minimum.** The 💡 line tells users the fewest sponsorships to cover all funded deps.
250+
3. **Always be encouraging, never shaming.** Frame results positively — celebrate what IS funded, and treat unfunded deps as an opportunity, not a failing. Not every project needs or wants financial sponsorship.
251+
4. **Lead with action.** The "🎯 Ways to Give Back" section is the primary output — bare clickable URLs, grouped by destination.
252+
5. **Use deps.dev as primary resolver.** Fall back to registry APIs only if deps.dev is unavailable.
253+
6. **Always use GitHub MCP tools** (`get_file_contents`), `web_fetch`, and `web_search` — never clone or shell out.
254+
7. **Be efficient.** Batch API calls, deduplicate repos, check each owner's `.github` repo only once.
255+
8. **Focus on GitHub Sponsors.** Most actionable platform — show others but prioritize GitHub.
256+
9. **Deduplicate by maintainer.** Group to show real impact of sponsoring one person.
257+
10. **Show the actionable minimum.** Tell users the fewest sponsorships to support the most deps.
258+
11. **Minimize intermediate output.** Don't announce each batch. Collect all data, then output one cohesive report.

0 commit comments

Comments
 (0)