Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ export const dict: Record<string, string> = {
"tui.skill.loop.description": "Schedule a prompt to run on a recurring interval",
"tui.skill.html-to-video-pipeline.description": "Short-video magic — make short videos with HTML",
"tui.skill.arxiv.description": "Search, cite, download, and track arXiv papers",
"tui.skill.skill-creator.description": "Create, review, and improve agent skills",

// Language switching
"tui.command.language.switch.title": "Switch language",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,7 @@ export const dict = {
"tui.skill.loop.description": "Programar un prompt para ejecutarse en un intervalo recurrente",
"tui.skill.html-to-video-pipeline.description": "El arma definitiva para vídeos cortos — crea vídeos cortos con HTML",
"tui.skill.arxiv.description": "Busca, cita, descarga y sigue artículos de arXiv",
"tui.skill.skill-creator.description": "Crea, revisa y mejora skills de agente",

// Language switching
"tui.command.language.switch.title": "Cambiar idioma",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,7 @@ export const dict = {
"tui.skill.loop.description": "Planifier l'exécution récurrente d'un prompt",
"tui.skill.html-to-video-pipeline.description": "L'arme ultime pour vidéos courtes — créez des vidéos courtes avec du HTML",
"tui.skill.arxiv.description": "Rechercher, citer, télécharger et suivre des articles arXiv",
"tui.skill.skill-creator.description": "Créer, réviser et améliorer des skills d'agent",

// Language switching
"tui.command.language.switch.title": "Changer de langue",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ export const dict = {
"tui.skill.loop.description": "プロンプトを一定間隔で繰り返し実行するようスケジュール",
"tui.skill.html-to-video-pipeline.description": "ショート動画の神ツール - HTML でショート動画を制作",
"tui.skill.arxiv.description": "arXiv 論文の検索・引用・ダウンロード・追跡",
"tui.skill.skill-creator.description": "エージェントスキルの作成・レビュー・改善",

// Language switching
"tui.command.language.switch.title": "言語を切り替え",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,7 @@ export const dict = {
"tui.skill.loop.description": "Запланировать запуск промпта с периодичностью",
"tui.skill.html-to-video-pipeline.description": "Магический инструмент для коротких видео — создавайте короткие видео с помощью HTML",
"tui.skill.arxiv.description": "Поиск, цитирование, загрузка и отслеживание статей arXiv",
"tui.skill.skill-creator.description": "Создание, проверка и улучшение skills агента",

// Language switching
"tui.command.language.switch.title": "Сменить язык",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/skill.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const BUILTIN = new Set([
"loop",
"html-to-video-pipeline",
"arxiv",
"skill-creator",
])

export function skillDescription(
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/zh.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ export const dict = {
"tui.skill.loop.description": "按固定周期循环运行提示词",
"tui.skill.html-to-video-pipeline.description": "短视频神器 - 利用 HTML 制作短视频",
"tui.skill.arxiv.description": "搜索、引用、下载与追踪 arXiv 论文",
"tui.skill.skill-creator.description": "创建、审查与改进 Agent 技能",

// Language switching
"tui.command.language.switch.title": "切换语言",
Expand Down
1 change: 1 addition & 0 deletions packages/opencode/src/cli/cmd/tui/i18n/zht.ts
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,7 @@ export const dict = {
"tui.skill.loop.description": "依固定週期循環執行提示詞",
"tui.skill.html-to-video-pipeline.description": "短影片神器 - 利用 HTML 製作短影片",
"tui.skill.arxiv.description": "搜尋、引用、下載與追蹤 arXiv 論文",
"tui.skill.skill-creator.description": "建立、審查與改進 Agent 技能",

// Language switching
"tui.command.language.switch.title": "切換語言",
Expand Down
148 changes: 148 additions & 0 deletions packages/opencode/src/skill/builtin/.bundle/skill-creator/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
---
name: skill-creator
description: "Interactive guide for creating, reviewing, and improving agent skills (SKILL.md folders). Use when the user wants to build a new skill ('create a skill', 'make a skill for X', 'write a SKILL.md', 'turn this workflow into a skill'), review or improve an existing skill, fix a skill that never triggers or triggers too often, or validate a skill folder before sharing it. Do NOT use for general prompt writing, MCP server development, or editing arbitrary markdown files."
version: 1.0.0
license: MIT
platforms: [linux, macos, windows]
---

# Skill Creator

A skill is a folder that teaches an agent how to handle a specific task or workflow:

```
your-skill-name/
├── SKILL.md # Required — YAML frontmatter + Markdown instructions
├── scripts/ # Optional — executable code (Python, Bash, ...)
├── references/ # Optional — docs loaded only when needed
└── assets/ # Optional — templates, fonts, icons used in output
```

Skills rely on **progressive disclosure**: the frontmatter is always in context (so it decides *when* the skill loads), the SKILL.md body loads when relevant, and linked files load only on demand. Keep each level as small as it can be.

## Workflow: Creating a New Skill

### Step 1: Define 2-3 concrete use cases

Before writing anything, pin down with the user:

- What does the user want to accomplish? (outcome, not feature)
- What triggers it? Collect literal phrases users would say.
- What steps does the workflow require, in order?
- Which tools are needed (built-in, scripts, MCP servers)?
- What domain knowledge or best practices must be embedded?

Write each use case as: **Trigger → Steps → Result**. If the user is vague, propose use cases and confirm rather than guessing silently.

Identify the category — it shapes the structure:

1. **Document & asset creation** — embed style guides, templates, quality checklists.
2. **Workflow automation** — step-by-step process with validation gates.
3. **MCP enhancement** — orchestrate MCP tool calls in sequence with domain expertise.

### Step 2: Plan the folder structure

- Folder name: kebab-case only (`my-skill` — no spaces, capitals, or underscores) and it should match the frontmatter `name`.
- `SKILL.md` must be named exactly that, case-sensitive.
- Never put a `README.md` inside the skill folder.
- Keep SKILL.md under ~5,000 words; move detail to `references/` and link to it.
- For critical validations, prefer a bundled script over prose — code is deterministic, language interpretation isn't.

### Step 3: Write the frontmatter

The frontmatter is the single most important part — it alone decides whether the skill ever loads.

```yaml
---
name: your-skill-name
description: [What it does] + [When to use it, with literal trigger phrases] + [negative triggers if needed]
---
```

Rules (hard requirements):

- `description` MUST state both WHAT the skill does and WHEN to use it, under 1024 characters.
- Include specific phrases users would actually say, and file types if relevant.
- No XML angle brackets anywhere in frontmatter (it is injected into the system prompt).
- `name` must not use reserved prefixes ("claude", "anthropic").

Weak: `description: Helps with projects.`
Strong: `description: Manages Linear sprint workflows including planning, task creation, and status tracking. Use when the user mentions "sprint", "Linear tasks", or asks to "create tickets".`

For all optional fields (`license`, `compatibility`, `metadata`, `allowed-tools`) and more good/bad examples, read `references/frontmatter.md`.

### Step 4: Write the instructions

Recommended body structure:

```markdown
# Skill Name

## Instructions
### Step 1: [First major step]
Exact commands / tool calls, with expected output described.

## Examples
User says X → actions → result.

## Troubleshooting
Error → cause → fix.
```

Best practices:

- Be specific and actionable: give exact commands with flags and expected output, not vibes ("validate the data").
- Put critical instructions at the top; use `## Important` headers for must-not-skip rules.
- Include error handling for the failures users will actually hit.
- Reference bundled resources explicitly ("Before writing queries, read the API-patterns file in references/").
- Number steps that must happen in order; state data dependencies between steps.

For proven structural patterns (sequential orchestration, multi-MCP coordination, iterative refinement, context-aware tool selection, domain-specific intelligence), read `references/patterns.md`.

### Step 5: Validate

Run the bundled validator on the skill folder:

```bash
python scripts/validate_skill.py /path/to/your-skill-name
```

It checks naming, frontmatter format and length, forbidden content, missing linked files, and body size. Fix every ERROR; treat WARNINGs as review prompts. Expected output on success: `PASS` with 0 errors.

### Step 6: Test and iterate

Iterate on a single challenging task until it succeeds, then extract the winning approach into the skill — this gives faster signal than broad testing. Then cover:

1. **Triggering**: obvious phrasing loads it, paraphrases load it, unrelated queries don't.
2. **Function**: outputs correct, tool calls succeed, edge cases handled.
3. **Baseline comparison**: fewer corrections / tool calls / tokens than without the skill.

Debugging trick: ask the agent "When would you use the [name] skill?" — it will paraphrase the description back; fix what's missing.

Full test-case templates and iteration signals are in `references/testing.md`.

## Workflow: Reviewing an Existing Skill

When asked to review or improve a skill:

1. Read its SKILL.md and run `python scripts/validate_skill.py <folder>`.
2. Diagnose against the common failure modes:
- **Never triggers** → description too generic or missing user-facing trigger phrases. Rewrite with literal phrases and keywords.
- **Triggers too often** → add negative triggers ("Do NOT use for...") and narrow the scope.
- **Loads but instructions ignored** → instructions too verbose, buried, or ambiguous. Move critical rules to the top, replace prose validations with a script.
- **Slow / degraded responses** → SKILL.md too large; move detail into `references/`.
3. Propose concrete edits (before/after for the description), not general advice.
4. If the user brings failure examples from real sessions, encode the fix as an explicit instruction or troubleshooting entry — that is the highest-value iteration loop.

## Quick Checklist

Before delivering a skill, verify:

- [ ] Folder is kebab-case and matches frontmatter `name`
- [ ] `SKILL.md` exact filename; no `README.md` inside the folder
- [ ] Frontmatter has `---` delimiters, `name`, and a WHAT+WHEN `description` under 1024 chars
- [ ] No XML angle brackets in frontmatter
- [ ] Instructions specific and actionable, with examples and error handling
- [ ] Every referenced `scripts/`, `references/`, `assets/` file actually exists
- [ ] `validate_skill.py` passes with 0 errors
- [ ] Triggering tested: fires on target phrasings, silent on unrelated ones
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# YAML Frontmatter Reference

The frontmatter is always loaded into the agent's system prompt. It is the first level of progressive disclosure and the only thing the agent sees when deciding whether to load the skill.

## Required fields

```yaml
---
name: skill-name-in-kebab-case
description: What it does and when to use it. Include specific trigger phrases.
---
```

### name

- kebab-case only: `notion-project-setup` — no spaces, underscores, or capitals
- Should match the folder name
- Reserved: names containing "claude" or "anthropic" are rejected

### description

- MUST include both WHAT the skill does and WHEN to use it (trigger conditions)
- Under 1024 characters
- No XML angle brackets
- Include specific tasks/phrases users might say; mention file types if relevant

Structure: `[What it does] + [When to use it] + [Key capabilities / negative triggers]`

## Optional fields

```yaml
license: MIT # for open-source skills
compatibility: Requires network access and Python 3.10+ # 1-500 chars, environment requirements
allowed-tools: "Bash(python:*) Bash(npm:*) WebFetch" # restrict tool access
metadata: # any custom key-value pairs
author: Company Name
version: 1.0.0
mcp-server: server-name
category: productivity
tags: [project-management, automation]
```

## Security restrictions

Frontmatter is injected into the system prompt, so:

- No XML angle brackets anywhere
- Safe-YAML parsing only — no code execution
- No "claude"/"anthropic" in the name (reserved)

## Description examples

### Good

```yaml
# Specific and actionable
description: Analyzes Figma design files and generates developer handoff
documentation. Use when user uploads .fig files, asks for "design specs",
"component documentation", or "design-to-code handoff".

# Includes trigger phrases
description: Manages Linear project workflows including sprint planning, task
creation, and status tracking. Use when user mentions "sprint", "Linear
tasks", "project planning", or asks to "create tickets".

# Clear value proposition + scope
description: End-to-end customer onboarding workflow for PayFlow. Handles
account creation, payment setup, and subscription management. Use when user
says "onboard new customer", "set up subscription", or "create PayFlow
account".
```

### Bad

```yaml
# Too vague — will never trigger reliably
description: Helps with projects.

# Missing triggers — the agent can't tell when to load it
description: Creates sophisticated multi-page documentation systems.

# Too technical, no user-facing phrases
description: Implements the Project entity model with hierarchical relationships.
```

### Controlling over-triggering

```yaml
# Negative triggers
description: Advanced data analysis for CSV files. Use for statistical
modeling, regression, clustering. Do NOT use for simple data exploration
(use data-viz skill instead).

# Scope clarification
description: PayFlow payment processing for e-commerce. Use specifically for
online payment workflows, not for general financial queries.
```
Loading
Loading