One scaffold.
Five agent harnesses.
Harness Alchemist generates one TypeScript plugin repository that installs natively into Claude Code, Codex/ChatGPT, OpenCode, Google Antigravity, and DeepSeek Harness — with skills that own their runtime and thin adapters for everything else.
$ npx harness-alchemist@latest create my-plugin \ --description "What the plugin does" \ --author "Example Team" --repository example/my-plugin Created universal plugin scaffold at ~/Workspace/my-plugin Next: cd my-plugin && npm install && npm run verify $ cd my-plugin && npm run verify ✔ OpenCode tool delegates to the shared skill script ✔ DeepSeek adapter delegates to the shared skill script ✔ Validated universal plugin scaffold · 19 files in payload
Install-tested, not just scaffolded
Every install path below was exercised against real CLIs before shipping in the template. Skills load natively where possible; OpenCode and DeepSeek mount the npm package as their runtime.
Claude Code native
Marketplace plugin with bundled skills.
claude plugin install my-plugin@my-plugins
Codex native
Marketplace snapshot, headless CLI install.
codex plugin add my-plugin@my-plugins
OpenCode npm
Plugin hook registers tools that spawn skill scripts.
"plugin": ["my-plugin"]
Antigravity native
Nested skill bundle validated by agy.
agy plugin install ./my-plugin
DeepSeek Harness cordis
Cordis service plugin mounted through cordis.patch.yml.
dsh plugin --profile web add my-plugin
Skills own the runtime
Product skills ship behavioral .mjs / .py twins under skills/<name>/scripts/.
The harness entrypoints are thin adapters that delegate to them — so your logic lives in one
portable place, not five SDKs.
// one JSON object in… const request = JSON.parse(stdin) // …one JSON result out stdout.write(JSON.stringify({ ok: true, plugin: "my-plugin", echo: request, })) // non-zero exit + stderr on failure
import { tool } from "@opencode-ai/plugin" tool({ description: "Run the shared-skill workflow", args: { input: schema.string() }, execute: async ({ input }) => runSkillScript("main.mjs", input), }) // src/deepseek.ts mirrors this as a // Cordis ctx.provide() service
- Agent Skills spec frontmatter enforced: name/dir match, description ≤1024 chars, compatibility ≤500 chars.
- SKILL.md references are resolved-checked — broken relative paths fail validation.
- Twin parity is mechanical: every
.pymust have its.mjssibling, and vice versa.
A validator with two tiers
npm run verify gates every change: TypeScript checks, tests, scaffold validation,
and an npm-payload audit. Python entrypoints get compiled and smoke-executed — without Python installed.
Agent Skills frontmatter compliance SKILL.md reference resolution .mjs / .py twin parity manifest cross-consistency (5 harnesses) npm payload audit
# optional pyodide devDependency await loadPyodide() // ast-compiles every Python entrypoint, // smoke-executes the tool contract, // asserts {"ok": true} on stdout — // all inside Node, zero native deps
- Ship releases by pushing a tag:
vX.Y.Ztriggers verify + publish with npm provenance in CI. - Creation never overwrites a non-empty destination; templates are versioned (
v0.1.0canonical). - Self-hosting: the CLI's own repository is generated by the same canonical template.