ci: dev version includes UTC time (dev-YYYYMMDD-HHmm)
Build & Push Docker Image / build (push) Successful in 2m36s

Phase 1: browse power-up
- faceted filters: tags + features (array containment) and min rating
  on listTools; new ?tags=?features=?minRating= URL params with chips
- global Cmd+K command palette (cmdk) with tool search + navigation
- mini usefulness/usability bars on grid cards, wide cards and table rows
This commit is contained in:
opencode
2026-08-02 11:51:25 +02:00
parent 461eca9a0a
commit 0c27982098
14 changed files with 504 additions and 29 deletions
@@ -338,6 +338,20 @@ export type ListToolsParams = {
category?: string;
search?: string;
sort?: ListToolsSort;
/**
* Comma-separated tags; tool must include all of them
*/
tags?: string;
/**
* Comma-separated features; tool must include all of them
*/
features?: string;
/**
* Minimum average combined rating (0-5)
* @minimum 0
* @maximum 5
*/
minRating?: number;
};
export type ListToolsSort = typeof ListToolsSort[keyof typeof ListToolsSort];
+20
View File
@@ -73,6 +73,26 @@ paths:
schema:
type: string
enum: [newest, top_rated, most_reviewed, name_asc, name_desc, recently_updated]
- name: tags
in: query
required: false
description: Comma-separated tags; tool must include all of them
schema:
type: string
- name: features
in: query
required: false
description: Comma-separated features; tool must include all of them
schema:
type: string
- name: minRating
in: query
required: false
description: Minimum average combined rating (0-5)
schema:
type: number
minimum: 0
maximum: 5
responses:
"200":
description: List of tools
+9 -1
View File
@@ -32,10 +32,18 @@ export const GetVersionResponse = zod.object({
/**
* @summary List all tools
*/
export const listToolsQueryMinRatingMin = 0;
export const listToolsQueryMinRatingMax = 5;
export const ListToolsQueryParams = zod.object({
"category": zod.coerce.string().optional(),
"search": zod.coerce.string().optional(),
"sort": zod.enum(['newest', 'top_rated', 'most_reviewed', 'name_asc', 'name_desc', 'recently_updated']).optional()
"sort": zod.enum(['newest', 'top_rated', 'most_reviewed', 'name_asc', 'name_desc', 'recently_updated']).optional(),
"tags": zod.coerce.string().optional().describe('Comma-separated tags; tool must include all of them'),
"features": zod.coerce.string().optional().describe('Comma-separated features; tool must include all of them'),
"minRating": zod.coerce.number().min(listToolsQueryMinRatingMin).max(listToolsQueryMinRatingMax).optional().describe('Minimum average combined rating (0-5)')
})
export const ListToolsResponseItem = zod.object({
@@ -11,4 +11,18 @@ export type ListToolsParams = {
category?: string;
search?: string;
sort?: ListToolsSort;
/**
* Comma-separated tags; tool must include all of them
*/
tags?: string;
/**
* Comma-separated features; tool must include all of them
*/
features?: string;
/**
* Minimum average combined rating (0-5)
* @minimum 0
* @maximum 5
*/
minRating?: number;
};