-
Notifications
You must be signed in to change notification settings - Fork 2.9k
feat(extensions): interactive multi-tab /extensions manager (Installed / Discover / Sources) #4850
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
51 commits
Select commit
Hold shift + click to select a range
3f7cbda
feat(extensions): multi-tab /extensions dialog (Discover/Installed/Ma…
a63e37a
feat(extensions): align Discover plugin detail with Claude Code
86c760b
feat(extensions): align Add Marketplace view with Claude Code
d1f8e98
feat(extensions): fix Discover hang + add search/scrolling, align lis…
54c4f9f
feat(extensions): align marketplace detail with CC + Browse-to-Discover
d5bf144
feat(extensions): show plugin type in Installed; guide single-extensi…
d47d32a
fix(extensions): resolve git@ SSH marketplace sources
99d26a4
feat(extensions): cap Discover list window at 6 items
73d9b58
feat(extensions): unify 'Extension' wording, reorder tabs, expand Mar…
cff6ad4
feat(extensions): update Marketplaces tab footer hint
23f5dc1
feat(extensions): full extension actions in both tabs + context-aware…
dde9c59
feat(extensions): rename Marketplaces tab to Sources, hide Favorites …
3f891f9
feat(extensions): group Sources action rows + show current scope in s…
aed6a93
fix(extensions): move uninstall note to confirm step; complete zh/zh-…
6dcfb3a
feat(extensions): label Installed scope groups as 用户级/项目级/本地级
229de3a
feat(extensions): reuse /mcp server detail for installed MCP servers
2c49f01
fix(extensions): populate MCP promptCount from prompt registry
6c32c09
refactor(extensions): rename the source-management layer from marketp…
59f850c
fix(extensions): keep marketplaces.json filename so saved sources sur…
c83dd43
fix(extensions): stay on the Discover detail when an install fails
a5a70df
feat(extensions): support 'git-subdir' plugin source in Claude market…
0eacf78
feat(extensions): drop the unused 'local' install scope
d8919ed
feat(extensions): add Ctrl+R shortcut to refresh Discover tab
1abc5f8
fix(extensions): keep j/k typeable in Discover search
a52a5cd
feat(extensions): install standalone Claude Code plugins from a git URL
b98100c
i18n(zh): relabel user-scope install as 全局安装
bf46992
fix(extensions): keep the manager mounted during install consent prompts
c308b6e
feat(extensions): show loading feedback for scope change and toggles
fcdb7c1
feat(extensions): add --scope to install and a sources CLI command group
e24709d
feat(extensions): trim the Sources tab and add marketplace detail ret…
c5e49d5
feat(extensions): nest extension-bundled MCP servers under their exte…
12eb6e1
feat(extensions): per-server disable for extension MCPs and live status
e275ce2
Merge remote-tracking branch 'origin/main' into feat/enhance-extensio…
baeaf69
docs(extensions): document interactive manager and backfill missing i18n
05eb44f
fix(extensions): harden untrusted-marketplace handling from PR review
811e61b
fix(extensions): consent layout, per-extension update check, uninstal…
a8b745e
feat(extensions): clearer update-check feedback for "Mark for Update"
34f8252
fix(extensions): confine resource/source paths, sanitize homepage (re…
b050fe0
fix(extensions): confine symlink targets when converting untrusted pl…
1f302ac
fix(extensions): confine manifest reads, share path-containment helpers
7199a17
fix(extensions): cap manager dialog width to the main content area
cd5a11e
fix(diff): cap /diff dialog width to the main content area
3e5f7a5
Merge remote-tracking branch 'origin/main' into feat/enhance-extensio…
Copilot 74a2d0e
Merge remote-tracking branch 'origin/main' into feat/enhance-extensio…
Copilot e08694f
fix(extensions): address review round 3 — symlink/ANSI confinement, c…
61a69e2
fix(extensions): guard toggleFavorite write against unhandled rejection
a7b2df2
test(extensions): normalize realpathSync mock so gemini guard passes …
b5fa71a
fix(extensions): address review round 4 — shared sanitizer, narrowed …
a2d63d7
test(extensions): assert discoverPlugins strips ANSI/control chars fr…
631e271
fix(extensions): address review round 5 — scope-change rollback, vers…
158002c
fix(extensions): address review round 6 — marketplace-name sanitizati…
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
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
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
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
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
Oops, something went wrong.
Oops, something went wrong.
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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
[Suggestion] Non-atomic scope change:
disableExtension(User)succeeds, thenenableExtension(Workspace)can fail — leaving the extension disabled at both scopes with no rollback. The user sees an error but the extension is already disabled globally.The same pattern appears in two other locations:
ExtensionActionsView.tsx(handleScope) andDiscoverTab.tsx(runInstall). In the batch-install case, the scope error is only logged todebugLogger.error— the user sees "Installed N extension(s)" as success while one or more are silently disabled.— qwen3.7-max via Qwen Code /review
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed in e08694f for the CLI
installcommand — the Workspace enable is now wrapped so a failure rolls the User-scope disable back (best-effort) before rethrowing, so the extension isn't left disabled everywhere.I scoped this to
install.ts. TheDiscoverTab.runInstall/ExtensionActionsView.handleScopeoccurrences share the pattern, but their scope step is already isolated in its own try/catch that only logs a preference warning without flipping the install result — I'd rather give those two the same rollback in a focused follow-up than partially address them here.