mirror of
https://github.com/antonbabenko/terraform-skill.git
synced 2026-09-18 20:07:05 +08:00
778dfcb7aa
terraform-skill distributed only via antonbabenko/agent-plugins. Deleted .claude-plugin/marketplace.json; release pipeline uses skip-version-file (SKILL.md frontmatter single mirror, git tags canonical). Sequenced after agent-plugins#4.
133 lines
3.9 KiB
YAML
133 lines
3.9 KiB
YAML
name: Validate Skill
|
|
|
|
on:
|
|
pull_request:
|
|
paths:
|
|
- 'skills/**'
|
|
- '.claude-plugin/**'
|
|
push:
|
|
branches: [master, main]
|
|
paths:
|
|
- 'skills/**'
|
|
- '.claude-plugin/**'
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
validate:
|
|
name: Validate Skill Files
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: '3.x'
|
|
|
|
- name: Install Dependencies
|
|
run: pip install pyyaml
|
|
|
|
- name: Check SKILL.md Frontmatter
|
|
run: |
|
|
python3 << 'EOF'
|
|
import yaml
|
|
import sys
|
|
import re
|
|
|
|
print("🔍 Validating SKILL.md frontmatter...")
|
|
|
|
with open('skills/terraform-skill/SKILL.md', 'r') as f:
|
|
content = f.read()
|
|
|
|
if not content.startswith('---'):
|
|
print("❌ ERROR: No frontmatter found")
|
|
sys.exit(1)
|
|
|
|
parts = content.split('---', 2)
|
|
if len(parts) < 3:
|
|
print("❌ ERROR: Invalid frontmatter format")
|
|
sys.exit(1)
|
|
|
|
frontmatter = yaml.safe_load(parts[1])
|
|
|
|
# Check required fields (but allow additional optional fields)
|
|
required = {'name', 'description'}
|
|
missing = required - set(frontmatter.keys())
|
|
|
|
if missing:
|
|
print(f"❌ ERROR: Missing required fields: {missing}")
|
|
sys.exit(1)
|
|
|
|
# Log optional fields if present (informational only)
|
|
optional_fields = set(frontmatter.keys()) - required
|
|
if optional_fields:
|
|
print(f"📋 Optional fields present: {optional_fields}")
|
|
|
|
if 'license' in frontmatter:
|
|
print(f" - license: {frontmatter['license']}")
|
|
|
|
if 'metadata' in frontmatter:
|
|
metadata = frontmatter['metadata']
|
|
if isinstance(metadata, dict):
|
|
if 'version' in metadata:
|
|
print(f" - metadata.version: {metadata['version']}")
|
|
if 'author' in metadata:
|
|
print(f" - metadata.author: {metadata['author']}")
|
|
|
|
name = frontmatter['name']
|
|
if not re.match(r'^[a-zA-Z0-9-]+$', name):
|
|
print(f"❌ ERROR: Invalid name: {name}")
|
|
sys.exit(1)
|
|
|
|
desc_len = len(frontmatter['description'])
|
|
if desc_len > 1024:
|
|
print(f"❌ ERROR: Description too long: {desc_len} chars")
|
|
sys.exit(1)
|
|
|
|
print(f"✅ Frontmatter valid ({desc_len} chars)")
|
|
EOF
|
|
|
|
- name: Check File Size
|
|
run: |
|
|
LINES=$(wc -l < skills/terraform-skill/SKILL.md)
|
|
WORDS=$(wc -w < skills/terraform-skill/SKILL.md)
|
|
echo "📊 SKILL.md: $LINES lines, $WORDS words"
|
|
if [ $LINES -gt 500 ]; then
|
|
echo "⚠️ WARNING: $LINES lines (guideline: <500)"
|
|
else
|
|
echo "✅ Size OK"
|
|
fi
|
|
|
|
- name: Check for Broken Links
|
|
run: |
|
|
echo "🔍 Checking internal links..."
|
|
cd skills/terraform-skill
|
|
if grep -oP '\[.*?\]\(references/.*?\.md.*?\)' SKILL.md references/*.md 2>/dev/null | \
|
|
sed 's/.*(//' | sed 's/).*//' | sed 's/#.*//' | \
|
|
while read -r link; do
|
|
if [ ! -f "$link" ]; then
|
|
echo "❌ ERROR: Broken link: $link"
|
|
exit 1
|
|
fi
|
|
done
|
|
then
|
|
echo "✅ No broken links"
|
|
fi
|
|
|
|
- name: Lint Markdown
|
|
uses: DavidAnson/markdownlint-cli2-action@v16
|
|
with:
|
|
globs: |
|
|
skills/**/*.md
|
|
README.md
|
|
CONTRIBUTING.md
|
|
continue-on-error: true
|
|
|
|
- name: Summary
|
|
if: success()
|
|
run: |
|
|
echo "## ✅ Validation Passed" >> $GITHUB_STEP_SUMMARY
|
|
echo "All skill validation checks passed." >> $GITHUB_STEP_SUMMARY
|