Skip to content

Reorganize Settings: split Plugins (built-in) from Extensions (installed) - #148

Merged
DianaSensei merged 1 commit into
mainfrom
settings-extensions-redesign
Sep 17, 2026
Merged

DianaSensei merged 1 commit into
mainfrom
settings-extensions-redesign

Conversation

@DianaSensei

Copy link
Copy Markdown
Owner

Summary

The Settings → Plugins page mixed four unrelated things in one long scroll — the compiled-in plugin permission/audit list, the Marketplace, Install-by-URL, and the installed-extension list — and used "plugin" for both the compiled-in tools and externally installed artifacts interchangeably.

  • Split into two nav sections: Plugins (compiled-in tools + permissions + activity log only) and Extensions (Marketplace + Install by URL + installed list), matching the terminology docs/plugin-sdk already uses ("Settings → Extensions").
  • Reordered the left nav by how often each section is actually touched: Appearance/Tools/Shortcuts, then Plugins/Extensions/MCP, then Permissions/About/Storage/Config.
  • Renamed the settings.plugins.install/installed/tabs/marketplace/restart.* i18n keys to settings.extensions.*, fixed wording that no longer matched the split ("Installed from outside" → "Installed extensions", "plugin list" → "extension list" in the Marketplace copy), and moved the extension-update nav badge from Plugins to Extensions.
  • Marketplace cards: separated label from id@version onto their own lines (was truncating together), switched the grid to auto-fill so it uses available width instead of a fixed 2-column layout, and gave installed cards a subtle accent border plus a hover state for others.

Test plan

  • npx tsc --noEmit — clean
  • npx vitest run — 1366/1366 passing (moved/updated Settings.routing.test.tsx, SettingsMarketplace.test.tsx, renamed SettingsPlugins.pendingInstallTab.test.tsx → SettingsExtensions.pendingInstallTab.test.tsx)

🤖 Generated with Claude Code

https://claude.ai/code/session_01BCypCuViyQDKGWxWspXKs2


Generated by Claude Code

…led), reorder nav, redesign Marketplace cards

The Plugins section mixed four unrelated things in one long scroll: the
compiled-in plugin permission/audit list, the Marketplace, Install-by-URL,
and the installed-extension list — and used "plugin" for both the
compiled-in tools and externally installed artifacts interchangeably.

- Split into two nav sections: Plugins (compiled-in tools + permissions +
  activity log only) and Extensions (Marketplace + Install by URL +
  installed list), matching the terminology docs/plugin-sdk already uses
  ("Settings → Extensions").
- Reordered the nav by how often each section is actually touched:
  Appearance/Tools/Shortcuts, then Plugins/Extensions/MCP, then
  Permissions/About/Storage/Config.
- Renamed the `settings.plugins.install/installed/tabs/marketplace/restart.*`
  i18n keys to `settings.extensions.*`, fixed wording that no longer
  matched the split ("Installed from outside" -> "Installed extensions",
  "plugin list" -> "extension list" in the Marketplace copy), and moved the
  extension-update badge from the Plugins nav entry to Extensions.
- Marketplace cards: separated label from id@version onto their own lines
  (was truncating together), switched the grid to auto-fill so it uses
  available width instead of a fixed 2-column layout, and gave installed
  cards a subtle accent border/hover state for other cards.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BCypCuViyQDKGWxWspXKs2
@pullfrog

pullfrog Bot commented Sep 17, 2026 •

Copy link
Copy Markdown

Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | View workflow run | via Pullfrog | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

@DianaSensei
DianaSensei enabled auto-merge (squash) September 17, 2026 16:36
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
20.6% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@codecov

codecov Bot commented Sep 17, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 65.43%. Comparing base (970b950) to head (f135e5a).

Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main     #148      +/-   ##
==========================================
- Coverage   65.49%   65.43%   -0.06%     
==========================================
  Files          13       13              
  Lines        3428     3428              
==========================================
- Hits         2245     2243       -2     
- Misses       1183     1185       +2     

see 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@DianaSensei
DianaSensei merged commit ef21099 into main Sep 17, 2026
17 of 19 checks passed
@DianaSensei
DianaSensei deleted the settings-extensions-redesign branch September 17, 2026 16:44

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

ℹ️ No critical issues. The split, the i18n rename, and the deep-link re-target are complete and covered by tests; only stale section-name references and one unused key came up.

Reviewed changes

  • Section split: Settings.tsx gains an extensions section; SettingsPlugins keeps only the compiled-in plugin permission + audit tables, while the new SettingsExtensions takes over the Marketplace / Install-by-URL tabs and the pendingInstall tab-default + subscribe logic.
  • Nav reorder + badge: SETTINGS_SECTIONS regrouped by usage frequency; the extension-update badge moved from plugins to extensions.
  • i18n rename: settings.plugins.{install,installed,tabs,marketplace,restart}.* → settings.extensions.*, plus a new settings.section.extensions; copy reworded for the new terminology.
  • Deep-link retarget: deepLink.ts navigates with { section: 'extensions' }; routing test and renderSettings helper follow.
  • Marketplace cards: label and id@version split onto separate lines, grid switched to auto-fill / minmax(15rem,1fr), installed cards get an accent border + hover state.

I verified npx tsc --noEmit is clean and the affected vitest suites pass (17 tests across routing / pendingInstall / marketplace / plugins), and that no stale settings.plugins.(install|installed|tabs|marketplace|restart) references remain outside i18n.ts.

ℹ️ Stale comments still name "Settings → Plugin" for the install flow

The install UI moved to Settings → Extensions, but three comments in files this PR touches still describe the deep-link target as Settings → Plugin. Only comments, no runtime effect, but they are the exact terminology this PR is aligning.

Technical details
# Stale section-name references after the Plugins → Extensions split

## Affected sites
- `src/lib/pendingInstall.ts:13` — "nếu người dùng ĐANG đứng ở Settings → Plugin …"
- `src/components/SettingsExtensionInstaller.tsx:133` — "… điều hướng tới Settings → Plugin"
- `src/components/SettingsExtensionInstaller.test.tsx:365` — "người dùng đang đứng sẵn ở Settings → Plugin"
- `src/platform/registry.ts:119` — says "Settings → Extensions đọc mảng này (`PLUGIN_ERRORS`)", but no component reads `PLUGIN_ERRORS` (only tests + `platform/index.ts` re-export); the previous text had the same inaccuracy under the old name.

## Required outcome
- Section-name references point at the section that actually renders the flow: the deep link now targets `settings.extensions` (per `deepLink.ts:76`), so the first three comments should say Settings → Extensions.
- `registry.ts:119` should either drop the "đọc mảng này" claim or note the array is currently only consumed by tests, so it doesn't imply a UI that does not exist.

Important

Pullfrog covered this run's model usage. DeepSeek Flash is fast and cheap — expect lighter work than a frontier model. This model allowance is temporary and separate from your Pullfrog plan. Connect a model-provider subscription or API key →

Pullfrog  | Fix all ➔ | Fix 👍s ➔ | View workflow run | Using DeepSeek Flash (model usage covered by Pullfrog) | 𝕏

Comment thread src/lib/i18n.ts
'settings.plugins.install.description': {
// ── Settings — Extensions (cài plugin/sidecar KHÁC ngoài bản biên dịch sẵn,
// qua Marketplace hoặc dán URL manifest tay) ──────────────────────────
'settings.extensions.title': { vi: 'Tiện ích', en: 'Extensions' },

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

settings.extensions.title is added but never referenced — the nav label comes from settings.section.extensions (Settings.tsx:302) and the panel renders no visible title, so this is an unused duplicate of the same string. Either use it as the nav label (matching settings.plugins.title / settings.mcp.title) or drop it, so the two don't drift.

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.

2 participants