Use when the user wants to cut a release of a resource list — a dated CSV snapshot of every entry with current star counts and last-pushed dates, plus a GitHub Release. Triggers — "release the <list>", "snapshot the <list>", "tag a release of <list>", "export the list as CSV", "freeze the current state of <list>". Works on any list scaffolded by `new-resource-list` / `new-private-resource-list` (Project|Description|Stars|Last Updated table shape).
npx claudepluginhub danielrosehill/claude-code-plugins --plugin resource-list-builderThis skill uses the workspace's default tool permissions.
Cut a dated, machine-readable snapshot of a resource list and publish it as a GitHub Release. The CSV is the canonical artefact — readers/agents downstream consume it instead of scraping the README.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
Cut a dated, machine-readable snapshot of a resource list and publish it as a GitHub Release. The CSV is the canonical artefact — readers/agents downstream consume it instead of scraping the README.
update-resource-list.~/repos/github/my-repos/. Confirm before running if ambiguous.release-YYYY-MM-DD (today's date). Honour user-supplied semver (v1.2.0) if given.section, display_name, owner/repo, description, url.—) but include them in the CSV with empty star/last-updated fields and a host column noting the platform.For every OWNER/REPO:
gh api repos/OWNER/REPO --jq '{stars:.stargazers_count, last_pushed:.pushed_at, archived:.archived, language:.language, license:.license.spdx_id, homepage:.homepage, topics:.topics}'
Batch in parallel. Cache the JSON. Flag any repo that 404s (deleted/renamed) — include it in the CSV with status=missing and surface it in the report.
Path: releases/<tag>/entries.csv inside the resource-list repo.
Required columns (in this order):
section,display_name,owner_repo,url,description,stars,last_pushed,archived,language,license,topics,homepage,status
last_pushed — ISO-8601 (2026-04-25T12:34:56Z).topics — semicolon-separated.status — ok, archived, missing, or non-github.section, then by display_name. Headers exactly as above.Also write releases/<tag>/manifest.json alongside it:
{
"tag": "release-2026-04-25",
"generated_at": "2026-04-25T12:34:56Z",
"list_repo": "danielrosehill/<RepoName>",
"entry_count": 87,
"sections": ["Section A", "Section B", "..."],
"csv": "entries.csv"
}
releases/.entries.csv to the new one:
status flipped.releases/<tag>/CHANGES.md with these sections.git add releases/<tag>/
git commit -m "Release <tag>: <entry_count> entries"
git tag <tag>
git push && git push --tags
gh release create <tag> \
releases/<tag>/entries.csv \
releases/<tag>/manifest.json \
--title "<RepoName> — <tag>" \
--notes-file releases/<tag>/CHANGES.md
If no CHANGES.md exists (first release), generate notes inline:
gh release create <tag> \
releases/<tag>/entries.csv \
releases/<tag>/manifest.json \
--title "<RepoName> — <tag>" \
--notes "First release. <entry_count> entries across <section_count> sections."
For private lists, the release is private by default (gh inherits repo visibility). Confirm before publishing if there is any ambiguity.
gh api follows redirects and returns the new full_name. If it differs from the README slug, flag it in the report and offer to run update-resource-list to fix the README.update-resource-list.gh api calls in groups of ~50 with xargs -P or similar; warn the user that the run will take a few minutes.