Skip to content

Split the workflows collection by kind: /skills /agents /commands /plugins /hooks - #140

Merged
ralyodio merged 1 commit into
mainfrom
split-workflows-by-kind
Sep 25, 2026
Merged

ralyodio merged 1 commit into
mainfrom
split-workflows-by-kind

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

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 /:

URL Distinct rows, live first pass Sources
/workflows 1,309 r/ClaudeWorkflows library, awesome-claude-code, aitmpl settings/loops/mods, GitHub topics
/skills 894 aitmpl-skills (889) + awesome-claude-code-skills (5)
/agents 587 aitmpl-agents (422) + awesome-subagents-voltagent (165)
/commands 288 aitmpl-commands
/plugins 117 plugin-marketplaces
/hooks 62 aitmpl-hooks
/c/mcp 5,782 unchanged from #139

workflows keeps 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. mcp is in RESERVED_NICHE_SLUGS because /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 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.json now 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. /agents reads 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 with dedupe_urls silently 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:

  • Plugin marketplaces move whole — source and items together, keeping slug, cursor and run history, the way the NWS alerts moved in 0010. Leaving the source put would have the next boot seed a second copy under plugins, both polling the same manifests forever.
  • The split-off rows are dropped, not moved. An item's collection comes from its source's collection, and aitmpl-components stays in workflows. A moved row would sit in /skills owned by a workflows source and — because the collection deduplicates on URL — block the real aitmpl-skills source from ever writing the row it exists to write. The new sources re-ingest them from the same file within hours.
  • The five now-empty 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.
  • Every source run live against its upstream; counts in the table above are measured, not estimated.

🤖 Generated with Claude Code

…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>
@ralyodio
ralyodio merged commit 7932098 into main Sep 25, 2026
3 checks passed
@ralyodio
ralyodio deleted the split-workflows-by-kind branch September 25, 2026 08:42
@ralyodio ralyodio mentioned this pull request Sep 25, 2026
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant