Files
nexu-io__open-design/docs/schemas/open-design.plugin.v1.json
Joey-nexu f1a0b60c6c chore: unify product name display to OpenDesign repo-wide (#6998)
* chore: unify product name display to OpenDesign repo-wide

Rename the user-facing product name from "Open Design" to "OpenDesign"
across documentation, web/desktop UI strings, i18n locales, prompts,
plugin/skill/design-system content, changelogs, and specs, matching the
landing-page rename already in flight.

Deliberately excluded so installed-app identity stays untouched:
- packages/release PRODUCT_NAME and everything derived from it
  (app bundle names, installer/registry identity, updater feeds)
- tools/pack, tools/release, apps/packaged, landing page (PR #6983)
- mocks/ recorded traces and LICENSE
- test fixtures and comments that encode real on-disk install paths
  (Open Design.app, Program Files\Open Design, AppData paths)

Validated with pnpm guard, pnpm typecheck, and targeted web/desktop/host
test runs over the renamed strings.

* fix(web): keep two-letter author monogram for CamelCase brand names

authorInitials split words on whitespace only, so the renamed single-token
author name "OpenDesign" produced a one-letter monogram. Treat lower-to-upper
CamelCase boundaries as word breaks so the avatar fallback stays "OD".

* fix(release): restore spaced Windows source artifact names in win.ps1

tools/pack still derives builder outputs from the unchanged PRODUCT_NAME
("Open Design"), so the asset script must look for the spaced filenames.
Matches the mac/mac-intel/linux asset scripts, which were already kept on
the original names.

---------

Co-authored-by: Joey <236967869+joeylee12629-star@users.noreply.github.com>
2026-08-18 07:09:45 +00:00

249 lines
9.1 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://open-design.ai/schemas/plugin.v1.json",
"title": "OpenDesign plugin manifest (v1)",
"description": "Schema for `open-design.json` sidecar files. Companion of `SKILL.md`; never duplicates skill body content. See docs/plugins-spec.md §5.",
"type": "object",
"required": ["specVersion", "name", "version"],
"additionalProperties": true,
"properties": {
"$schema": { "type": "string", "format": "uri" },
"specVersion": { "type": "string", "minLength": 1 },
"name": { "type": "string", "minLength": 1, "pattern": "^[a-z0-9][a-z0-9._-]*$" },
"title": { "type": "string", "minLength": 1 },
"title_i18n": { "$ref": "#/$defs/LocalizedText" },
"version": { "type": "string", "minLength": 1 },
"description": { "type": "string" },
"description_i18n": { "$ref": "#/$defs/LocalizedText" },
"author": {
"type": "object",
"properties": {
"name": { "type": "string" },
"url": { "type": "string", "format": "uri" }
},
"additionalProperties": true
},
"license": { "type": "string" },
"homepage": { "type": "string", "format": "uri" },
"icon": { "type": "string" },
"tags": { "type": "array", "items": { "type": "string" } },
"compat": {
"type": "object",
"properties": {
"agentSkills": { "type": "array", "items": { "$ref": "#/$defs/RefPath" } },
"claudePlugins": { "type": "array", "items": { "$ref": "#/$defs/RefPath" } }
},
"additionalProperties": true
},
"od": {
"type": "object",
"properties": {
"kind": { "type": "string", "enum": ["skill", "scenario", "atom", "bundle"] },
"taskKind": { "type": "string", "enum": ["new-generation", "code-migration", "figma-migration", "tune-collab"] },
"mode": { "type": "string" },
"platform": { "type": "string" },
"scenario": { "type": "string" },
"engineRequirements": {
"type": "object",
"properties": { "od": { "type": "string" } },
"additionalProperties": true
},
"preview": {
"type": "object",
"properties": {
"type": { "type": "string" },
"entry": { "type": "string" },
"poster": { "type": "string" },
"video": { "type": "string" },
"gif": { "type": "string" },
"motion": {
"type": "string",
"enum": ["scroll", "deck", "static"],
"description": "How the gallery should capture this HTML preview's hover clip: 'scroll' = vertical-scroll landing page (pan top->bottom), 'deck' = horizontal slideshow (walk slides), 'static' = single fixed screen (hold its in-place animation). Omit to auto-detect from the page's scroll height."
}
},
"additionalProperties": true
},
"useCase": {
"type": "object",
"properties": {
"query": {
"oneOf": [
{ "type": "string" },
{ "$ref": "#/$defs/LocalizedText" }
]
},
"exampleOutputs": {
"type": "array",
"items": {
"type": "object",
"required": ["path"],
"properties": {
"path": { "type": "string" },
"title": { "type": "string" }
},
"additionalProperties": true
}
}
},
"additionalProperties": true
},
"context": {
"type": "object",
"properties": {
"skills": { "type": "array", "items": { "$ref": "#/$defs/Reference" } },
"designSystem": {
"oneOf": [
{ "$ref": "#/$defs/Reference" },
{ "type": "object", "properties": { "ref": { "type": "string" }, "primary": { "type": "boolean" } }, "additionalProperties": true }
]
},
"craft": { "type": "array", "items": { "type": "string" } },
"assets": { "type": "array", "items": { "type": "string" } },
"claudePlugins": { "type": "array", "items": { "$ref": "#/$defs/Reference" } },
"mcp": { "type": "array", "items": { "$ref": "#/$defs/McpServerSpec" } },
"atoms": { "type": "array", "items": { "type": "string" } }
},
"additionalProperties": true
},
"pipeline": {
"type": "object",
"required": ["stages"],
"properties": {
"stages": {
"type": "array",
"items": {
"type": "object",
"required": ["id", "atoms"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"atoms": { "type": "array", "items": { "type": "string" } },
"repeat": { "type": "boolean" },
"until": { "type": "string" },
"onFailure": { "type": "string", "enum": ["abort", "skip", "retry"] }
},
"additionalProperties": true
}
}
},
"additionalProperties": true
},
"genui": {
"type": "object",
"properties": {
"surfaces": {
"type": "array",
"items": { "$ref": "#/$defs/GenUISurface" }
}
},
"additionalProperties": true
},
"connectors": {
"type": "object",
"properties": {
"required": { "type": "array", "items": { "$ref": "#/$defs/ConnectorRef" } },
"optional": { "type": "array", "items": { "$ref": "#/$defs/ConnectorRef" } }
},
"additionalProperties": true
},
"inputs": {
"type": "array",
"items": { "$ref": "#/$defs/InputField" }
},
"capabilities": { "type": "array", "items": { "type": "string" } }
},
"additionalProperties": true
}
},
"$defs": {
"RefPath": {
"type": "object",
"required": ["path"],
"properties": { "path": { "type": "string", "minLength": 1 } },
"additionalProperties": true
},
"LocalizedText": {
"type": "object",
"minProperties": 1,
"additionalProperties": { "type": "string" }
},
"Reference": {
"type": "object",
"properties": {
"ref": { "type": "string" },
"path": { "type": "string" }
},
"additionalProperties": true
},
"McpServerSpec": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string" },
"command": { "type": "string" },
"args": { "type": "array", "items": { "type": "string" } },
"env": { "type": "object", "additionalProperties": { "type": "string" } },
"url": { "type": "string" }
},
"additionalProperties": true
},
"GenUISurface": {
"type": "object",
"required": ["id", "kind", "persist"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"kind": { "type": "string", "enum": ["form", "choice", "confirmation", "oauth-prompt"] },
"persist": { "type": "string", "enum": ["run", "conversation", "project"] },
"trigger": {
"type": "object",
"properties": {
"stageId": { "type": "string" },
"atom": { "type": "string" }
},
"additionalProperties": true
},
"schema": { "type": "object" },
"prompt": { "type": "string" },
"capabilitiesRequired": { "type": "array", "items": { "type": "string" } },
"timeout": { "type": "integer", "minimum": 1 },
"onTimeout": { "type": "string", "enum": ["abort", "default", "skip"] },
"default": {},
"oauth": {
"type": "object",
"required": ["route"],
"properties": {
"route": { "type": "string", "enum": ["connector", "mcp", "plugin"] },
"connectorId": { "type": "string" },
"mcpServerId": { "type": "string" }
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"ConnectorRef": {
"type": "object",
"required": ["id"],
"properties": {
"id": { "type": "string" },
"tools": { "type": "array", "items": { "type": "string" } }
},
"additionalProperties": true
},
"InputField": {
"type": "object",
"required": ["name"],
"properties": {
"name": { "type": "string", "minLength": 1 },
"label": { "type": "string" },
"type": { "type": "string", "enum": ["string", "text", "select", "number", "boolean", "file"] },
"required": { "type": "boolean" },
"options": { "type": "array", "items": { "type": "string" } },
"placeholder": { "type": "string" },
"default": {}
},
"additionalProperties": true
}
}
}