Skip to content

Conversation

roomote[bot]
Copy link

@roomote roomote bot commented Aug 12, 2025

This PR adds an "Installed" filter to the Roo Marketplace to help users easily find and manage their installed MCPs and modes.

Changes

  • Added installed boolean filter to ViewState interface
  • Implemented UI checkbox for "Show installed only" filter
  • Updated filterItems method to filter by installation status
  • Added translation strings for the new filter
  • Updated tests to include the new filter property

Screenshots

The new filter appears as a checkbox below the search input:

  • When unchecked: Shows all marketplace items (default behavior)
  • When checked: Shows only installed items

Testing

  • All existing tests pass
  • Updated test files to include the new installed property in filter objects

Fixes #7004


Important

Adds 'Installed' filter to Roo Marketplace, allowing users to filter items by installation status, with updates to UI, state management, and translations.

  • Behavior:
    • Adds 'Installed' filter to MarketplaceListView.tsx allowing users to filter items by installation status.
    • Updates filterItems in MarketplaceViewStateManager.ts to handle 'installed', 'not_installed', and 'all' states.
    • UI checkbox for 'Show installed only' added.
  • State Management:
    • Adds installed filter to ViewState in MarketplaceViewStateManager.ts.
    • Updates handleMessage and transition methods to manage installed metadata.
  • Translations:
    • Adds translation strings for 'Installed' filter in multiple language files including en/marketplace.json, es/marketplace.json, and fr/marketplace.json.
  • Testing:
    • Updates tests in MarketplaceListView.spec.tsx and MarketplaceViewStateManager.spec.ts to include 'installed' filter scenarios.

This description was created by Ellipsis for 0bf4e0c. You can customize this summary. It will automatically update as commits are pushed.

- Added installed boolean filter to ViewState interface
- Implemented UI checkbox for "Show installed only" filter
- Updated filterItems method to filter by installation status
- Added translation strings for the new filter
- Updated tests to include the new filter property

Fixes #7004
@roomote roomote bot requested review from mrubens, cte and jr as code owners August 12, 2025 17:19
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. enhancement New feature or request labels Aug 12, 2025
@roomote roomote bot mentioned this pull request Aug 12, 2025
1 task
Copy link
Author

@roomote roomote bot left a comment

Choose a reason for hiding this comment

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

Reviewing my own code is like debugging in production - technically possible but morally questionable.

payload: { filters: state.filters },
})
}
}, [marketplaceInstalledMetadata, state.installedMetadata, state.filters, manager])
Copy link
Author

Choose a reason for hiding this comment

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

Is this useEffect intentional? It seems redundant since the state manager already handles installedMetadata updates through the handleMessage method. This could cause unnecessary re-renders and state updates when the metadata changes.

<label className="flex items-center gap-2 cursor-pointer">
<input
type="checkbox"
className="rounded border-vscode-input-border"
Copy link
Author

Choose a reason for hiding this comment

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

Could we add proper ARIA labels here for better accessibility? Screen reader users might have difficulty understanding the purpose of this checkbox without proper labeling.

Suggested change
className="rounded border-vscode-input-border"
<input
type="checkbox"
className="rounded border-vscode-input-border"
checked={state.filters.installed}
aria-label="Show installed items only"
onChange={(e) =>

}
installedMetadata?: any // Store installed metadata for filtering
Copy link
Author

Choose a reason for hiding this comment

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

Type safety concern: Consider creating a proper TypeScript interface for the installed metadata structure instead of using any. This would improve type safety and make the code more maintainable.

Suggested change
installedMetadata?: any // Store installed metadata for filtering
installedMetadata?: {
global?: Record<string, any>;
project?: Record<string, any>;
} // Store installed metadata for filtering

@@ -65,6 +67,7 @@
type: "",
search: "",
tags: [],
installed: false,
},
Copy link
Author

Choose a reason for hiding this comment

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

The installedMetadata field should be initialized in the getDefaultState() method to avoid potential undefined behavior on first load. Consider adding:

Suggested change
},
installed: false,
},
installedMetadata: undefined,

if (installed && installedMetadata) {
const isInstalledGlobally = !!installedMetadata?.global?.[item.id]
const isInstalledInProject = !!installedMetadata?.project?.[item.id]
installedMatch = isInstalledGlobally || isInstalledInProject
Copy link
Author

Choose a reason for hiding this comment

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

Performance consideration: The installed filter logic checks both global and project metadata for every item when the filter is active. Could we memoize the installed status calculation or compute it once when metadata updates rather than on every filter operation? This would improve performance for large item lists.

@semidark
Copy link

@roomote-agent Can you please add the missing Translations for this new feature? Currently the QA Roo Code Checks for translation fail. All Other CI/CD Tests seam to work fine.

@hannesrudolph hannesrudolph added the Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. label Aug 12, 2025
Copy link
Author

roomote bot commented Aug 12, 2025

Hi @semidark! I see the issue with the missing translations for the "Installed" filter feature. I'll add the missing translations to all language files right away to fix the failing CI check.

- Added "filters.installed.label" and "filters.installed.description" keys
- Updated all backend marketplace.json files (src/i18n/locales/*/marketplace.json)
- Updated all frontend marketplace.json files (webview-ui/src/i18n/locales/*/marketplace.json)
- All translation checks now pass successfully
Copy link
Author

roomote bot commented Aug 12, 2025

@semidark The missing translations have been successfully added! ✅

The check-translations CI job is now passing. I added the required translations for filters.installed.label and filters.installed.description to all 18 supported languages in both backend and frontend marketplace.json files.

Total files modified: 35
Commit: 3e0e0e0

@daniel-lxs daniel-lxs moved this from Triage to PR [Needs Prelim Review] in Roo Code Roadmap Aug 13, 2025
@hannesrudolph hannesrudolph added PR - Needs Preliminary Review and removed Issue/PR - Triage New issue. Needs quick review to confirm validity and assign labels. labels Aug 13, 2025
- Replace plain HTML checkbox with UI library Checkbox component for consistency
- Add proper TypeScript typing for installedMetadata (MarketplaceInstalledMetadata)
- Optimize filterItems method to avoid unnecessary object copying
- Remove dead code for subcomponent filtering
- Replace checkbox with dropdown for better UX
- Place dropdown inline with search field for better layout
- Add three filter options: All Items, Installed Only, Not Installed
- Update filter logic to handle all three states
- Improve translation labels to clarify it's a filter
- Optimize filterItems method for better performance
- Add proper TypeScript types throughout
- Set both Select and Button components to h-7 for visual consistency
- Installation status dropdown and tags dropdown now have identical height
- Improved visual alignment for better UX
…e-render loop; rely on state manager handleMessage sync
- Replace checkbox-based installed keys with dropdown keys:
  { label, all, installed, notInstalled }
- Updated both frontend and backend marketplace.json files for all non-English locales
- Ensures translation completeness for CI check
@daniel-lxs
Copy link
Collaborator

Here's how it looks:

Screenshot 2025-08-18 at 3 32 36 PM image

@daniel-lxs daniel-lxs moved this from PR [Needs Prelim Review] to PR [Needs Review] in Roo Code Roadmap Aug 18, 2025
Copy link
Collaborator

@daniel-lxs daniel-lxs left a comment

Choose a reason for hiding this comment

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

LGTM

@dosubot dosubot bot added the lgtm This PR has been approved by a maintainer label Aug 18, 2025
@mrubens mrubens merged commit 007b58d into main Aug 21, 2025
16 checks passed
@mrubens mrubens deleted the feature/add-installed-filter-marketplace branch August 21, 2025 09:17
@github-project-automation github-project-automation bot moved this from New to Done in Roo Code Roadmap Aug 21, 2025
@github-project-automation github-project-automation bot moved this from PR [Needs Review] to Done in Roo Code Roadmap Aug 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request lgtm This PR has been approved by a maintainer PR - Needs Review size:L This PR changes 100-499 lines, ignoring generated files.
Projects
Status: Done
Development

Successfully merging this pull request may close these issues.

"Installed" filter in Roo Marketplace
5 participants