Skip to content

Move plugins under plugins/ and drop the -mcp suffix - #11

Merged
walkerhughes merged 1 commit into
mainfrom
refactor/plugins-dir
Jul 31, 2026
Merged

Move plugins under plugins/ and drop the -mcp suffix#11
walkerhughes merged 1 commit into
mainfrom
refactor/plugins-dir

Conversation

@walkerhughes

Copy link
Copy Markdown
Owner

Reorganizes for a repo that will hold more than MCP servers.

harbor-mcp/      ->  plugins/harbor-hub/
tastytrade-mcp/  ->  plugins/tastytrade/

Both moves are tracked by git as renames, so git log and git blame still resolve through them.

Breaking for installed copies

The plugin name is the install id and part of the cache path, so harbor-mcp@walkerhughes and tastytrade-mcp@walkerhughes are orphaned rather than upgraded. Migration is in the PR discussion below.

The sharp edge

The version gate's glob was */.claude-plugin/plugin.json, which matches nothing once the plugins sit one level deeper. That would not have failed the build; it would have passed vacuously forever, which is precisely the invisible failure the gate exists to catch.

Two changes were needed, not one:

- for manifest in */.claude-plugin/plugin.json; do
-   plugin="${manifest%%/*}"
+ for manifest in plugins/*/.claude-plugin/plugin.json; do
+   plugin="${manifest%/.claude-plugin/plugin.json}"

${manifest%%/*} would now yield plugins for both entries, silently gating the wrong directory. Simulated against this branch: the glob matches both manifests and each resolves to its own directory.

Stale references the move exposed

The three harbor eval Dockerfiles installed from github.com/walkerhughes/harbor-mcp, a repo consolidated into this one whose last commit is from Jul 18, predating all of the plugin work in #2 through #10. The evals have been testing week-old code. They now install from walkerhughes/claude with #subdirectory=plugins/harbor-hub.

The tastytrade benchmark Dockerfile pointed at walkerhughes/tastytrade-mcp (last commit June 15) and cloned CANDIDATE_REF=mcp-server-refactor, a branch that no longer exists, so make benchmark could not build at all. The repo URL and subdirectory paths are corrected, but its two-ref baseline-vs-candidate comparison no longer has a second ref to compare against. That needs a decision from you, so it is documented in the Dockerfile rather than guessed at. Nothing in CI builds this image, which is why it went unnoticed.

Deliberately unchanged

Kept Why
Python packages harbor_mcp, src Not visible in the repo layout; renaming means import churn for no gain
pyproject project names, harbor-mcp console script Same, and the console script name is what the eval containers invoke
~/.tastytrade-mcp/credentials.json Renaming would break your working credentials setup
tastytrade-mcp/<task> eval namespaces These are harbor task names; renaming orphans published tasks

Happy to do any of these as a follow-up, but none serve the layout goal.

Verification

Check Result
claude plugin validate marketplace and both plugin manifests pass
harbor-hub 72 tests, ruff clean
tastytrade 106 tests, 93.00% coverage, ruff and mypy clean
Eval verifiers 12 passed
harbor-hub launcher handshake from unrelated cwd under env -i PATH=/usr/bin:/bin, 15 tools
tastytrade launcher same, 12 tools
Version gate simulated on this branch, matches the new paths

Local .venv directories break on a move (their script shebangs hold absolute paths). Both were rebuilt with uv sync; .venv is gitignored so nothing ships.

Reorganizes for a repo that will hold more than MCP servers.

  harbor-mcp/      -> plugins/harbor-hub/
  tastytrade-mcp/  -> plugins/tastytrade/

Both moves are tracked as renames, so git log and git blame still resolve.

Breaking for installed copies. The plugin name is the install id and part of the
cache path, so harbor-mcp@walkerhughes and tastytrade-mcp@walkerhughes are
orphaned rather than upgraded; they must be uninstalled and reinstalled under
the new names.

The version gate needed care: its glob was */.claude-plugin/plugin.json, which
matches nothing once the plugins are one level deeper. That would not have
failed, it would have passed vacuously forever, which is the same invisible
failure the gate exists to prevent. Glob is now plugins/*/..., and the plugin
name is taken by stripping the manifest suffix rather than ${manifest%%/*},
which would now yield "plugins" for both.

Also fixes stale references the move exposed:
- The three harbor eval Dockerfiles installed from
  github.com/walkerhughes/harbor-mcp, a repo consolidated into this one whose
  last commit predates everything from the plugin work. They now install from
  walkerhughes/claude with #subdirectory=plugins/harbor-hub.
- The tastytrade benchmark Dockerfile pointed at walkerhughes/tastytrade-mcp
  and cloned CANDIDATE_REF=mcp-server-refactor, a branch that no longer exists,
  so `make benchmark` could not build. The repo URL and the subdirectory paths
  are corrected, but the two-ref baseline/candidate comparison has no second ref
  to compare against any more. That needs a decision, so it is documented in the
  Dockerfile rather than guessed at. Nothing in CI builds this image, which is
  why it went unnoticed.

Workflow files renamed to match, so the check names read harbor-hub and
tastytrade.

Deliberately unchanged: the Python package names (harbor_mcp, src), the
pyproject project names, the harbor-mcp console script, ~/.tastytrade-mcp as the
credentials directory, and the tastytrade-mcp/<task> eval namespaces. None are
visible in the repo layout, and renaming the credentials path or task namespaces
would break a working setup and orphan published tasks.

Verified: both plugin manifests and the marketplace validate; harbor-hub 72
tests, tastytrade 106 tests at 93.00% coverage, ruff and mypy clean, 12 eval
verifiers pass. Both launchers complete an MCP handshake from an unrelated cwd
under env -i PATH=/usr/bin:/bin, returning 15 and 12 tools. The version gate was
simulated against this branch and correctly matches the new paths.
@walkerhughes
walkerhughes merged commit 7aa20b2 into main Jul 31, 2026
6 checks passed
@walkerhughes
walkerhughes deleted the refactor/plugins-dir branch July 31, 2026 04:51
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