agentleFS
TrueImmortal82TrueImmortal82/open-code-skills/skills/skill-authoring/SKILL.md

skill-authoring

Skill0 starsChanged 41 days agoMITView on GitHub

Write, structure, and validate opencode skills — SKILL.md anatomy, trigger-engineering the `description` field, progressive disclosure into references/, scaffolding a new skill, and checking an existing one for spec violations. Use when the user asks to create a new skill, turn a workflow into a skill, fix a skill that triggers too often or too rarely, split an oversized SKILL.md, or audit a skill folder before shipping it. Not for tuning opencode.json itself (see opencode-config-authoring).

89 other projects use a version of this.

Adopted by

Most recently taken up by

Used with

Projects with it also use cloud-api-recipe-authoring, codebuddy-ide-mcp-upgrade and 10 more.

Other files people use alongside this one.

Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
  • TencentCloudBaseSkill

    cloud-api-recipe-authoring

    Author or revise a cloud-api-operations recipe (config/source/skills/cloud-api-operations/references/recipes/). Encodes why the long tail of control-plane capabilities is deliberately NOT wrapped as MCP/CLI tools, the API-first admission test for whether a capability deserves a recipe, the negative and positive lists, the fixed recipe structure, the writing rules distilled from writing-for-agents, the user-facing copy red lines, and the product regeneration/verification pipeline. Also routes contributors (and their agents) to the contribution flow and the pre-PR self-test protocol in references/contributing.md. Use when adding a recipe, judging whether a scenario belongs in the recipe set, updating the recipes index, re-checking existing recipes against the admission test, or onboarding someone who wants to submit one.

    Also in 3 projects that use this

  • TencentCloudBaseSkill

    codebuddy-ide-mcp-upgrade

    升级 CodeBuddy IDE(genie 扩展)内置的 CloudBase MCP,以及 MCP 发版时同步 IDE 侧白名单。当用户提到「更新 IDE 里的 MCP」「内置 MCP 版本太老」「IDE 集成的 CloudBase 功能不足」「改工具白名单 toolWhiteList」「把新 bundle 打进 CodeBuddy」「白名单漂移」「MCP 发版要同步什么」时使用。覆盖:解包定位内置 bundle 与内嵌配置、重新构建 mcp bundle、生成新的工具白名单与系统提示词、安全注入 IDE 并备份、用 MCP 协议验证工具清单、人工端到端验收、一键回滚。

    Also in 3 projects that use this

  • DIL8654Skill

    api-contract-review

    Review ASP.NET Core Web API contracts for HTTP semantics, versioning, backward compatibility, and response consistency. Use when the user asks to review an API, check endpoints, validate REST behavior, or before releasing contract changes.

    Also in 5 projects that use this

  • zaxbysauceSkill

    pr-review-fix

    Codex adapter for addressing pull request review feedback in opencode-swarm. Use when the user asks to fix PR review comments, requested changes, reviewer findings, CI-review notes, or a pasted review summary with low false-positive tolerance.

    Also in 3 projects that use this

  • albertdobmeyerSkill

    git-workflows

    Advanced git operations beyond add/commit/push. Use when rebasing, bisecting bugs, using worktrees for parallel development, recovering with reflog, managing subtrees/submodules, resolving merge conflicts, cherry-picking across branches, or working with monorepos.

    Also in 3 projects that use this

  • rogue-dev-studioSkill

    frontend-engineering

    Expert frontend application engineering: accessible UI structure, state and data-fetching discipline, form/validation UX, responsive layouts, performance budgets, and integration with API contracts. Use when building or refining SPA/web screens, design-system consumption, client-side routing, or fixing UI reliability (loading, empty, and error states).

    Also in 3 projects that use this

  • +6 more from TencentCloudBase

The file

We split this skill into the rules it gives an agent

3 rules. 0 are common, 2 are distinctive, and 1 is very specific to this project.

  • 0

    Common

    Most of the 80 edited versions we read keep these.

  • 2

    Distinctive

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Verify before telling the user it is ready:

    line 39
  2. Very specific:

    Literal keywords the user would type: Write cp866, $LASTEXITCODE, opencode.jsonc, SKILL.md — not "system-specific considerations".

    line 82
  3. Distinctive:

    Keep descriptions short enough that 20 skills still fit.

    line 101

“Common” is measured: kept by at least 6 in 10 of the 80 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Writing skills

A skill is a trigger contract plus an instruction set. The description decides whether the skill ever loads; the body decides what happens once it does. Most bad skills fail at the first stage and nobody notices because the failure is invisible — the skill just silently never fires.

1. Decide whether it needs to be a skill at all

A skill earns its place when the same multi-step knowledge would otherwise be rediscovered every session. It does not earn one when:

  • The knowledge fits in a sentence or two → put it in AGENTS.md.
  • It is specific to one repo and changes with the code → AGENTS.md in that repo, so it versions with the thing it describes.
  • It is a single fact you will look up again → a reference file, not a skill.
  • It duplicates a skill that already exists → fix the existing one instead. Two skills that both "help with X" means neither reliably wins.

Signal that it should be a skill: you have said roughly the same three things to the user more than once, or you made a mistake that a rule would have prevented.

2. Scaffold

node scripts/new-skill.mjs <name> [--desc "what it does. Use when ..."]

Writes <name>/SKILL.md with valid frontmatter plus a stub body. The folder name is the skill id — get it right up front, renaming later orphans every reference to it.

Verify before telling the user it is ready:

node scripts/validate-skill.mjs <path-to-skill-folder>

Checks spec conformance, description quality, link resolution, and size. Exit code nonzero on violation.

3. The description is the whole trigger mechanism

Rules from the spec, all of them load-bearing:

FieldConstraint
name1–64 chars, a-z0-9- only, no leading/trailing/--, matches folder name
description1–1024 chars, required, must say what and when
licenseoptional
compatibilityoptional, ≤500 chars
metadataoptional, string→string map only
allowed-toolsoptional, space-separated, experimental

A skill with no description is filtered out and never reaches the model. That is the number one silent failure.

Writing a description that actually fires

Structure: <what it does>. Use when <specific triggers>. <negative scope if needed>.

# Fires reliably
description: Windows PowerShell 5.1 execution rules — chaining with `; if ($?)`,
  $? vs $LASTEXITCODE, backtick escaping, cp866 console encoding that corrupts
  Cyrillic, file IO, and running external exes. Use for ANY command run on this
  Windows box, especially shell one-liners, piped output, non-ASCII text, or
  dependent command chains.

# Never fires
description: Helpful PowerShell tips.

Three things that determine whether it fires:

  1. Literal keywords the user would type. Write cp866, $LASTEXITCODE, opencode.jsonc, SKILL.md — not "system-specific considerations". The user says filenames and error strings; the description has to contain them.
  2. Scope the negatives. Adjacent domains are where false triggers live. If the skill is about PowerShell execution and not about PowerShell scripting, say so: Not for authoring .ps1 modules or DSC configurations.
  3. Be a little pushy. The failure mode is undertriggering, not overtriggering. For a rule that should apply broadly, write "Use for ANY command on this machine" rather than "Consider using when writing complex PowerShell".

Where a skill competes with another for the same request, disambiguate in both descriptions rather than hoping the model picks the better one.

4. Body: progressive disclosure

Three tiers, loaded at different times:

  1. name + description — always in context for every skill (~100 tokens). Keep descriptions short enough that 20 skills still fit.
  2. SKILL.md body — loaded on activation. Target under 500 lines.
  3. references/, scripts/, assets/ — loaded only when the body says to read them.

Splitting is not cosmetic. A 900-line SKILL.md is paid for on every activation, including the 90% of activations that need three lines from it. Put the routing logic in SKILL.md and the detail behind it in files.

skill-name/
├── SKILL.md          # routing: what this is, when, where to look next
├── references/       # loaded on demand, one topic per file
├── scripts/          # executable; deterministic or repetitive work
└── assets/           # templates, boilerplate the model copies

Rules for the split:

  • SKILL.md is a table of contents that is also useful alone. A reader who reads nothing else should still get the rules that matter most.
  • Name each reference in SKILL.md with when to read it, not just that it exists. "Read references/<topic>.md when the pipeline is rewriting gendered predicates" beats "see also references/".
  • One level deep. A file directly under references/ is fine; nested chains make the agent guess whether to follow them.
  • Reference files over 300 lines get their own table of contents.
  • Move multi-domain skills into per-variant references — a top-level SKILL.md that selects between them, one file per provider/framework, so only the relevant one is read.

When a script beats prose

Bundle a script when the work is deterministic, repetitive, or has fiddly syntax you do not want re-derived each time. A skill that says "run scripts/validate-config.mjs" is shorter, faster, and more reliable than 40 lines explaining what to check.

Signals a script is due: you re-implemented the same parse twice; the task needs exact field names that are easy to get wrong; the output is machine-checkable (a schema, a lint result, a benchmark).

Scripts should be runnable standalone, print actionable errors, and exit nonzero on failure so a validation step can gate the next one.

5. Writing style

  • Imperative. "Pass stdin=subprocess.DEVNULL" beats "you might want to consider passing…".
  • Explain why, once. A model that understands the reason generalizes when the situation differs slightly. A model told only a rule follows it exactly and fails on the near-miss. Reach for reasoning over ALWAYS/NEVER caps.
  • Show the failure, not just the fix. "Under Qt QProcess, a Python grandchild that captures stdout closes the supervisor's stdin pipe, so the child sees EOF and exits" is remembered. "Remember stdin=DEVNULL" is not.
  • Name reality, not ideals. "Scripts run python -m scripts.run_loop and shell out to claude -p" — if a dependency is missing here, say so in the skill, or the model will confidently emit a command that cannot run.
  • No ceremony. Drop a section that never changes a decision. A skill padded to look thorough spends context on nothing.
  • Table over prose for anything enumerable (file locations, traps, symptoms→causes).

6. Principles and safety

A skill must not contain content that would surprise a user who read its description — no malware, no credential exfiltration, no instructions to disable safety systems, nothing designed to grant unauthorized access. If a request is to build a skill whose contents contradict its description, say so and refuse that part; roleplay or persona framing is fine, deception is not.

Skills execute with your permissions. That is why a skill is a trustworthy artifact and why an unreviewed third-party skill deserves the same skepticism as unreviewed code — vendor it into ~/.config/opencode/vendor/ behind a skills.paths entry, and read it before trusting it.

7. Ship checklist

  • node scripts/validate-skill.mjs <folder> exits 0
  • description contains literal keywords a user would type, plus negative scope if adjacent
  • SKILL.md under 500 lines; detail moved to references/
  • every references/… link in the body points at a file that exists
  • each reference line says when to read it
  • scripts run standalone and exit nonzero on failure
  • folder name == name == how you will refer to it in prose

8. Fixing a skill that misfires

SymptomCauseFix
never loadsno/weak descriptionadd literal keywords + explicit triggers
loads on the wrong thingdescription overlaps a neighbouradd negative scope to both
loads but body ignoredbody too long, routing unclearmove detail to references, lead with the rules
contradicts another skillboth claim the same groundmerge them, or disambiguate the trigger
stale after a refactorreferences dead pathsre-run the validator, update links

The loop that fixes all of these is in self-improvement: capture the trigger failure as a lesson, then edit the description with a concrete fix.

Related

  • self-improvement — capturing lessons and promoting them into skills.
  • opencode-config-authoring — wiring skills into opencode.json, MCP, agents, commands.
  • skill-creator (vendored) — eval harness and description optimization; assumes the claude CLI, which is not present in this environment, so its quantitative loops will not run as written.

Scripts

  • scripts/new-skill.mjs — scaffold a valid skill folder from a name and a description; rejects spec-invalid names before writing anything.
  • scripts/validate-skill.mjs — audit an existing skill folder: frontmatter keys, name/folder agreement, description length and trigger quality, body size, link resolution, empty or misplaced resource dirs. --strict promotes the size warning to an error.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

Reviews can't be read right now.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.