Rule Extraction
Extract a structured list of rules from all markdown files at the top level of a skill directory. Use this skill whenever you need to parse rules out of a skill for conflict checking, merging, or diffing.
What it does
Rule Extraction
This skill teaches you how to extract a structured, line-numbered list of rules from a skill directory.
What Counts as a Rule
A rule is any statement that prescribes or constrains agent behavior. Recognize rules by their form:
- Imperative directives: "Always add type annotations", "Never use
var" - Prohibition patterns: "Do not X", "Avoid X", "禁止 X"
- Requirement patterns: "Must X", "Should X", "需要 X", "必须 X"
- Conditional behavior: "If X, then Y", "When X, do Y"
- Style/format mandates: "Use camelCase", "Limit lines to 80 characters"
- Preference statements: "Prefer X over Y", "优先使用 X"
Rules can appear as:
- Bullet list items (
-or*or+) - Numbered list items (
1.,2.) - Bold or emphasized sentences (
**Always do X**) - Plain sentences within a paragraph that contain directive language
- Section headers that are themselves imperatives ("Never commit secrets")
What Does NOT Count as a Rule
Exclude the following from extraction:
- Descriptive text: Explanations of why a rule exists, background context
- Examples: Code blocks, sample outputs, "for example..." passages
- Metadata: YAML frontmatter, version info, author notes
- Headings that introduce a section (unless the heading itself is an imperative rule)
- Vague non-actionable statements: "Do good work", "Be helpful" — extract these but flag them as
vague: true
Output Format
Return a JSON array. Each rule is an object:
[
{
"id": 1,
"file": "SKILL.md",
"line": 12,
"text": "Always add type annotations to function parameters",
"source_text": "- Always add type annotations to function parameters",
"vague": false
},
{
"id": 2,
"file": "SKILL.md",
"line": 15,
"text": "Do not use var, prefer const or let",
"source_text": "**Do not use `var`** — prefer `const` or `let`",
"vague": false
},
{
"id": 3,
"file": "examples.md",
"line": 4,
"text": "Do good work",
"source_text": "- Do good work",
"vague": true
}
]
Field definitions:
id: Sequential integer starting from 1, across all files combinedfile: Filename (basename only, e.g.SKILL.md,examples.md) where the rule appearsline: Line number within that file where the rule appears (1-indexed)text: Cleaned rule text, stripped of markdown formattingsource_text: Original raw line as it appears in the filevague:trueif the rule is too broad to be actionable
Input Scope
The input is a skill directory path (e.g. ~/.claude/skills/humanizer/).
Files to read: all *.md files directly inside the skill directory — SKILL.md first, then any other *.md files in alphabetical order.
Files to skip:
- Subdirectories and any files inside them (no recursive scan)
- Non-markdown files (
.sh,.py,.js,.json, etc.)
Extraction Process
- List all
*.mdfiles at the top level of the skill directory (non-recursive). ReadSKILL.mdfirst if present; read remaining*.mdfiles in alphabetical order. - For each file, read it line by line, tracking line numbers within that file.
- Skip frontmatter (everything between
---delimiters at the top of each file) - Skip code blocks (between
```fences) — these are examples, not rules - For each line, determine if it contains a rule using the criteria above
- For paragraph text: split into sentences, check each sentence independently
- Clean the extracted text: remove markdown syntax (
-,*,**, backticks) but preserve the meaning - Assign line numbers based on where the rule text starts within its file
- Record the source filename for every rule
Handling Ambiguous Cases
- Compound bullet: "Use camelCase and limit lines to 80 chars" → split into two rules, both on the same line number
- Nested bullets: Treat each nested item as an independent rule
- Conditional rules: Keep the full conditional ("If Python, use type hints") as one rule — do not split on the condition
- Negated rules: "Don't use X" and "Never use X" are equivalent — normalize to a consistent form in
text, preserve original insource_text
Example
Input skill directory: ~/.claude/skills/code-style/
Files found at top level: SKILL.md, extra-rules.md
(Any subdirectory contents are ignored.)
SKILL.md:
---
name: Code Style
---
# Code Style Guidelines
Keep code clean and maintainable.
## Naming
- Use camelCase for variables and functions
- Use PascalCase for classes and types
- Never use single-letter variable names except for loop indices
## Comments
Always write comments in English.
Do not write comments explaining what the code does — only explain why.
## Example
\`\`\`python
# good
def calculate_total(items):
return sum(items)
\`\`\`
extra-rules.md:
- Prefer explicit returns over implicit ones
Output:
[
{
"id": 1,
"file": "SKILL.md",
"line": 10,
"text": "Use camelCase for variables and functions",
"source_text": "- Use camelCase for variables and functions",
"vague": false
},
{
"id": 2,
"file": "SKILL.md",
"line": 11,
"text": "Use PascalCase for classes and types",
"source_text": "- Use PascalCase for classes and types",
"vague": false
},
{
"id": 3,
"file": "SKILL.md",
"line": 12,
"text": "Never use single-letter variable names except for loop indices",
"source_text": "- Never use single-letter variable names except for loop indices",
"vague": false
},
{
"id": 4,
"file": "SKILL.md",
"line": 15,
"text": "Always write comments in English",
"source_text": "Always write comments in English.",
"vague": false
},
{
"id": 5,
"file": "SKILL.md",
"line": 16,
"text": "Do not write comments explaining what the code does — only explain why",
"source_text": "Do not write comments explaining what the code does — only explain why.",
"vague": false
},
{
"id": 6,
"file": "extra-rules.md",
"line": 1,
"text": "Prefer explicit returns over implicit ones",
"source_text": "- Prefer explicit returns over implicit ones",
"vague": false
}
]
Notes:
- SKILL.md lines 18–23 (the code block) are skipped entirely
idis sequential across all files;lineresets to 1 for each new file- Any subdirectories inside
~/.claude/skills/code-style/are not scanned
Capabilities
Install
Quality
deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 36 github stars · SKILL.md body (6,489 chars)