refactor: finish the AgentHub rename and drop the MCP server
Two leftovers from the rebrand, done together because they touch the same docs and manifests. **Data directory.** `agent-dashboard` could not simply be renamed in the source: it names a real directory holding the live SQLite database. Startup now moves it once, via `migrateLegacyDataDir()` in `server/lib/claude-home.js` — a same-filesystem rename, so it is instant even at multiple gigabytes and cannot leave two divergent copies. `getDataDir()` stays PURE and resolves to the legacy path until the move happens; the first version of this put the rename inside the getter, which meant `npm run test:server` relocated the developer's real database as a side effect. The call sits behind `require.main === module` and ahead of the router requires, because those pull in db.js, which opens SQLite at module load. A failed rename is silent and the old directory keeps being used: an unfashionable directory name beats a blank database beside an unreachable one. Same treatment for the port-discovery file (`.agent-dashboard.json` → `.agenthub.json`, old one dropped on write). Not renamed on purpose: the Sagi localStorage keys (renaming silently resets everyone's prefs) and the PWA manifest `id` (changing it orphans an installed app). **MCP server.** 4 tool calls in 46 days across 577,132 events, against 4,556 lines of TypeScript, a 2 MB committed build artifact, and a pre-commit guard that had already blocked commits twice. Deleted: `mcp/`, the maintainer skills and `mcp-reviewer` agent, the build check, `plugins/agenthub/.mcp.json`, `docs/MCP.md`, 12 npm scripts, 5 Makefile targets, and every doc section describing it. Kept, because they are unrelated things sharing the name: the Config Explorer's MCP tab and its API, per-lane Playwright MCP, the agenthub-config plugin's MCP audit, and the historical `mcp__plugin_agenthub_*` events that analytics must keep attributing. Verified: server 1432/1432, client 459/459, tsc clean, prettier clean. Both directions of the migration proven — a sandbox-HOME test run leaves the legacy directory untouched, and a real boot moves it with its contents intact.
This commit is contained in:
+18
-20
@@ -74,7 +74,7 @@ Skills and commands are invoked as `/agenthub-<plugin>:<name>`. Agents are dispa
|
||||
## The `agenthub` plugin
|
||||
|
||||
The marketplace's root entry (`"source": "./"`) is the entire repository, so
|
||||
`server/`, `client/`, `mcp/`, `scripts/` and `bin/agenthub.js` all land under
|
||||
`server/`, `client/`, `scripts/` and `bin/agenthub.js` all land under
|
||||
`${CLAUDE_PLUGIN_ROOT}` when Claude Code caches it. That is what makes a
|
||||
checkout unnecessary.
|
||||
|
||||
@@ -85,12 +85,11 @@ checkout unnecessary.
|
||||
| The eight event hooks | inline `hooks` in `.claude-plugin/plugin.json`, each running `scripts/hook-handler.js` |
|
||||
| The dashboard server | started detached by the bootstrap, from the plugin cache |
|
||||
| The `agenthub` CLI | a launcher written to `~/.local/bin/agenthub` |
|
||||
| The MCP tools | `plugins/agenthub/.mcp.json`, pointing at the committed `mcp/build/index.js` |
|
||||
| The dashboard UI (`/run` and every other client route) | built into the runtime dir by the bootstrap, so it works the moment `claude` starts |
|
||||
| `/agenthub-doctor`, `/agenthub-update`, `/agenthub-open` | `plugins/agenthub/commands/` |
|
||||
| `/ship-full`, `/ship-quick` and one command per pipeline node (`/intake`, `/plan`, `/implement`, `/tests`, `/e2e`, `/review`, `/qc`, `/gate`, `/publishing`, `/pr-open`, `/done`, …) | `plugins/agenthub/commands/`, one file per name |
|
||||
| The skills (`ship-feature-lane`, `ship-feature`, `repo-onboarding`, `debug-live-issue`, `mcp-operations`, `update-project-docs`, `file-headers`) | `skills/` at the repo root — which IS the plugin root, so they are auto-discovered as plugin skills |
|
||||
| The agents (`qc-local`, `senior-gate-reviewer`, `backend-reviewer`, `frontend-reviewer`, `mcp-reviewer`) | `agents/` at the repo root, auto-discovered the same way — exposed as `agenthub:<name>` |
|
||||
| The skills (`ship-feature-lane`, `ship-feature`, `repo-onboarding`, `debug-live-issue`, `update-project-docs`, `file-headers`) | `skills/` at the repo root — which IS the plugin root, so they are auto-discovered as plugin skills |
|
||||
| The agents (`qc-local`, `senior-gate-reviewer`, `backend-reviewer`, `frontend-reviewer`) | `agents/` at the repo root, auto-discovered the same way — exposed as `agenthub:<name>` |
|
||||
|
||||
Plugin skills are namespaced: they are invoked as `/agenthub:<name>`, with the bare
|
||||
`/<name>` working as an alias unless another skill or command claims that name.
|
||||
@@ -100,8 +99,8 @@ useless for a lane working in a different repo. `agenthub skills install` surviv
|
||||
as the fallback for a plain checkout without the plugin.
|
||||
|
||||
**The agents ship the same way, from the same files.** `agents/` at the repo
|
||||
root holds all five (`qc-local`, `senior-gate-reviewer`, `backend-reviewer`,
|
||||
`frontend-reviewer`, `mcp-reviewer`), so the plugin exposes them as
|
||||
root holds all four (`qc-local`, `senior-gate-reviewer`, `backend-reviewer`,
|
||||
`frontend-reviewer`), so the plugin exposes them as
|
||||
`agenthub:<name>`. `agenthub lanes agents install` copies `qc-local` +
|
||||
`senior-gate-reviewer` from that same directory into a lane's own
|
||||
`.claude/agents/` — the highest-priority agent source — which is what makes the
|
||||
@@ -149,7 +148,7 @@ waits on an install:
|
||||
The first run takes a few minutes — most of it is the UI build, which is what
|
||||
makes client-only routes (`http://localhost:4820/run`, and every other page)
|
||||
work the moment `claude` starts, with no manual `/agenthub-open` step. Progress
|
||||
goes to `~/.claude/agent-dashboard/runtime/bootstrap.log`; `npm run build`'s own
|
||||
goes to `~/.claude/agenthub/runtime/bootstrap.log`; `npm run build`'s own
|
||||
output goes to `client-build.log` next to it; the server's own output goes to
|
||||
`server.log`.
|
||||
|
||||
@@ -164,7 +163,7 @@ cache directory rewrites and restarts the unit on the next session start, the
|
||||
same self-healing pattern the CLI launcher already uses. The bootstrap also
|
||||
tries `loginctl enable-linger` so the service starts on a cold boot before
|
||||
anyone logs in; when that needs elevated rights, it's skipped silently (check
|
||||
`~/.claude/agent-dashboard/runtime/bootstrap.log`, or run
|
||||
`~/.claude/agenthub/runtime/bootstrap.log`, or run
|
||||
`sudo loginctl enable-linger <user>` once by hand). A pre-existing
|
||||
`agenthub.service` unit not written by this bootstrap is left untouched, and the
|
||||
server falls back to the old per-session detached spawn instead.
|
||||
@@ -195,7 +194,7 @@ drive step by step (`brainstorming`, `writing-plans`,
|
||||
`verification-before-completion`, `finishing-a-development-branch`). Install it
|
||||
with `claude plugin install superpowers@claude-plugins-official`.
|
||||
|
||||
The row is a **WARN, never a FAIL**: the dashboard, hooks, CLI and MCP all work
|
||||
The row is a **WARN, never a FAIL**: the dashboard, hooks and CLI all work
|
||||
without it, and only those two pipeline skills stop partway. A plugin listed but
|
||||
explicitly disabled counts as missing — Claude Code will not resolve its skills.
|
||||
The skills present as plain user skills under `~/.claude/skills/` count as
|
||||
@@ -215,7 +214,7 @@ install clones from the network. It runs `claude plugin install
|
||||
superpowers@claude-plugins-official --scope user -y`; if that fails it registers
|
||||
the marketplace (`claude plugin marketplace add anthropics/claude-plugins-official`)
|
||||
and retries exactly once. Failure is logged with the manual command and nothing
|
||||
throws — the dashboard, hooks, CLI and MCP do not need these plugins.
|
||||
throws — the dashboard, hooks and CLI do not need these plugins.
|
||||
|
||||
The result is recorded as `skillPluginsSettled` in the bootstrap's `state.json`,
|
||||
which is also part of `fastPathOk()`: the check runs **once** per install, then
|
||||
@@ -240,9 +239,9 @@ without asking; it belongs in a review, not in a config file.
|
||||
|
||||
| Thing | Location | Survives a plugin update |
|
||||
|---|---|---|
|
||||
| SQLite DB, transcripts | `~/.claude/agent-dashboard/` | yes |
|
||||
| `node_modules`, `client-dist`, logs, lock, `state.json` | `~/.claude/agent-dashboard/runtime/` | yes (re-verified on every session start) |
|
||||
| Source, hooks, `mcp/build` | the plugin cache version directory | no — re-bootstrapped |
|
||||
| SQLite DB, transcripts | `~/.claude/agenthub/` | yes |
|
||||
| `node_modules`, `client-dist`, logs, lock, `state.json` | `~/.claude/agenthub/runtime/` | yes (re-verified on every session start) |
|
||||
| Source, hooks | the plugin cache version directory | no — re-bootstrapped |
|
||||
|
||||
The bootstrap deliberately does **not** set `DASHBOARD_DATA_DIR`: leaving the
|
||||
default keeps a plugin-run server and a developer's `npm run dev` server on one
|
||||
@@ -264,7 +263,7 @@ not assumed. It does **not**:
|
||||
`~/.claude/settings.json` (still pointing at that cache dir — they keep
|
||||
firing, and keep working, until the cache directory is eventually GC'd by
|
||||
Claude Code, at which point they silently start failing)
|
||||
- remove `~/.local/bin/agenthub` or `~/.claude/agent-dashboard/runtime/`
|
||||
- remove `~/.local/bin/agenthub` or `~/.claude/agenthub/runtime/`
|
||||
|
||||
For a clean machine, do all of this yourself:
|
||||
|
||||
@@ -274,10 +273,10 @@ For a clean machine, do all of this yourself:
|
||||
systemctl --user disable --now agenthub.service 2>/dev/null
|
||||
rm -f ~/.config/systemd/user/agenthub.service && systemctl --user daemon-reload 2>/dev/null
|
||||
# Fallback for a detached (non-systemd) server, or if the unit above was absent:
|
||||
kill "$(node -e 'console.log(JSON.parse(require("fs").readFileSync(require("os").homedir()+"/.claude/.agent-dashboard.json","utf8")).pid)')" 2>/dev/null
|
||||
kill "$(node -e 'console.log(JSON.parse(require("fs").readFileSync(require("os").homedir()+"/.claude/.agenthub.json","utf8")).pid)')" 2>/dev/null
|
||||
|
||||
# 2. Runtime state and the CLI launcher
|
||||
rm -rf ~/.claude/agent-dashboard/runtime # deps, UI bundle, logs, state
|
||||
rm -rf ~/.claude/agenthub/runtime # deps, UI bundle, logs, state
|
||||
rm -f ~/.local/bin/agenthub
|
||||
|
||||
# 3. The hook entries claude plugin install wrote (settings.json is not
|
||||
@@ -296,7 +295,7 @@ fs.writeFileSync(p, JSON.stringify(d, null, 2) + "\n");
|
||||
'
|
||||
```
|
||||
|
||||
`~/.claude/agent-dashboard/` still holds the SQLite database after all of the
|
||||
`~/.claude/agenthub/` still holds the SQLite database after all of the
|
||||
above — delete that directory too only if you want the recorded history gone.
|
||||
|
||||
## Available Plugins
|
||||
@@ -473,7 +472,7 @@ Audit your Claude Code configuration and curate the file-based memory store via
|
||||
|
||||
### 10. `agenthub-dashboard` — Dashboard Connector
|
||||
|
||||
Direct MCP integration, quick status, live watch, and endpoint probing.
|
||||
Quick status, live watch, and endpoint probing.
|
||||
|
||||
| Skill | Command | Purpose |
|
||||
|-------|---------|---------|
|
||||
@@ -484,7 +483,7 @@ Direct MCP integration, quick status, live watch, and endpoint probing.
|
||||
|
||||
**Commands:** `/agenthub-dashboard:status` · `/agenthub-dashboard:ping` · `/agenthub-dashboard:open-dashboard`
|
||||
|
||||
**Agent:** `dashboard-operator` — verifies the dashboard is up and guides start/restart/import. **MCP Server:** direct tool access to the Agent Monitor API. **Settings:** default agent model.
|
||||
**Agent:** `dashboard-operator` — verifies the dashboard is up and guides start/restart/import. **Access:** direct tool access to the Agent Monitor API. **Settings:** default agent model.
|
||||
|
||||
---
|
||||
|
||||
@@ -541,7 +540,6 @@ my-plugin/
|
||||
│ └── hooks.json # Event hooks (fail-safe, non-blocking)
|
||||
├── bin/
|
||||
│ └── my-cli-tool # CLI scripts (added to PATH)
|
||||
├── .mcp.json # MCP server configuration
|
||||
└── settings.json # Plugin settings
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user