File size: 2,476 Bytes
51e0a42
 
4fa5831
 
51e0a42
 
4fa5831
51e0a42
4fa5831
 
 
 
 
 
 
51e0a42
 
4fa5831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
---
title: Skill Forge
emoji: 🛠️
colorFrom: indigo
colorTo: purple
sdk: static
app_file: index.html
pinned: false
license: mit
short_description: Validate, lint & scaffold Agent Skills in-browser
tags:
- agents
- skills
- developer-tools
- mcp
---

# 🛠️ Skill Forge

Author better **Agent Skills**. A `SKILL.md` is a YAML frontmatter block plus a
Markdown body; the `description` is how an agent decides *when* to use the skill,
and a weak one means it silently never fires. Skill Forge catches that before you
ship — and runs **entirely client-side**, so nothing you paste leaves the page.

Rides the current wave of skill-centric agents — e.g.
[*Repo-To-Skill: Distilling GitHub Repositories Into AI4AI Skills*](https://huggingface.co/papers/2609.02749)
(a 5,000-skill library lifting an ML-research agent +134% on MLE-bench) — by
making the authoring loop fast and checkable.

## What it does

| Tab | Use |
|---|---|
| **Validate** | Parse `SKILL.md`; flag broken frontmatter, non-kebab `name`, over-long or trigger-less `description`, empty/unstructured body, absolute bundled-file links. |
| **Lint description** | Score the `description` 0–100 for trigger reliability: length band, explicit "use when", action verbs, concrete examples, third-person phrasing. |
| **Scaffold** | Generate a valid starter `SKILL.md` from a name + description + trigger, then validate it. |

## Files

| File | |
|---|---|
| [`index.html`](index.html) + [`skillforge.js`](skillforge.js) | the static app (js-yaml from CDN) |
| [`skillforge.py`](skillforge.py) | same logic in Python — `validate_skill`, `lint_description`, `scaffold_skill`, `package_skill` |
| [`app.py`](app.py) | Gradio UI **+ MCP server** (`skill_validate`, `skill_lint_description`, `skill_scaffold`) for running locally / on a PRO Space |
| `test_skillforge.py`, `test_skillforge.mjs` | self-checks for both ports |

### Run the MCP server locally

```bash
pip install -r requirements.txt
python app.py        # UI on :7860, MCP at /gradio_api/mcp/sse
```

```json
{ "mcpServers": { "skill-forge": { "url": "http://localhost:7860/gradio_api/mcp/sse" } } }
```

## Scope

Only the **stable, host-agnostic** structure of the format is enforced — no
host-specific frontmatter keys are required, and unknown keys are reported as
info, not errors. The linter is opinionated about `description` quality because
that is what determines whether the skill is ever used.

MIT licensed. All original code.