fix(plugins): stop auto-installing plugins on detail page click - #1075
Merged
Conversation
Previously, clicking any plugin card navigated to /admin/plugins/:id which called ensurePlugin(), silently installing and activating plugins without explicit user action. Now uninstalled plugins show a detail page with an explicit Install button — matching expected UX where install requires deliberate action. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Route: also match by plugin name in uninstalled lookup (handles id/codeName mismatches) - Test 93: explicitly install oauth-providers before testing settings (was relying on removed auto-install) - Test 68: increase timeouts, wait for URL change before asserting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Instead of relying on finding uninstalled plugins in the list, explicitly uninstall hello-world and navigate directly to its detail page. Eliminates flakiness from unknown CI plugin state. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Click Install + waitForNavigation instead of waitForTimeout to properly handle the 1500ms delayed reload. Assert Install button gone instead of matching status badge text with anchored regex. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
lane711
added a commit
that referenced
this pull request
Sep 4, 2026
GraphQL document mutations were denied for every caller. requireWritePermission called repo.isAllowed() with an empty typeSettings object, but base grants live on the document type — with none supplied, isAllowed sees only per-document ACL rows and denies update/publish/unpublish/delete even for an admin. Load the type via DocumentTypeRegistry and pass its settings. Two E2E corrections: - 100-graphql: the type id is `blog_post`, not `blog_posts`. createDocument on a type that does not exist surfaced as INTERNAL_SERVER_ERROR. - 80-user-profile-code-config: a fresh deploy has no `plugins` row for user-profiles, and #1075 made uninstalled plugins render the Info tab only, so the guidance panel behind the Settings tab was absent. Install the plugin first (no-op when already installed). Verified: 100-graphql 5/5 and 80-user-profile-code-config 3/3 pass locally; packages/core type-check clean; unit suite 1930 passed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Fixes plugin install behavior so clicking a plugin card no longer silently installs and activates it. Users must now explicitly click the Install button.
Changes
ensurePlugin()auto-install call fromGET /admin/plugins/:idroute handleruninstalledstatus support to plugin settings template (status badge, toggle button, tab defaults)installPlugin()JS function to the detail page for explicit install flowTesting
Unit Tests
E2E Tests
tests/e2e/68-plugin-install-click.spec.tsChecklist
Generated with Claude Code in Conductor