feat(app): install and configure first-party plugins through the UI - #447
Merged
Conversation
"Built in" in the marketplace browser used to label every tier:bundled registry entry, including the 15 first-party connectors/actions that never auto-install — the list lied, and those entries had no install button and no way to configure them. - partitionListings now groups by ACTUAL install state: a bundled entry shows as Built-in only when the plugin registry really has it; anything not installed is Available with a working Install button. - New first-party catalog (plugins/first-party-catalog.ts) maps each non-auto-installed registry entry to an installable pure-data manifest whose capability grant mirrors the real defineConnector/defineAction/hub feature declarations; installs go through registry.install at builtin provenance and survive reload via loadFromStore. - New per-plugin configuration: a declarative config spec per catalog entry (tokens, webhook secrets, repo/base ids), rendered by the generic PluginConfigDialog and persisted device-only in localStorage (plugins/plugin-config.ts). Install drops straight into the form; details view and the Installed tab get Configure buttons and an amber "Needs setup" hint until required fields are set; uninstall clears the saved config. - Drift guard: first-party-catalog.test.ts asserts every autoInstalled:false registry entry stays installable and secret fields stay covered by the declared capabilities. Signed-off-by: xNet Test <test@xnet.dev> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
|
✓ Changelog fragment found — thanks! |
Signed-off-by: xNet Test <test@xnet.dev> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: xNet Test <test@xnet.dev> Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Contributor
🖼️ UI changes in this PRNo visual differences detected in the changed UI. |
Contributor
|
Preview removed for PR #447. |
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.
Problem
In Settings → Plugins → Browse, every
tier: bundledregistry entry was labelled Built-in — including the 15 first-party connectors/actions (GitHub, Slack, Notion, Linear, Discord, Stripe, …) that are flaggedautoInstalled: falseand never actually install. The label lied, those entries had no Install button (in the list or the details view), and there was no way to configure any plugin.What this does
Truthful labels —
partitionListingsnow groups by actual install state: a bundled entry shows as Built-in only when the plugin registry really has it. Anything not installed appears under Available with a working Install button.Real install through the UI — a new app-side catalog (first-party-catalog.ts) maps each non-auto-installed registry entry to an installable pure-data manifest whose capability grant mirrors the real
defineConnector/defineAction/ hub-feature declarations (secrets, network hosts, schema writes). Installs run through the normalregistry.installatbuiltinprovenance and persist across reloads vialoadFromStore. Cards and the details view surface the requested access from the catalog.Configuration through the UI — each catalog entry declares a config spec (tokens, webhook secrets, repo/base ids, …). The new generic
PluginConfigDialogrenders it (password inputs for secrets) and persists values device-only in localStorage (plugin-config.ts) — secrets never sync. Wired everywhere:Drift guard —
first-party-catalog.test.ts(sibling offirst-party-registry.test.ts) asserts everyautoInstalled:falseregistry entry has a catalog record (stays installable) and every secret config field is covered by the declaredcapabilities.secrets.Verification
Note:
apps/webis a private app — no changeset; changelog fragment included.🤖 Generated with Claude Code