The plugin’s eight skills are authored once, host-neutrally, and published as one Agent Skills package: canonical in wiki-plugin/skills/, copied verbatim to repo-root skills/ in the same PR as any canonical edit (scripts/sync-skills.sh), installed anywhere with npx skills add dhague/wiki-knowledge --all. Everything that cannot be expressed portably — the model: sonnet|haiku tier split on the three subagents, hooks/hooks.json, the bin/enchiridion shim and the marketplace install — stays in the Claude Code plugin, the only host surface that can carry it. The per-host installers are deleted rather than maintained alongside: the OpenCode npm deployer with its session-tracker and wiki() plugins, and the generated DSH profile bundle. The hosts read the same .agents/skills/ directory natively — the skills CLI installs OpenCode skills there, and DSH scans <projectRoot>/.agents/skills at rank 200 and ~/.agents/skills at rank 500 — so one install command covers both.
Four install surfaces were carrying four different subsets of the same eight skills: the Claude Code marketplace (8), the OpenCode npm deployer (6 — it dropped exactly wiki-lint and wiki-export), the generated DSH bundle (8 skills read in place, plus three agent-as-tool rows), and per-skill ZIPs for Joule (2). Each was hand-maintained, and the same skill text was being read by DSH and OpenCode from wiki-plugin/skills/ with Claude-Code-only prose intact — the ~/.claude/plugins/cache/... binary glob and the wiki(args=[...]) branches. Moving to the standard removes three mechanisms, and the skills’ own text becomes the one thing that must stay portable because it is now what every host reads.
wiki() tool, DSH kept deepseek-flash routing. Rejected: three mechanisms, three subsets, three places for the same skill text to drift, and the portable text has to be portable anyway for the package to exist.plugins CLI and the .plugin/ open-plugin format. It reads .claude-plugin/ manifests, so it would have cost zero new files, and it reaches Cursor, Codex, Grok Build, Kimi Code, Copilot CLI and VS Code. Rejected: its TARGET_DEFS has no OpenCode, no Gemini CLI, no DSH and no extension point (an unknown --target exits 1); it copies content byte-for-byte with no model handling at all; hooks are the Claude Code convention with ${*_PLUGIN_ROOT} rewritten and silently ignored elsewhere; it has no update, no remove, no lockfile and no ref pinning; the upstream repo 404s and the published tarball carries no licence. It remains available as a documented side door, because it does work from the manifest we already ship.cut-release so the installer cannot see it. Breaks Claude Code, which discovers skills only as <dir>/SKILL.md, and a @file mention is not skill activation. metadata: internal: true in the frontmatter is the installer’s own suppression mechanism and leaves every host’s discovery untouched; it must be a real YAML boolean, since the check is metadata?.internal === true and a quoted "true" is ignored silently.wiki() tool (skills run the per-skill bundle directly), the model-pinned agent copies, and session-tracker’s session-id tie-break evidence — save-session falls back to environment detection plus the host’s own transcript export. DSH loses the agent-as-tool rows and its deepseek-flash routing; its tool-call cost log was never ported (#534).generate-dsh-bundle.py already took, generalised. Claude Code keeps the tiers because its agent frontmatter is the one surface that can carry them.agentskills.io/specification). That includes wiki-conventions, the catalogue rather than a caller: iterating the tree is uniform, and a skill added later needs no list updated. The runtime is resolved the same way: node where it exists, bun where it does not — OpenCode guarantees only Bun, and requiring Node there is what the retired in-process wiki() tool existed to avoid. Git is content-addressed, so the repository stores one blob however many skills bundle it; the cost is roughly 24 MB per published tree in a checkout and in the release tarball.ts-enchiridion.yml runs on every PR and fails if repo-root skills/ diverges from wiki-plugin/skills/.tag-release.yml tags, creates the GitHub Release and builds the eight per-skill Joule ZIPs; it no longer sets up Python, assembles an OpenCode package or publishes.