Building
Commands and skills
Ship slash commands and on-demand instructions as plain markdown files — no code.
Commands and skills are markdown files in your package. No code runs for them, and they need no permissions.
- A command is a shortcut the user types:
/research why is the build slow?expands into a full instruction for the agent. - A skill is a body of instructions (plus supporting files) an agent loads only when it needs it. The agent always sees the skill's name and one-line description; the full text costs context only when the agent decides to use it.
Commands — commands/<name>.md
---
description: Grounded, cited research — read the sources, and separate what was verified from what was inferred.
argument-hint: <question>
---
Send the question below to Librarian (research):
1. Search broadly first — the codebase, its docs and commit history, and external sources when relevant.
2. READ the sources that matter; never answer from a search snippet alone.
3. Return a structured answer with EXACT pointers: file:line, function names, URLs, commit hashes — whatever lets me verify without redoing the search.
4. Separate what was VERIFIED from what was inferred, and name the gaps that could not be closed.
Question: $ARGUMENTS
(infrastructure/plugins/oh-my-openagents/commands/research.md)
- The file name is the command.
commands/research.mdregisters/research. Names match^[a-z0-9][a-z0-9_-]{0,63}$. description(required) — shown in the command menu.argument-hint(optional) — the placeholder shown after the name, e.g.<question>.- The body (required, non-empty) is the template sent to the agent in place of what the user typed.
Placeholders
| In the template | Replaced with |
|---|---|
$ARGUMENTS |
everything the user typed after the command name |
$1 … $9 |
the 1st … 9th whitespace-separated word (empty if missing) |
If the template uses none of them and the user typed something after the command, it is appended to the end of the template as a new paragraph — a plain template still receives the user's words.
So /research why is the build slow? becomes the template above ending with
Question: why is the build slow?.
Which agents get them
Commands appear on every agent of the account; each agent's Access → Commands can narrow the list. Command
names are not prefixed with your plugin's slug — if two installed plugins both ship /research, the first one
wins, so pick distinctive names.
Skills — skills/<key>/skill.md
skills/
parallel-orchestration/
skill.md
references/
routing.md
verification.md
root-cause-analysis/
skill.md
skill.md (the file name's letter case doesn't matter; exactly one per folder):
---
name: Parallel Orchestration
description: "The full conductor protocol for leading the crew: decompose by category, delegate in parallel, integrate, and finish on evidence. Includes the routing table and the done-checklist."
---
# Parallel Orchestration
The full conductor protocol for leading the Oh My OpenAgents crew. Your always-on doctrine is the short version;
load this skill when you are about to conduct real, multi-part work and want the complete method, the routing
table, and the verification checklist.
…
2. **Decompose by category.** … The full table is in `references/routing.md`.
(infrastructure/plugins/oh-my-openagents/skills/parallel-orchestration/skill.md)
- The folder name is the skill's key (
^[a-z0-9][a-z0-9_-]{0,63}$). description(required) — what the agent reads to decide whether to load it. Write it as "when to use me".name(optional) — the display name; defaults to the key.- Supporting files — anything else in the folder, up to 100 files per skill, 256 KB each. Refer to them by
relative path in
skill.md.
How an agent uses a skill
Every turn, the agent's system prompt carries a Skills section listing each available skill's name and description. When the agent decides it needs one, it calls the built-in tools:
| Tool | Does |
|---|---|
use_skill(name) |
loads the skill's skill.md body into context and lists its supporting files |
list_skill_files(skill) |
lists the supporting files |
read_skill_file(skill, path) |
reads one supporting file |
This is progressive disclosure: a 40-line doctrine can point to a 300-line playbook that is only read when it
matters. Oh My OpenAgents does exactly that — its always-on doctrine (injected by middleware) ends with "load the
parallel-orchestration skill (use_skill) for the complete method".
Skills appear on every agent; Access → Skills can narrow them per agent. Like commands, skill names are not prefixed — first installed wins on a clash. The skill tools disappear from an agent that has no skills enabled.
Keys are shared across the package
Command names, skill keys and companion asset keys all live in one namespace per package: a command research
and a skill research in the same package refuse the publish.
Combining with code
Commands and skills are most powerful next to code:
- A command routes a goal to a specialist your plugin created (
/research→ Librarian). - Middleware adds a short always-on doctrine, and points to a skill for the long version.
- A lifecycle event keeps the agents those commands refer to alive.
See the Oh My OpenAgents walkthrough.