create-plugin
Skill3 starsChanged 36 days agoMITView on GitHub
Scaffold and ship a new DSH plugin in this monorepo — generator,
14 other projects use a version of this.
Adopted by
Most recently taken up by
- rzx007/openharness-tstheir own version, first seen Oct 22, 2026
- rzx007/Vykortheir own version, first seen Oct 22, 2026
- mistralai/mistral-vibetheir own version, first seen Oct 19, 2026
- ToolJet/ToolJettheir own version, first seen Oct 13, 2026
- garbageek/claude-pluginstheir own version, first seen Oct 13, 2026
- bitovi/ai-enablement-promptstheir own version, first seen Oct 9, 2026
Other versions14 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 14
- ToolJet/ToolJet★ 41ksame name
- rundeck/rundeck★ 6.4ksame name
- mistralai/mistral-vibe★ 5.3ksame name
- datavane/tis★ 1.4ksame name
- marcus/sidecar★ 1.1ksame name
- alexsmedile/hormozi-skills★ 208same name
- lbedner/aegis-stack★ 146same name
- bitovi/ai-enablement-prompts★ 121same name
- npow/oh-my-claude★ 4same name
- rzx007/openharness-ts★ 3same name
4 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- AGENTS.mdAGENTS.md
- leak-guardSkill
- qa-stand-runSkill
- release-pluginsSkill
- session-checkpointSkill
- shared-checkoutSkill
The file
We split this skill into the rules it gives an agent
2 rules. 0 are common, 0 are distinctive, and 2 are very specific to this project.
0
Common
Most of the 12 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 96
Read services per call, or declare hard inject.
- Very specific: line 116
Session journal events: Never write custom event types into the session journal: the reader rejects unknown types not marked ignorable, and …
“Common” is measured: kept by at least 6 in 10 of the 12 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Create a DSH plugin
This monorepo already enforces most of the contract through gates, and
docs/PLUGIN_GUIDELINES.md (RU) is the canonical narrative guide. This skill
is the operational path: what to run, in which order, and the traps the gates
do NOT catch. When this skill and PLUGIN_GUIDELINES disagree, check git history
and prefer the newer rule.
The fast path
- SPEC first, before code. One
SPEC.mdin the plugin root is the product contract (guidelines §8.2): what the plugin does, its config surface, its tool names, degradation behavior. Later design docs go todocs/specs/<topic>.md(kebab-case topic, no plugin name in the file name), working notes todocs/INVESTIGATE.md. Scaffold with the generator (it encodes the canonical metadata):
pnpm nx g @yadsh/dsh-plugin-generator:dsh-plugin <name> --client --description="..."<name>is kebab-case, with or without thedsh-prefix; the directory becomesplugins/dsh-<name>, the npm name@yadsh/dsh-<name>.--clientadds the browser entry (src/client/index.tsx→lib/client.js), the tsdown config with the ModuleLoader banner, andscripts/verify-client-bundle.mjs.- Fix what the generator does not do (see "After the generator").
- Build in dependency order, then run the plugin's own loop. In a fresh
checkout or worktree,
packages/*are not built and nx lies about it — seereferences/release-and-gates.md§Build order. - Verify like CI, commit as one feature. Commands in
references/release-and-gates.md; commit conventions at the end of this file.
After the generator — mandatory manual work
README.md: the scaffold printsdsh plugin --profile <profile> add ..., because the CLI rejects a baredsh plugin add— substitute the real profile and keep the flag in every install/remove command you add:- host-only plugin:
dsh plugin --profile <profile> add @yadsh/dsh-<name> - plugin with
dsh.client:dsh plugin --profile web add @yadsh/dsh-<name>
- host-only plugin:
dsh.clientis scaffolded as{ platform: "web" }only. Real plugins also declare (seeplugins/dsh-model-safety-gate/package.jsonas the reference):inject: harness client packages whose face the plugin's client code imports (e.g.@deepseek-ai/dsh-client-ui-plugin-managerfor a card on the Plugins panel,@deepseek-ai/dsh-client-ui-settingsfor theConfigFormtypes,@deepseek-ai/dsh-client-connection);external: packages that stay out of the bundle because the host page provides them (React,@deepseek-ai/dsh-client-ui-slots) — mirror the same ids intsdown.config.tsdeps.neverBundle.
compatibility.json: addrequiredHostFeatureswhen known (e.g.["tools/register"]for a tool plugin);nodemust equalengines.nodeverbatim — the hygiene gate compares the strings.scripts/verify-package.mjs: extend the scaffold with plugin-specific asserts (card contract, design tokens, no Node builtins in the client bundle). References:plugins/dsh-git-readonly(host-only),plugins/dsh-model-safety-gate(client card),plugins/dsh-qa-surface(host+client+typert). The thin wrapper overpackages/plugin-scripts/run-verify-package.mjsis the established shape — do not accept audit reports that call these wrappers "duplicates".- Config surface: Schemastery schema (user-facing contract, exported via the
Cordis
Configconvention) plus a resolve function that normalizes and clamps raw config, so tools never see optional fields or unsafe limits —plugins/dsh-git-readonly/src/config.tsis the pattern. JSDoc every field. - Tests: config resolution, the main scenario, dispose symmetry, degradation (guidelines §6.2). Keep test files under ~400 lines and split by domain — the repo has already paid down every monolith above that size.
- Version plan
.nx/version-plans/<topic>.md— required for ANY change of a publishable package, including the first release (format below). pnpm plugins:manifest— regenerates the rootplugins.json; the hygiene gate fails on drift.- Root
README.md(package table) anddocs/COMPATIBILITY.md(peer matrix) — new-plugin checklist items (guidelines §10.1).
Traps the gates do not catch
Full details with symptoms and fixes in the references. The short list, in order of how often they bite:
lib/staleness. typert and card-contract verifiers read the BUILTlib/. Stalelib/gives false green and false red; fresh checkout givesTS2307that local runs hide. Build before verify; on any new typert method rebuildlib/typesbefore typecheck. Seereferences/release-and-gates.md.- cordis service capture.
ctx.get("x")in a constructor returnsundefineduntil the provider fiber is ACTIVE — and stays dead forever. Read services per call, or declare hardinject. There is no optional inject form in this cordis version: optional dependency = per-callctx.get(...) as T | undefined. Seereferences/host-side.md. - Client bundle platform. The bundle loads in a sandboxed ModuleLoader:
any
require("process")/ Node builtin (including a transitiveyamlnode build) kills the whole plugin surface in the browser whilepnpm checkstays green and the host log stays empty. Check the transitive closure fromsrc/client/index.tsx, not justsrc/client/**. Seereferences/client-side.md. - Client
injectcontract. Readingctx.remote.<ns>or any client service without listing it in the face'sinjectthrowscannot get property … without inject, the loader entry dies, the plugin vanishes from the UI — and the host log is clean. Unit tests cannot catch this class; keep an honest smoke and verify on a live rig. Seereferences/client-side.md. - typert is stricter than tsconfig.
exactOptionalPropertyTypesapplies at build (generate-typert), sofield?: T+ conditional spread +Partial<>in DTOs all pass typecheck and fail build. Public members need explicit type annotations; DTO types must live in the package's ownsrc/. Seereferences/host-side.md. - Session journal events. Never write custom event types into the session
journal: the reader rejects unknown types not marked
ignorable, andSession.appendcannot set the marker — the journal becomes unreadable by any build without the plugin (this is why qa-surface and safety-gate moved provenance to their own stores). Seereferences/host-side.md. - Design tokens. An unknown
var(--dsw-…)silently invalidates the whole CSS declaration — invisible text, missing borders, no error anywhere. Use only token names that exist in the DSH theme; the known-dead list and the token-gate recipe are inreferences/client-side.md. - Leak rules (public repo, npm-published). Examples and fixtures use only
synthetic placeholders (
PROJ-123,jira.example.corp); a number is part of the identifier;lib/strings are model-visible and ship to npm; release notes must not reveal that something was removed. Grep marker classes before committing (AGENTS.md «No internal identifiers in public content»), and run the local leak scanner before releases if it is available.
Version plan (first release and every later change)
.nx/version-plans/<kebab-topic>.md:
---
"@yadsh/dsh-<name>": minor
---
One-paragraph changelog entry: what the user gets, neutral wording.Rules: the --- fence is mandatory (without it Nx silently ignores the file);
one plan per package, several plans merge into the highest bump; the plan is
what nx turns into the version bump and CHANGELOG entry — a missing plan means
your feature silently never appears in the changelog; uncommitted changes are
invisible to pnpm release:check (it reads commits); for dsh-qa-surface
plans, QaChangelog.tsx must gain a curated entry whose version: is exactly
the version those plans bump to, in the same change (AGENTS.md §QA surface
release notes owns the rule, the hygiene gate enforces it). Validate with
pnpm verify:packages.
Commit conventions
- One feature = ONE big
feat(dsh-<name>): …commit carrying code, tests, gate updates, README/SPEC, the version plan, and regeneratedplugins.json. Docs-only work is a separatedocs(dsh-<name>): …. Do not split code/tests/docs; do not use the!:breaking marker (bump via the plan, explain the break in the commit body). - There are no git hooks here: a green commit proves nothing by itself — run the gates before committing.
- Stage explicit paths only (
git add plugins/dsh-<name> …): the tree almost always carries someone else's uncommitted WIP, andgit add -Awill take it.
References
references/host-side.md— cordis semantics, config, tools, storage, subagents, typert/Remote, testing recipes.references/client-side.md— ModuleLoader bundle identity, platform limits, remote namespaces, slots, configuration cards on the Plugins panel, design tokens.references/release-and-gates.md— gates map, build order, pre-push command set, packaging/docs layout, release mechanics.- Canonical docs:
docs/PLUGIN_GUIDELINES.md,docs/VERIFICATION.md,AGENTS.md,docs/RELEASING.md.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

