feat(dashboard): right-click context menus on all rows and cards with per-entry actions - #4210
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
… per-entry actions Every table row, card, and list entry whose kebab (⋯) menu offers actions now offers the same actions on right-click, extending the pattern already used by source/environment/prompt/assistant cards and session rows. - DotTable rows: sources table, remote identity provider tabs (MCP servers, sessions, OAuth clients) - moonshine tables (via the new Table renderRow prop): deployments, exclusions, policy center, shadow MCP inventory, team members - CSS-grid/list rows: roles, tool list, source tools, chat logs - Cards: org home project cards/rows, plugin cards Rows build one Action[] shared by the visible kebab and the context menu; complex menus (team member management) mirror item-for-item with the same RBAC gating. Adds ContextMenuSeparator to the context-menu primitive. Requires @speakeasy-api/moonshine with Table renderRow (speakeasy-api/moonshine#354); bump the dependency once released. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
🦋 Changeset detectedLatest commit: d710ab4 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
…enderRow Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
🚀 Preview Environment (PR #4210)Preview URL: https://pr-4210.dev.getgram.ai
Gram Preview Bot |
There was a problem hiding this comment.
All reported issues were addressed across 27 files
Tip: instead of fixing issues one by one fix them all with cubic
Re-trigger cubic
Re-applied shadow MCP context-menu wiring on top of the inventory refactor (#4064/#4065): shared Action[] builder moved to shadowMCPInventoryActionItems.ts, dropdown and row context menu both render from it; renderRow composes with the new onRowClick detail-page navigation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
DemoRecorded against the local stack on this branch. What it shows:
|
- shadow MCP: action set is additive again — a server with both a pending request and an allow rule offers Review Request AND Edit/Delete Rule (early-return regression) - deployments: both menus observe pending redeploys across hook instances via the shared mutation key, preventing double-submit - roles: one roleActions() builder feeds the kebab and the context menu - team: context-menu separator can no longer render orphaned - exclusions: dropdown forwards action.disabled - plugin card: install dropdown and context menu build from one Action[] (new description/separatorBefore metadata on the shared Action type) - sources rows: DotRow href/ariaLabel instead of onClick (native link semantics), actions cell lifted above the link overlay - AnnotationToggle: switch exposes its description via aria-describedby - removed dead SourceToolActions component; clarified plan-doc scope note Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
|
Addressed the cubic review in a6dbb97: Fixed (11 of 14):
Not addressed (3), deliberately:
Verified: dashboard lint (oxfmt + oxlint + tsc) clean, 718/718 tests. |
The conflict-resolution reinstall dropped the workspace overrides and patchedDependencies blocks from pnpm-lock.yaml (ERR_PNPM_LOCKFILE_CONFIG_MISMATCH in CI); regenerated from main's lockfile with only the moonshine 1.44.0 bump. Adds the changeset required for feat PRs touching dashboard and formats the superpowers docs per hk. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
There was a problem hiding this comment.
All reported issues were addressed across 16 files (changes from recent commits).
Tip: Review your code locally with the cubic CLI to iterate faster.
Fix all with cubic | Re-trigger cubic

What
Every table row, card, and list entry whose "⋯" kebab menu offers per-entry actions now offers the same actions on right-click, finishing the initiative started by
CardContextMenu(source/environment/prompt/assistant cards) and the hand-wired session rows.New shared component:
TableRowContextMenu— theasChildsibling ofCardContextMenufor<tr>/row elements, fed by the sameAction[]as the visible kebab, no-op when empty. Both now shareActionContextMenuContent.Wired surfaces:
renderRowprop: deployments, exclusions, policy center, shadow MCP inventory, team members (hand-wired mirror incl. separator + per-item RBAC gating)Refactors along the way: raw dropdown kebabs now render from a single
Action[](visuals unchanged);useSourceToolActions/useProjectActions/useDeploymentActionshooks extracted so both menus share one source of truth;ContextMenuSeparatoradded to the primitive.Deliberately out of scope: Triggers (no per-row menu exists), Sources grid cards (already done), Team invites (visible buttons, not hidden options).
Dependency
Table/Table.BodyrenderRowprop from speakeasy-api/moonshine#354. CI stays red on this draft until that PR merges + releases and@speakeasy-api/moonshineis bumped here. Everything was verified locally against the built moonshine branch.Verification
pnpm -F dashboard type-check: clean (against local moonshine build)pnpm -F dashboard test: 711/711pnpm -F dashboard lint(oxfmt + no-barrels + oxlint type-aware + tsc): cleanpnpm -F dashboard build: passesDesign spec and implementation plans are committed under
docs/superpowers/.🤖 Generated with Claude Code
https://claude.ai/code/session_01Mpze1EupifNgKSkWRZ8BZc
Summary by cubic
Adds right‑click context menus to all rows, cards, and list items that already have a kebab (⋯) menu. The same per‑entry actions now show on right‑click with shared components, consistent RBAC/disabled states, and better accessibility.
New Features
TableRowContextMenu(no‑op when empty) and sharedActionContextMenuContent+ContextMenuSeparator;Actionnow supportsdescriptionandseparatorBefore.shadowMCPInventoryActionItems.ts.Table/Table.BodyrenderRowwithonRowClick; added tests for menu mapping/selection; docs include a demo GIF.@speakeasy-api/moonshineto1.44.0forrenderRow.Bug Fixes
roleActions()for both menus; team menu avoids stray separators; exclusions forwardaction.disabled; plugin card dropdown and context menu share one action list; sources rows use linkhref/ariaLabel;AnnotationToggleexposes its description viaaria-describedby; removed deadSourceToolActions.pnpm-lock.yamloverrides/patches to resolve lockfile mismatch and added a changeset for dashboard.Written for commit d710ab4. Summary will update on new commits.