Skip to content

build

Read root plugin.json, validate it, and write a spec-conformant vendor manifest for each vendor declared in extensions["org.cyberuni.universal-plugin"].vendors.

universal-plugin build [options]
FlagDescription
--vendor <id>Build only the named vendor
--dry-runPrint what would be written without writing
--verbosePrint field-by-field transformation decisions
--cleanDelete generated manifests before building
--root <path>Plugin root directory (default: current directory)
--format jsonOutput as JSON
--vendorOutput path
claude-code.claude-plugin/plugin.json
cursor.cursor-plugin/plugin.json
codex.codex-plugin/plugin.json
copilot-cliplugin.json (repo root)

For each vendor in extensions["org.cyberuni.universal-plugin"].vendors:

  1. Start with all canonical fields from root plugin.json
  2. Merge extensions["org.cyberuni.universal-plugin"].harnesses.<vendor> fields (vendor fields win on conflict)
  3. Drop component fields unsupported by the vendor (emits a warning)
  4. Translate hook event names to vendor casing
  5. Translate ${PLUGIN_ROOT} / ${PLUGIN_DATA} env vars
  6. Enforce required fields (fails build on missing)
  7. Write to the vendor output path

The build fails (exit 1) if:

  • name is missing
  • version or description is missing when targeting codex
  • root plugin.json does not exist at the plugin root
  • --vendor names a vendor not in extensions["org.cyberuni.universal-plugin"].vendors

Unrecognized vendor keys in extensions["org.cyberuni.universal-plugin"].harnesses emit a warning and are skipped.

Terminal window
# Build all declared vendors
universal-plugin build
# Build only Cursor
universal-plugin build --vendor cursor
# Preview without writing
universal-plugin build --dry-run --verbose
# Clean rebuild
universal-plugin build --clean