Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 0 additions & 20 deletions apps/web/public/marketplace-sources.json

This file was deleted.

16 changes: 16 additions & 0 deletions apps/web/server/marketplace-sources.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,22 @@
"repo": "anthropics/claude-code",
"enabled": true,
"priority": 2
},
{
"name": "claude-code-workflows",
"description": "Production-ready workflow orchestration with 62 focused plugins, 84 specialized agents, and 42 tools - optimized for granular installation and minimal token usage",
"url": "https://raw.githubusercontent.com/wshobson/agents/main/.claude-plugin/marketplace.json",
"repo": "wshobson/agents",
"enabled": true,
"priority": 3
},
{
"name": "claude-code-templates",
"description": "Ready-to-use Claude Code templates organized by workflow",
"url": "https://raw.githubusercontent.com/davila7/claude-code-templates/main/.claude-plugin/marketplace.json",
"repo": "davila7/claude-code-templates",
"enabled": true,
"priority": 4
}
]
}
27 changes: 24 additions & 3 deletions apps/web/server/utils/marketplace-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,36 @@ export const pluginSchema = z.object({
export const marketplaceSchema = z.object({
$schema: z.string().optional(),
name: z.string(),
version: z.string(),
description: z.string(),
version: z.string().optional(),
description: z.string().optional(),
// Support marketplaces that nest version/description in metadata object
// (e.g., claude-code-workflows, claude-code-templates)
metadata: z.object({
version: z.string().optional(),
description: z.string().optional(),
}).optional(),
homepage: z.string().optional(),
repository: z.string().optional(),
owner: z.object({
name: z.string(),
email: z.string(),
email: z.string().optional(),
url: z.string().optional(),
}),
plugins: z.array(pluginSchema),
}).transform((data) => {
// Normalize version/description to always be defined strings
// Supports both root-level (Anthropic style) and metadata-nested (community style) formats
const version = data.version ?? data.metadata?.version ?? '0.0.0'
const description = data.description ?? data.metadata?.description ?? 'No description available'

// Remove redundant metadata field after extraction
const { metadata, ...rest } = data

return {
...rest,
version,
description,
}
})

export const marketplaceSourceSchema = z.object({
Expand Down