Agent skills
Everything on this site is also shipped as a skill — a
SKILL.md plus one markdown file per page — inside the CLI package. Installing
it puts the corpus where an agent looks for it.
| Command | What it does |
|---|---|
skill list [--json] | every bundled skill, and whether it is installed at project or global scope |
skill install [name] [--global] [--dir <path>] [--force] [--json] | copy one onto disk |
Omit name when the build bundles exactly one skill, which today it does.
Where it goes
| Scope | Path |
|---|---|
| project (default) | <cwd>/.claude/skills/<name>/ |
--global | ~/.claude/skills/<name>/ |
--dir <path> | <path>/.claude/skills/<name>/ |
--dir overrides --global. The layout is fixed — SKILL.md at the top,
reference/*.md beneath it — because that is what Claude Code reads.
It will not overwrite your edits
.claude/skills/ is a shared directory. Yours probably already holds
hand-written skills next to anything you install. So:
| Target | Behaviour | status | rc |
|---|---|---|---|
| absent | write it | installed | 0 |
| present, every file byte-identical | do nothing | exists | 0 |
| present, differs | refuse, list the differing paths, print the --force command | conflict | 1 |
present, differs, --force | overwrite only the files that differed | installed | 0 |
Nothing was written. The refusal is the feature: a skill you edited survives a mistyped install.
It never rm -rfs the target directory — it deletes nothing, ever, and
overwrites only files the bundle itself owns. It never touches
.claude/settings.json or settings.local.json, which sit beside skills/
and carry permissions. And it never assumes every entry under
.claude/skills/ is a directory — loose .md files there are left alone.
A file that is not part of the bundle but sits inside the skill directory —
your own NOTES.md, say — is reported and left untouched, by --force too.
--json
Both subcommands emit one object with a discriminated status and a required,
nullable nextAction. On failure, stdout still carries exactly one object and
stderr stays empty.
state is one of absent, identical, differs, or blocked (something
that is not a directory is in the way).
files is the list written by this run, so files: [] is the proof that
nothing happened.
The skill is generated, not written
skills/<name>/ is built from docs/pages/**/+Page.mdx by
docs/scripts/gen-llms.mjs. Editing it by hand is pointless — the next docs
build overwrites it. Change the page, then regenerate:
The same generator writes the other machine-readable surfaces of this site:
every page is fetchable as markdown at <page-url>.md, the index at
/llms.txt, and the whole corpus at /llms-full.txt.
If your install has no skill to install
A build that ships no skills/ directory says so and names the escape hatch:
DREAMLAKE_SKILLS_DIR also lets you install from a working copy of this
repository without publishing anything.