Rule extraction
Supercharge your AI agents by versioning, tracking, and merging overlapping skills.
npx -y skills add KnowledgeXLab/skill-git --skill rule-extractionAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
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.
SKILL.md
6.6 KB, as published. Nobody here has run it
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