README.md

August 24, 2026 · View on GitHub

Harness Alchemist logo

The universal scaffold for coding-agent plugins. One repository, five harnesses, skills that own their runtime.

Npm package for Harness Alchemist License: MIT CI status for Harness Alchemist

Follow @haochuanzero on X for updates · Start from the one-page tour.


Harness Alchemist scaffolds one TypeScript plugin repository that installs natively into Claude Code, Codex/ChatGPT, OpenCode, Google Antigravity, and DeepSeek Harness/Cordis. Product skills ship behavioral .mjs/.py script twins; every harness entrypoint is a thin adapter that delegates to them.

Install

npm install -g harness-alchemist
# or run it without installing:
npx harness-alchemist@latest create my-plugin --help

Requires Node.js 22.20+ (Bun 1.2+ also supported). Zero runtime dependencies.

Quick start

npx harness-alchemist@latest create my-plugin \
  --description "What the plugin does" \
  --author "Example Team" \
  --repository example/my-plugin

cd my-plugin && npm install && npm run verify

Creation only writes to a missing or empty destination. The generated project passes its own gate out of the box: TypeScript checks, runtime delegation tests, scaffold validation, and an npm-payload audit.

Existing monorepos and SDK packages

validate also supports an adapted plugin package inside an existing repository. Add alchemy.json at the repository root:

{
  "$schema": "https://unpkg.com/harness-alchemist/alchemy.schema.json",
  "pluginRoot": "packages/my-sdk",
  "opencodeExport": "./server"
}

The manifest is JSON-Schema-validated; the schema ships in the npm package and is referenced through $schema, so editors autocomplete and check every field.

pluginRoot contains the canonical plugin manifests, shared skills, Cordis patch, adapter sources, and publishable package metadata. Repository marketplace manifests remain at the project root and point at that package directory. opencodeExport: "./server" preserves an SDK at the package root while exposing the OpenCode adapter through the modern server entrypoint. Omitting the file retains the strict generated single-package layout.

The optional runtime field selects what the adapted package must contain:

  • "npm" (default) — the full generated contract: npm metadata, OpenCode and Cordis adapters, Cordis patch, and .mjs/.py script twins.
  • "skills" — skills and harness manifests only. No npm package, adapters, or Cordis patch are required, and single-language scripts are allowed, so Python, Go, Rust, Java, C#, or Swift repositories can expose their workflows to Claude Code, Codex, Antigravity, and DeepSeek's filesystem skill roots without adopting a JavaScript runtime.

Generated projects include a alchemy.json manifest recording their runtime, canonical template version, generator, generatorVersion, and createdAt; npm run sync keeps generatorVersion aligned with the package version.

What you get

SurfacePurpose
skills/<name>/Agent Skills spec skill with .mjs/.py script twins under scripts/ and a tool-contract reference
src/opencode.tsOpenCode plugin registering tools that spawn the skill scripts
src/deepseek.ts + cordis.patch.ymlCordis function plugin providing a service over the same scripts
.claude-plugin/, .codex-plugin/, .agents/plugins/, plugin.jsonNative manifests for Claude Code, Codex, and Antigravity marketplaces
.agents/skills/develop-<name>/Repository-maintenance skill so agents can develop the project recursively
.github/workflows/CI plus tag-triggered publish (vX.Y.Z → verify → npm provenance)

Supported harnesses

Install paths below are verified against real CLIs before shipping in the template.

HarnessSkillsRuntimeInstall
Claude Codebundled nativelyclaude plugin install <name>@<marketplace>
Codex/ChatGPTbundled nativelycodex plugin add <name>@<marketplace>
OpenCodevia ~/.agents/skills/npm package hooks"plugin": ["<package>"] in opencode.json
Google Antigravitynested bundleagy plugin validate . && agy plugin install .
DeepSeek Harnessprofile filesystem rootsCordis service plugindsh plugin --profile demo add <package-or-path>

Skill script contract

Product skills own their logic; adapters never do.

echo '{"request": "hello"}' | node skills/<name>/scripts/main.mjs
# {"ok":true,"plugin":"my-plugin","echo":{"request":"hello"}}
  • One JSON object on stdin, one JSON result plus newline on stdout.
  • Non-zero exit with a stderr diagnostic on failure.
  • scripts/main.py is a stdlib-only behavioral twin of scripts/main.mjs.

Install-level verification

install-check drives your local harness CLIs against the project and asserts each one can discover the plugin — the same checks a user's install would perform, automated and cleaned up afterwards:

npx harness-alchemist@latest install-check /path/to/project
npx harness-alchemist@latest install-check . --harness agy --json
HarnessVerified byIsolation
Claude Codemarketplace add → install → plugin details skill inventoryuser scope, auto-removed
Codexmarketplace add → plugin add → plugin list enabledplugin cache, auto-removed
Antigravityplugin validate → install → plugin liststaged, auto-uninstalled
OpenCodeskills discovery via debug skill + plugin startuptemp XDG_CONFIG_HOME
DeepSeekCordis bundle composed into profile (--dump-config)temp DSH_HOME

Claude, Codex, and Antigravity run in both runtimes; the OpenCode plugin leg and the DeepSeek Cordis check require npm mode with built adapters (npm run build first). Missing CLIs are reported as skipped, not failures.

Validation tiers

npm run validate always enforces Agent Skills frontmatter compliance, SKILL.md reference resolution, and twin parity. With the optional pyodide devDependency installed, Python entrypoints are additionally compiled and smoke-executed inside a WebAssembly CPython sandbox — no native Python required.

Release automation

# bump package.json version, then:
npm run sync && npm run verify && git commit -am "Release vX.Y.Z" && git push
git tag vX.Y.Z && git push origin vX.Y.Z   # publishes automatically

License

MIT