Skip to content

Frame the repo as the Poimandres plugin, not the docs plugin - #4

Open
abernier wants to merge 1 commit into
mainfrom
claude/plugin-role-onxyyw
Open

Frame the repo as the Poimandres plugin, not the docs plugin#4
abernier wants to merge 1 commit into
mainfrom
claude/plugin-role-onxyyw

Conversation

@abernier

Copy link
Copy Markdown
Member

Base of a two-PR stack. #3 (the docs-lookup subagent) now targets this branch.

Why

The manifests and the README both read as though documentation lookup were what this plugin is:

Answers questions about react-three-fiber, drei and zustand from the official docs.pmnd.rs pages instead of from memory.

That's what it does first. Everything meant to follow — more skills, subagents, hooks — would have arrived as an exception to the plugin's own description, and the first one would have forced this rewrite anyway, mixed into a PR about something else.

So the framing states the shape without promising components that don't exist yet: one install carrying Poimandres tooling, of which docs lookup is today's entire content. Marketplace descriptions gain a "Currently:", pmndrs and poimandres join the keywords, and the README splits what grows (components) from what doesn't (plumbing).

name is deliberately untouched — it's baked into every scoped MCP tool name (mcp__plugin_pmndrs_docs__…), so it's the one field here that isn't free to change.

Also fixes

SKILL.md told Claude to pass docs as the server argument to ReadMcpResourceTool. Bundled in a plugin, the server registers as plugin:pmndrs:docs — the bare key from .mcp.json isn't a name anything answers to, and the failure is a silent empty read rather than an error. Unrelated to the stack's second half, so it belongs here.

Tests

npm test — Node's built-in runner, no install step, wired to CI in .github/workflows/test.yml. Everything here targets wiring that fails silently at runtime rather than loudly at load:

Invariant Why it matters
the plugin name agrees across both manifests it's baked into every scoped MCP tool name, so a one-sided rename breaks tools silently
a component reading MCP resources names a server to read from ReadMcpResourceTool takes a configured name; the bare key isn't one
every bundled MCP server is reached by some component catches dead .mcp.json config
skill names match their directories otherwise the skill is invoked under the install directory name, which for a marketplace install is a version string that changes every update
the coverage table carries a real checked-on date the empty-library list is a claim about the outside world, and it goes stale
the README lists every component shipped the rule that matters as components accumulate
claude plugin validate . passes skipped when the CLI isn't installed

That last one is the point of doing this now: a capability nobody can find is a capability nobody uses, so the README table is enforced rather than maintained by good intentions. It caught its own omission twice while this stack was being written.

Each invariant was mutation-checked — breaking it fails the test that claims to guard it, and no other. 13/13 green with no agents/ directory present, which is the case this PR has to work in.

Worth a look during review

  • category stays documentation. Retitling it generalist while there is exactly one component seemed worse for discoverability than leaving it accurate; it should move when a second component lands.
  • Wording of the "not a promise" paragraph in the README — it's the part making a claim about the future, so it's the part worth disagreeing with.

Generated by Claude Code

The manifests and the README both read as though documentation lookup were
what this plugin is. It is what it does first. Everything that follows —
more skills, subagents, hooks — would have arrived as an exception to its own
description.

So the framing states the shape without promising components that do not
exist: one install carrying Poimandres tooling, of which docs lookup is
today's whole content. The marketplace descriptions gain a "currently",
`pmndrs` and `poimandres` join the keywords, and the README splits what
grows (components) from what does not (plumbing).

Also fixes the server name the docs skill hands to ReadMcpResourceTool.
Bundled in a plugin, the server registers as `plugin:pmndrs:docs`; the bare
`docs` key from .mcp.json is not a name anything answers to, and the failure
is a silent empty read rather than an error.

Adds the test harness these edits need, on Node's built-in runner with no
dependencies, plus CI. It covers the wiring that fails silently at runtime
rather than loudly at load: the plugin name agreeing across both manifests
(it is baked into every scoped MCP tool name), a component naming the server
it reads resources from, no server declared and then used by nothing, skill
names matching their directories, and the README listing every component
shipped. That last one is the one that matters as components accumulate —
a capability nobody can find is a capability nobody uses.

Each check was mutation-tested: breaking the invariant fails the test that
claims to guard it, and no other.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TnvYiz7aGhnBTK2tzExHis
@abernier
abernier marked this pull request as ready for review August 10, 2026 06:11
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.

2 participants