Overview
Agent Skills are reusable, file-based “playbooks” that you can share across projects or keep workspace-local. Shux follows the Agent Skills specification and exposes skills to models in two steps:- Index in the system prompt: Shux lists available skills (name + description).
- Tool-based loading: the agent calls tools to load a full skill when needed.
/<skill-name> slash command. For example:
/shux-docs suggest tool hooks for this project.
You can find a list of community-maintained, curated skills at skills.sh.
You can easily add those skills to your Shux instance with:
Where skills live
Shux discovers skills from these locations:- Project:
.mux/skills/<skill-name>/SKILL.md - Project (cross-tool):
.agents/skills/<skill-name>/SKILL.md - Global (Shux-specific):
~/.shux/skills/<skill-name>/SKILL.md - Universal (cross-tool):
~/.agents/skills/<skill-name>/SKILL.md - Built-in: shipped with Shux
.mux/skills wins over .agents/skills.
After project skills, the remaining precedence order is global (~/.shux/skills) > universal (~/.agents/skills) > built-in. Built-in skills behave like any other skill for precedence purposes, so any project or global skill with the same name overrides them.
Shux reads skills using the active workspace runtime. For SSH workspaces, skills are read from the
remote host.
Claude Code compatibility (experiment)
Many repositories already ship skills in Claude Code’s directories. Enable the Claude skills compatibility experiment (Settings → Experiments) to also discover skills from:- Workspace-local:
.claude/skills/<skill-name>/SKILL.md - Global:
~/.claude/skills/<skill-name>/SKILL.md
.mux/skills > .agents/skills > .claude/skills); a nearer directory still wins over a farther one. The global roots use the same convention order. Compat roots are read-only: Shux never writes or deletes skills in .claude directories. Skills that package Shux workflow scripts are not discovered from .claude roots.
Agent Plugins (experiment)
Enable the Agent Plugins experiment (Settings → Experiments) to also discover skills packaged in Agent Plugins 1.0.0 directories — a plugin is a directory with aplugin.json manifest plus an optional skills/ folder. Plugins are discovered from:
- Workspace-local:
.mux/plugins/<plugin>/and.agents/plugins/<plugin>/ - Global:
~/.shux/plugins/<plugin>/and~/.agents/plugins/<plugin>/
Skill layout
A skill is a directory named after the skill:^[a-z0-9]+(?:-[a-z0-9]+)*$ (1–64 chars).
SKILL.md format
SKILL.md must start with YAML frontmatter delimited by --- on its own line.
Shux enforces a 1MB maximum file size for SKILL.md.
Required fields:
name: must match the directory namedescription: short summary shown in Shux’s skills index
licensecompatibilitymetadata(string key/value map)disable-model-invocation(boolean) — set totrueto omit a skill from the system prompt index (see Unadvertised skills below). This spelling is shared with other agent tools such as Claude Code, so portable skills work unchanged.advertise(boolean) — Shux-specific equivalent:advertise: falsebehaves likedisable-model-invocation: true. If both are set, the opt-out wins.user-invocable(boolean) — set tofalseto hide a skill from user-facing invocation surfaces (see Controlling who invokes a skill).argument-hint(string) — short hint describing the arguments a skill expects (for example[issue-number]), shown next to the skill in invocation UIs (see Skill arguments).when_to_use(string) — extra model-facing guidance appended to the skill’s entry in the skills index. The kebab-case spellingwhen-to-useis also accepted; the underscore spelling wins if both are set.
allowed-tools).
Controlling who invokes a skill
Two frontmatter fields control a skill’s visibility in opposite directions:
Combining them makes a reference-only skill: it is neither indexed for the model nor user-invocable, and only loads when something explicitly calls
agent_skill_read({ name: "skill-name" }) — useful for shared fragments referenced by other skills or workflows.
Unadvertised skills
By default, Shux advertises skills by listing them in the system prompt’s<agent-skills> index.
Set disable-model-invocation: true (or the Shux-specific advertise: false) in the frontmatter to exclude a skill from that index. Unadvertised skills:
- Are not listed in the system prompt (reducing token overhead)
- Can still be invoked via
/{skill-name}slash command oragent_skill_read({ name: "skill-name" }) - Still appear in Shux’s UI lists (for example
/slash suggestions) and in ACP clients’ command lists - Are useful for: skills meant only for sub-agents, advanced users, or internal orchestration
Example: deep-review skill
The Shux repository includes an unadvertised deep-review skill that encourages aggressive use of sub-agents to produce excellent code reviews (correctness, tests, consistency, UX, performance). Invoke it with /deep-review when you want a thorough, parallelized review. This skill is defined in .mux/skills/deep-review/SKILL.md.
Skill arguments
Slash invocations can carry arguments after the skill name, for example/fix-issue 123 high. If the skill body contains placeholders, Shux substitutes them before the model sees the skill:
$ARGUMENTS— the full argument text (123 high)$1…$9— whitespace-tokenized positional arguments ($1is123); absent positions become empty strings
- Tokenization is simple whitespace splitting; there are no shell quoting rules.
- Placeholders are substituted everywhere in the body, including code blocks.
- Only a single digit is consumed:
$10means$1followed by a literal0. - If the body contains no placeholders, nothing changes: the arguments simply remain visible in your message (for example “Using skill deploy: 123”).
- Substitution applies only to slash invocations. Inline
$skill-namereferences and model-initiatedagent_skill_readloads receive the raw body.
argument-hint frontmatter field to document the expected arguments in invocation UIs.
Dynamic context injection (experiment)
Enable the Skill dynamic context injection experiment (Settings → Experiments) to let skills pull live command output into their instructions. When you invoke a skill, any line whose entire content is!`command` runs in the workspace, and the line is replaced with a fenced block containing the command’s output before the model sees the skill:
- Directives must occupy the whole line; mid-line
!`...`is ignored. - Directives run after argument substitution, so
!`git log $1`sees resolved arguments. - Commands run sequentially in the workspace directory, with a 10-second timeout and a 16KB output cap per command, and at most 10 directives per skill. A failing command injects its output plus an
[exit code N]note instead of aborting the invocation. - Directives run only when you invoke a skill (
/{skill-name}or a$skill-namereference). Skills the model loads viaagent_skill_readalways receive the raw body — the model cannot trigger command execution this way. - Enabling the experiment requires flipping the toggle in Settings yourself; remote experiment rollout can never switch it on.
Current limitations
- Slash command invocation supports only a single skill as the first token (for example
/{skill-name}or/{skill-name} ...). - Skill bodies may be truncated when injected to avoid accidental mega-prompts.
allowed-toolsis not enforced by Shux (it is tolerated in frontmatter, but ignored).
Further reading
- Agent Skills overview
- What are skills? (progressive disclosure)
- Agent Skills specification
- Integrate skills into your agent (tool-based vs filesystem-based)
- Example skills (GitHub)
- skills-ref validation library (GitHub)