π¦ Skills¶
Skills are reusable instruction packs β the difference between βgeneric coding botβ and βknows how we shipβ. β¨
Mental model π§ ¶
bundled skills + project overrides + learned skills
ββββββββββββΊ matched into TaskPacks π¦
| Kind | Where | Who writes it |
|---|---|---|
| π¦ Bundled | shipped with SLMCode | maintainers |
| π Project | .slmcode/skills/ | you |
| π¦ Learned | .slmcode/skills/learned/ | the flywheel |
Index file: .slmcode/SKILLS.md (auto-maintained β donβt micro-manage unless you must).
SKILL.md shape 𧬶
---
name: atomic-coding
description: Prefer tiny diffs, clear acceptance checks
triggers: refactor, cleanup, helper
agents: worker, deep, corrector
paths: "**/*.go, cmd/**"
user-invocable: true
---
# Atomic coding
- One concern per task
- Touch only listed files unless discovery proves otherwise
- Leave tests greener than you found them
| Field | Meaning |
|---|---|
name | Stable id (@skill:name) |
description | Human + matcher hint |
triggers | Keywords that boost matching |
agents | Which specialists see it (* = all) |
paths | Gate the skill on the files a run actually touches (see below) |
user-invocable | Can users pin / reference it? |
paths: β gating a skill on the files in scope π―¶
Context is the scarcest resource a small model has, and a Go-specific skill in a TypeScript task's prompt is pure noise. paths: is a comma-separated list of globs supporting *, ?, [β¦], ** and a bare directory prefix:
| Situation | Result |
|---|---|
skill has no paths: | ungated β participates exactly as before |
skill has paths:, and at least one file in scope matches | participates |
skill has paths:, and nothing in scope matches | left out of the prompt |
| the scope is empty / unknown | gating is disabled; the skill participates |
That last row matters: slmcode skills list, Studio's skills page and any caller that does not yet know which files a run will touch pass an empty scope, so a gated skill is never hidden from you β it is only kept out of prompts where it could not apply.
An explicit @skill:name in the query, or a pinned_skills entry in config, always wins: you naming a skill outranks a heuristic about file extensions.
Day-to-day commands π οΈ¶
slmcode skills # list
slmcode skills show atomic-coding
slmcode skills new my-skill --agents worker
slmcode skills edit my-skill # project override
Pin or reference π¶
slmcode run --skill atomic-coding "Refactor helpers"
slmcode run "Fix login @skill:multipass-quality"
Studio β Skills panel has pin chips. Config:
Bundled starters (taste) πΏ¶
| Skill | Vibes |
|---|---|
atomic-coding | Tiny diffs, clear done β |
multipass-quality | Think β critique β refine π |
markdown-memory | Treat CONTEXT/MEMORY as sacred πΎ |
engine-full-pipeline | Full orchestrated run behavior π |
specialist-* | Role-specific playbooks π§© |
Exact set evolves β slmcode skills is truth. Docs can lie; the CLI rarely does.
Teaching the flywheel π¦¶
After good runs, check:
Promote hard-won lessons into a project skill when they stop being optional.
π§Ή Skill hygiene
Prefer sharp constraints over motivational posters. Your workers are interns with amnesia β write the checklist.
Related π¶
- π§© Agents β who consumes skills
- π§ Concepts β flywheel
- βοΈ Config β
pinned_skills,skills_dirs
βοΈ Made with β₯ by UnicoLab