Extending
Skills and custom commands
Turn a workflow you repeat into something you invoke by name — from a file, or shared across machines.
Two ways to make a repeated workflow into one thing you type.
Skills
A skill is a named bundle of instructions. It's matched to relevant tasks automatically, and you can also run it directly.
/skills what's available
/skills new ship scaffold a SKILL.md
/skills show ship
/skill:ship run it
/skill:ship v2.1 run it with an argumentSkills are discovered from .contextcode/skills/, and from .claude/skills/
and .agents/skills/ — so a repository already set up for another tool works
without changes. Skills stored in ContextStream sync across your machines and
to your team.
Every skill gets its own /skill:<name> shortcut in the palette.
Custom commands
A markdown file in .contextcode/commands/ becomes a slash command. Simpler
than a skill, and version-controlled with the project.
<!-- .contextcode/commands/security-review.md -->
Review the current diff against our conventions.
Focus on $ARGUMENTS.
Current branch: !`git branch --show-current`
Conventions: @docs/conventions.mdThat file creates /security-review. A custom command cannot reuse a built-in
name such as /review. Three substitutions are available:
| Syntax | What it does |
|---|---|
$ARGUMENTS | Whatever the caller typed after the command |
!`command` | Runs the shell command, inserts the output |
@path | Attaches that file |
They appear in the palette and complete exactly like built-in commands.
Skill or command?
| You want | Use |
|---|---|
| A prompt template, versioned with the repo | Custom command |
| Something matched to relevant work automatically | Skill |
| To share it across machines or with the team | Skill |
| Shell output or file contents inlined | Custom command |
If it doesn't work
A new command doesn't appear. The palette picks up files as they're
discovered — check the file is in .contextcode/commands/ and ends in .md.
A skill doesn't trigger on its own. Automatic matching works from the
skill's description and trigger phrases. Make those concrete, or run it
directly with /skill:<name>.
A custom command can't shadow a built-in. Deliberate — a custom /help
would hide the real one. Rename it.