Skip to content

feat(app): install and configure first-party plugins through the UI - #447

Merged
crs48 merged 4 commits into
mainfrom
claude/plugin-install-configure-0290
Jul 10, 2026
Merged

feat(app): install and configure first-party plugins through the UI#447
crs48 merged 4 commits into
mainfrom
claude/plugin-install-configure-0290

Conversation

@crs48

@crs48 crs48 commented Jul 10, 2026

Copy link
Copy Markdown
Owner

Problem

In Settings → Plugins → Browse, every tier: bundled registry entry was labelled Built-in — including the 15 first-party connectors/actions (GitHub, Slack, Notion, Linear, Discord, Stripe, …) that are flagged autoInstalled: false and 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 labelspartitionListings now 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 normal registry.install at builtin provenance and persist across reloads via loadFromStore. 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 PluginConfigDialog renders it (password inputs for secrets) and persists values device-only in localStorage (plugin-config.ts) — secrets never sync. Wired everywhere:

  • Installing a configurable plugin drops straight into its config form
  • The plugin details view gains a Configure button + amber Needs setup hint until required fields are set
  • The Installed tab gets a gear button per configurable plugin and the same needs-setup hint
  • Uninstall clears the saved config

Drift guardfirst-party-catalog.test.ts (sibling of first-party-registry.test.ts) asserts every autoInstalled:false registry entry has a catalog record (stays installable) and every secret config field is covered by the declared capabilities.secrets.

Verification

  • Typecheck passes; 24 tests pass (new catalog + config-store suites, updated partition tests, existing registry drift guard).
  • Exercised end-to-end in the browser against the real 19-entry registry.json:
    • Browse shows 4 genuinely-installed plugins under Built in, 15 installable under Available
    • GitHub: details → Install → auto-opened config form → saved token/owner/repo → moved to Built in, no warning
    • Discord: installed without configuring → Needs setup hint in details + Installed tab
    • Full page reload: both stay installed, config persists, needs-setup state correct; no console errors

Note: apps/web is a private app — no changeset; changelog fragment included.

🤖 Generated with Claude Code

"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>
@crs48
crs48 temporarily deployed to pr-447 July 10, 2026 14:58 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

✓ Changelog fragment found — thanks!

Signed-off-by: xNet Test <test@xnet.dev>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-447 July 10, 2026 14:58 — with GitHub Actions Inactive
Signed-off-by: xNet Test <test@xnet.dev>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@crs48
crs48 temporarily deployed to pr-447 July 10, 2026 15:02 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

🖼️ UI changes in this PR

No visual differences detected in the changed UI.

CI run

github-actions Bot added a commit that referenced this pull request Jul 10, 2026
@github-actions

github-actions Bot commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Preview removed for PR #447.

github-actions Bot added a commit that referenced this pull request Jul 10, 2026
@crs48
crs48 temporarily deployed to pr-447 July 10, 2026 15:11 — with GitHub Actions Inactive
github-actions Bot added a commit that referenced this pull request Jul 10, 2026
@crs48
crs48 merged commit e3fca83 into main Jul 10, 2026
15 checks passed
@crs48
crs48 deleted the claude/plugin-install-configure-0290 branch July 10, 2026 15:22
github-actions Bot added a commit that referenced this pull request Jul 10, 2026
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.

1 participant