npx skills add ...
npx skills add github/awesome-copilot --skill sponsor-finder
npx skills add github/awesome-copilot --skill sponsor-finder
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").
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.
When the user types /sponsor {owner/repo} or provides a repository in owner/repo format:
owner and repo.GetDependencies (one call).GetVersion for each dep → relatedProjects gives GitHub repo.GetProject for unique repos → OSSF Scorecard.funding field, FUNDING.yml, web search fallback.Use get_file_contents to fetch the manifest from the target repo. Determine the ecosystem and extract the package name + latest version:
| File | Ecosystem | Package name from | Version from |
|---|---|---|---|
package.json | NPM | name field | version field |
requirements.txt | PYPI | list of package names | use latest (omit version in deps.dev call) |
pyproject.toml | PYPI | [project.dependencies] | use latest |
Cargo.toml | CARGO | [package] name | [package] version |
go.mod | GO | module path | extract from go.mod |
Gemfile | RUBYGEMS | gem names | use latest |
pom.xml | MAVEN | groupId:artifactId | version |
This is the key step. Use web_fetch to call the deps.dev API:
For example:
This returns a nodes array where each node has:
versionKey.name — package nameversionKey.version — resolved versionrelation — "SELF", "DIRECT", or "INDIRECT"This single call gives you the entire dependency tree — both direct and transitive — with exact resolved versions. No need to parse lockfiles.
Package names containing special characters must be percent-encoded:
@colors/colors → %40colors%2Fcolors@ as %40, / as %2FIf the repo doesn't publish a package (e.g., it's an app not a library), fall back to reading package.json dependencies directly and calling deps.dev GetVersion for each.
For each dependency from the tree, call deps.dev GetVersion:
From the response, extract:
relatedProjects → look for relationType: "SOURCE_REPO" → projectKey.id gives github.com/{owner}/{repo}links → look for label: "SOURCE_REPO" → url fieldThis works across all ecosystems — npm, PyPI, Cargo, Go, RubyGems, Maven, NuGet — with the same field structure.
For each unique GitHub repo, call deps.dev GetProject:
From the response, extract:
scorecard.checks → find the "Maintained" check → score (0–10)starsCount — popularity indicatorlicense — project licenseopenIssuesCount — activity indicatorUse the Maintained score to label project health:
For each unique GitHub repo, check for funding information using three sources in order:
funding field (npm ecosystem only)Use web_fetch on https://registry.npmjs.org/{package-name}/latest and check for a funding field:
"https://github.com/sponsors/sindresorhus" → use as URL{"type": "opencollective", "url": "https://opencollective.com/express"} → use url.github/FUNDING.yml (repo-level, then org-level fallback)Step 5b-i — Per-repo check:
Use get_file_contents to fetch {owner}/{repo} path .github/FUNDING.yml.
Step 5b-ii — Org/user-level fallback:
If 5b-i returned 404 (no FUNDING.yml in the repo itself), check the owner's default community health repo:
Use get_file_contents to fetch {owner}/.github path FUNDING.yml.
GitHub supports a default community health files 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.
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.
Parse the YAML (same for both 5b-i and 5b-ii):
github: [username] → https://github.com/sponsors/{username}open_collective: slug → https://opencollective.com/{slug}ko_fi: username → https://ko-fi.com/{username}patreon: username → https://patreon.com/{username}tidelift: platform/package → https://tidelift.com/subscription/pkg/{platform-package}custom: [urls] → use as-isFor the top 10 unfunded dependencies (by number of transitive dependents), use web_search:
Skip packages known to be corporate-maintained (React/Meta, TypeScript/Microsoft, @types/DefinitelyTyped).
{owner}/.github check per unique owner — reuse the result for all their repos.Before including ANY funding link, verify it exists.
Use web_fetch on each funding URL:
Verify in batches of 5 at a time. Never present unverified links.
Minimize intermediate output during data gathering. Do NOT announce each batch ("Batch 3 of 7…", "Now checking funding…"). Instead:
get_file_contents returns 404 for the repo → inform user repo may not exist or is private.get_file_contents), web_fetch, and web_search — never clone or shell out..github repo only once.