Split the workflows collection by kind: /skills /agents /commands /plugins /hooks - #140
Merged
Merged
Conversation
…ugins /hooks A subagent, a skill, a slash command, a hook and a plugin are five different things to go looking for, so they are five collections rather than five kinds inside one. Each is also a name at the site root, because a collection seeds a niche and a niche's page is served from /: /workflows, /skills, /agents, /commands, /plugins, /hooks. MCP is the exception and stays at /c/mcp. `mcp` is a reserved niche slug -- /mcp is this site's own MCP endpoint -- so the servers cannot have a root page without taking the protocol's. There is now a test saying so. `workflows` keeps what is read rather than installed: the library posts, the guides and CLAUDE.md files, settings bundles, agent loops, behaviour mods, and the repositories tagged for all of it. An adapter writes into exactly one collection, so aitmpl's components.json now feeds six through a factory and awesome-claude-code's CSV feeds two. That is deliberate rather than reluctant: a source is what a reader follows and what the run log reports on, so "subagents from aitmpl" and "skills from aitmpl" should be two rows on the sources page. The cost is re-fetching one file per collection, which is why those cadences are slow and staggered. New source while splitting: VoltAgent's README names its 165 subagents one by one, where its marketplace manifest declares only the 10 bundles they ship in, so /agents reads the README through the same list parser the MCP lists use. This is migration 0033 rather than an edit to 0032, because 0032 shipped in #139 and has run. Migrations are keyed by filename with no checksum, so an edited one never runs again: the five collections would still have appeared, because seeding creates them, but with dedupe_urls silently false, and a skill would be stored once per list that carries it. 0033 also moves the plugin marketplaces source and its items whole, and drops the rows that aitmpl and awesome-claude-code wrote into workflows for kinds that have left -- dropped rather than moved, because an item's collection comes from its source's, and a moved row would sit in /skills owned by a workflows source and block the real source from ever writing it. Measured over a live pass of every source: mcp 5,782 distinct, workflows 1,309, skills 894, agents 587, commands 288, plugins 117, hooks 62. Nothing malformed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Merged
ralyodio
added a commit
that referenced
this pull request
Sep 25, 2026
Two releases' worth of collections since 0.29.0: parts (#137), MCP servers and agent workflows (#139), and the split of the latter into skills, subagents, commands, plugins and hooks (#140). 15 manifests plus the CLI's own VERSION const; bun.lock carries no version lines to follow, and @profullstack/partners stays at 0.2.0. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-up to #139, which merged while this was being written.
A subagent, a skill, a slash command, a hook and a plugin are five different things to go looking for, so they become five collections rather than five kinds inside
workflows. Each is also a name at the site root, because a collection seeds a niche and a niche's page is served from/:/workflows/skillsaitmpl-skills(889) +awesome-claude-code-skills(5)/agentsaitmpl-agents(422) +awesome-subagents-voltagent(165)/commandsaitmpl-commands/pluginsplugin-marketplaces/hooksaitmpl-hooks/c/mcpworkflowskeeps what is read rather than installed: the library posts, guides and CLAUDE.md files, settings bundles, agent loops, behaviour mods, and the repos tagged for all of it.MCP stays at
/c/mcp.mcpis inRESERVED_NICHE_SLUGSbecause/mcpis this site's own MCP endpoint, so the servers cannot have a root page without taking the protocol's. There is now a test asserting that, and that the other six slugs are not reserved — otherwise their niche pages would be silently shadowed by a real route.One file, several adapters
An adapter writes into exactly one collection, so aitmpl's
components.jsonnow feeds six through a factory and awesome-claude-code's CSV feeds two. Deliberate rather than reluctant: a source is what a reader follows and what the run log reports on, so "subagents from aitmpl" and "skills from aitmpl" should be two rows on the sources page. The cost is re-fetching one file per collection, which is why those cadences are slow and staggered.New source while splitting: VoltAgent's README names its 165 subagents individually, where its marketplace manifest declares only the 10 bundles they ship in.
/agentsreads the README through the same list parser the MCP lists use; without it that collection would be aitmpl alone.Why 0033 and not an edit to 0032
0032 shipped in #139 and has run. Migrations are keyed by filename with no checksum (
packages/db/src/migrate.js), so an edited one is never applied again — the five collections would still have appeared, because seeding creates them, but withdedupe_urlssilently false, and a skill would be stored once per list that carries it, quietly, forever. So 0032 is restored byte-for-byte to what merged and the new work is 0033.0033 also handles the rows 0032's sources already wrote:
plugins, both polling the same manifests forever.aitmpl-componentsstays inworkflows. A moved row would sit in/skillsowned by aworkflowssource and — because the collection deduplicates on URL — block the realaitmpl-skillssource from ever writing the row it exists to write. The new sources re-ingest them from the same file within hours.claude-*feeds are deleted so a collection page does not offer a filter that can never match again.Checks
bun test: 1,994 pass, 0 fail (127 files), including a new test that runs 0033's statements against real Postgres and asserts the marketplace source moved whole, the orphaned skill row went, and the settings row stayed.biome check: clean.🤖 Generated with Claude Code