Files
awesome-opencode/data/schema.json
T
John SmithandClaude Opus 5.5 56fad94c34 feat(schema): add kind, topics, compat, npm and path; reject unknown fields and non-root repo URLs
Entries gain a fixed kind and 1-3 topics (replacing 374 one-off tags as the categorization axis), an OpenCode API compat field (required for plugins), and npm/path for packages and monorepo folders. repo must be a repository root; unknown fields such as install: or repository: are rejected. Cross-entry rules (one entry per repo+path, kind must fit the category, no placeholder owners or mojibake) live in scripts/utils/catalog.js, and validate.js now always loads the whole catalog and fails on unparseable YAML. Adds npm run fmt for canonical formatting and drops the unused glob dependency.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-17 13:00:22 -04:00

169 lines
5.2 KiB
JSON

{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://github.com/Heretek-AI/awesome-opencode/data/schema.json",
"title": "Awesome Opencode Entry",
"description": "Schema for validating YAML entries in the Heretek-AI/awesome-opencode list. Cross-entry rules (unique repos, kind per category, compat for plugins) live in scripts/utils/catalog.js.",
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 80,
"description": "Display name of the project or tool"
},
"repo": {
"type": "string",
"format": "uri",
"pattern": "^https://((github\\.com|gitlab\\.com|codeberg\\.org|gitee\\.com)/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+|github\\.com/[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+/discussions/[0-9]+|gist\\.github\\.com/[A-Za-z0-9_-]+/[0-9a-f]+)/?$",
"description": "Repository root URL (no /tree/ or /blob/ paths, no npm or marketing pages). Gists and GitHub discussions (for guides) are also accepted. Use `path` for a package inside a monorepo."
},
"path": {
"type": "string",
"pattern": "^(?!/)(?!.*\\.\\.)(?!.*/$)[A-Za-z0-9_.@/-]+$",
"description": "Subdirectory of `repo` that holds this entry, for monorepos (e.g. packages/my-plugin)"
},
"npm": {
"type": "string",
"pattern": "^(@[a-z0-9-~][a-z0-9-._~]*/)?[a-z0-9-~][a-z0-9-._~]*$",
"description": "npm package name, for entries installed from npm. Used for the V2 compatibility check and health checks."
},
"homepage": {
"type": "string",
"format": "uri",
"description": "Documentation URL if different from repository"
},
"tagline": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "Short punchy summary (shown in collapsed view)"
},
"description": {
"type": "string",
"minLength": 1,
"maxLength": 1500,
"description": "Full description of the project (shown when expanded)"
},
"kind": {
"type": "string",
"enum": [
"plugin",
"theme",
"agent",
"skill",
"mcp-server",
"client",
"tool",
"config",
"guide",
"fork"
],
"description": "What the entry is. plugin: OpenCode plugin package. theme: color theme. agent: agent/subagent configuration. skill: SKILL.md pack. mcp-server: Model Context Protocol server. client: GUI, TUI, web, mobile, editor or chat front-end for OpenCode. tool: CLI, proxy, library or other utility. config: starter config, commands or templates. guide: docs, tutorials or articles. fork: a modified build of OpenCode."
},
"also": {
"type": "array",
"items": {
"type": "string",
"enum": [
"plugin",
"theme",
"agent",
"skill",
"mcp-server",
"client",
"tool",
"config",
"guide",
"fork"
]
},
"uniqueItems": true,
"maxItems": 3,
"description": "Secondary kinds, e.g. a plugin that also ships an MCP server. Cross-listed in the README and site."
},
"topics": {
"type": "array",
"items": {
"type": "string",
"enum": [
"memory",
"context",
"orchestration",
"workflow",
"providers",
"cost",
"notifications",
"sessions",
"code-quality",
"security",
"git",
"remote",
"web",
"ui",
"voice",
"media",
"docs",
"environment",
"observability",
"integrations",
"code-intel",
"prompting",
"domain"
]
},
"minItems": 1,
"maxItems": 3,
"uniqueItems": true,
"description": "1-3 use-case topics from a fixed list. The first one is the primary topic used for README grouping."
},
"compat": {
"type": "string",
"enum": [
"v2",
"v1",
"n/a",
"unknown"
],
"description": "OpenCode API generation. v2: depends on @opencode/* (e.g. @opencode/plugin with Plugin.define). v1: legacy @opencode-ai/* only. n/a: does not use the plugin/SDK API. unknown: not yet verified. Required for plugins; CI verifies it."
},
"scope": {
"type": "array",
"items": {
"type": "string",
"enum": [
"global",
"project"
]
},
"minItems": 1,
"uniqueItems": true,
"description": "Installation scope: global (~/.config/opencode/) or project (.opencode/). Defaults to [global] if omitted."
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"description": "Free-form search keywords. Not rendered; use `topics` for categorization."
},
"min_version": {
"type": "string",
"pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+",
"description": "Minimum OpenCode version required (semver format, e.g. '2.0.0')"
},
"installation": {
"type": "string",
"description": "Detailed installation instructions in markdown format"
}
},
"required": [
"name",
"repo",
"tagline",
"description",
"kind",
"topics"
],
"additionalProperties": false
}