Skip to content

feat: plugin registry — unified view of installed plugins (closes #692)#847

Open
vivekchand wants to merge 1 commit intomainfrom
fix/gh-clawmetry-692-plugin-registry
Open

feat: plugin registry — unified view of installed plugins (closes #692)#847
vivekchand wants to merge 1 commit intomainfrom
fix/gh-clawmetry-692-plugin-registry

Conversation

@vivekchand
Copy link
Copy Markdown
Owner

Closes #692

What

New Plugins tab that shows all installed OpenClaw plugins in one unified view, categorized by type (connector, provider, tool, observability).

How

  • New routes/plugins.py blueprint with GET /api/plugins endpoint
  • Reads from openclaw.json plugins.entries
  • Categorizes plugins by type using keyword matching
  • Summary cards + filterable grid UI
  • Shows enabled/disabled status and configuration state

Screenshots

New Plugins tab with:

  • Summary cards (total, per-type counts)
  • Filter buttons (All / Connectors / Providers / Tools / Observability / Disabled)
  • Plugin cards with type badge, status indicator, config state

@vivekchand vivekchand force-pushed the fix/gh-clawmetry-692-plugin-registry branch from 4c3afd1 to de6b270 Compare May 5, 2026 07:04
Copy link
Copy Markdown
Owner Author

@vivekchand vivekchand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test plan & review notes

What changed

  • Adds routes/plugins.py (bp_plugins, GET /api/plugins) that reads openclaw.jsonplugins.entries, classifies each plugin into connector/provider/tool/observability via static frozenset lookup, and returns a JSON list + summary; dashboard.py gains a new "Plugins" nav tab and a JS loadPlugins() / renderPluginsList() / filterPlugins() section that renders cards with per-type colour coding and enable/disable status.

Smoke commands

  • make test or make test-api
  • python3 dashboard.py --port 8900 then click the Plugins tab in the nav bar

What to look at visually

  • Navigate to http://localhost:8900 → "Plugins" tab — verify summary cards show correct totals, filter buttons work, and plugin cards render with the right icon/colour
  • curl -sS http://localhost:8900/api/plugins | python3 -m json.tool — expected shape: {"plugins": [{"name": "...", "type": "connector|provider|tool|observability", "enabled": true|false, "hasConfig": true|false}, ...], "summary": {"total": N, "enabled": N, "byType": {...}}}

Likely failure modes from the diff

  • Unknown plugin names fall through to "tool" silently — any plugin not in the four frozensets (e.g. a community plugin or a newly added first-party one) will be mis-classified as "tool" with no warning. Consider adding an "unknown" type or logging unrecognised names.
  • data.get("plugins") or {} hides a non-dict plugins key — if openclaw.json has "plugins": null or "plugins": [], the double-fallback silently returns no plugins instead of surfacing a parse error.
  • filterPlugins reads event as an implicit global — the filterPlugins(type) JS function references event without it being passed as a parameter; this relies on the deprecated implicit window.event and will be undefined in Firefox and strict-mode environments, so the active-button highlight won't update. Fix: pass this from the onclick and toggle class on the passed element instead.
  • Nav tab added twice in dashboard.py — the diff shows the <div class="nav-tab" onclick="switchTab('plugins')"> hunk applied to two separate template string blocks (around lines 3297 and 8651). Confirm at runtime that only one tab appears in the rendered HTML (double-registration would show duplicate tabs).

Issue link

  • Closes #692 ✓ (already in title)

Generated by Claude Code

Copy link
Copy Markdown
Owner Author

@vivekchand vivekchand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test plan & review notes

Repo: vivekchand/clawmetry

What changed

  • New routes/plugins.py blueprint: GET /api/plugins reading openclaw.json plugin entries, categorized by type via keyword matching
  • New "Plugins" tab with summary cards (total, per-type counts) + filterable grid (All / Connectors / Providers / Tools / Observability / Disabled)

Smoke commands

  • python3 -c 'import ast; ast.parse(open("routes/plugins.py").read())' — syntax clean
  • Without openclaw.json: curl -sS http://localhost:8900/api/plugins — should return {"plugins": []}, not 500
  • With plugins installed: verify each plugin appears with correct type, enabled, and configured fields
  • make test

What to look at visually

  • http://localhost:8900 → "Plugins" tab → summary cards → filter buttons → grid of plugins with enabled/disabled status badges

Likely failure modes from the diff

  • Keyword-based categorization: a plugin with a generic name (e.g. "my-tool") may land in the wrong bucket or fall through to a catch-all — confirm there's a default category
  • Blueprint registration: routes/plugins.py must be imported and registered in dashboard.py

Issue link


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

@vivekchand vivekchand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test plan & review notes

Repo: vivekchand/clawmetry

What changed

  • Adds a new Plugins tab: routes/plugins.py exposes GET /api/plugins (reads openclaw.json plugins entries, classifies by type, returns summary counts); dashboard.py wires in the blueprint, nav tab, HTML panel, and ~70 lines of JS for rendering/filtering.

Heads-up — branch is DIRTY (mergeable_state: dirty). There are merge conflicts against main that need resolving before this can land.

Smoke commands

# Resolve conflicts first, then:
make lint
python3 dashboard.py --port 8900

What to look at visually

  • http://localhost:8900 → click the new Plugins tab
  • Verify summary cards render (Total / Connectors / Providers / Tools / Observability)
  • Click each filter button and confirm the grid filters correctly
  • Test with an openclaw.json that has no plugins key — should show "No plugins found" gracefully
  • Test with an openclaw.json that has unknown plugin names — they will silently fall through to type: "tool" (see concern below)

Likely failure modes from the diff

  • Unknown plugin names silently become "tool"_classify() falls back to "tool" for anything not in the four hardcoded frozensets. A plugin like "custom-analytics-exporter" will appear under Tools rather than Observability. Consider logging a warning or adding an "other" bucket instead.
  • filterPlugins reads implicit event globalfunction filterPlugins(type) calls event.target.classList.add('active') without event in the function signature. This works in most browsers but is non-standard; passing event explicitly from the onclick handlers (onclick="filterPlugins('all', event)") is safer.
  • Nav tab duplicated in dashboard.py — the tab is added in two places (OSS template ~line 3297 and cloud template ~line 8651). This matches the existing pattern in the file, so it's expected — just worth a quick sanity check that both variants render the tab.
  • openclaw.json path — relies on _d._get_openclaw_dir() from dashboard.py; if that helper is unavailable in a future refactor to helpers/, this will break silently (returns empty list, not an error).

Issue link

  • Closes #692 ✓ (already linked in PR body)

10 days old with no activity — the feature itself is additive (new tab, new route file, no mutations to existing endpoints) so there's low conflict risk beyond the dirty merge state. Worth a rebase to unblock.


Generated by Claude Code

Copy link
Copy Markdown
Owner Author

Test plan & review notes

Repo: vivekchand/clawmetry

What changed

  • New routes/plugins.py blueprint (GET /api/plugins) reading openclaw.json plugins.entries; keyword-based type categorisation (connector/provider/tool/observability); new Plugins tab with summary cards, type-filter chips, and plugin cards showing enabled/disabled status and config state

Smoke commands

  • make test
  • python3 dashboard.py --port 8900
  • curl -sS http://localhost:8900/api/plugins → expect list with type, enabled, config_state per plugin

What to look at visually

  • http://localhost:8900 → Plugins tab → summary cards per type; filter chips should instantly narrow the grid without a network request

Likely failure modes from the diff

  • openclaw.json absent or plugins.entries key missing → should return [] not 500
  • Keyword-based type classification: plugins with ambiguous names may land in the wrong bucket — worth spot-checking any installed plugins with unusual names

Branch note

  • This branch is currently behind main (dirty merge state). A git rebase origin/main would get CI running again.

Issue link


Generated by Claude Code

…692)

New Plugins tab in the ClawMetry dashboard showing all installed OpenClaw
plugins in one unified view, categorized by type (connector, provider, tool,
observability). Reads from openclaw.json plugins.entries, with summary cards,
filter buttons, and a responsive card grid.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@vivekchand vivekchand force-pushed the fix/gh-clawmetry-692-plugin-registry branch from de6b270 to 2f46a39 Compare May 8, 2026 00:21
Copy link
Copy Markdown
Owner Author

Auto-rebase pushed; CI now running. If still not green in 10min, may need manual attention.


Generated by Claude Code

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.

[P2] Plugin registry — unified view across connector/memory/tool/provider

1 participant