meldestelle/.github/workflows/guidelines-validation.yml
2025-09-15 12:49:55 +02:00

241 lines
8.1 KiB
YAML

name: Guidelines Validation
on:
push:
paths:
- '.junie/**/*.md'
- '.junie/**/*.json'
- '.junie/scripts/**'
pull_request:
paths:
- '.junie/**/*.md'
- '.junie/**/*.json'
- '.junie/scripts/**'
jobs:
validate-guidelines:
runs-on: ubuntu-latest
name: Validate Guidelines Structure and Links
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Python for YAML validation
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install Required Tools
run: |
sudo apt-get update
sudo apt-get install -y jq yamllint curl
pip install pyyaml jsonschema
- name: Validate YAML Headers in Guidelines
run: |
echo "🔍 Validiere YAML-Header in Guidelines..."
exit_code=0
find .junie/guidelines -name "*.md" -not -path "*/_archived/*" | while read file; do
echo " Prüfe: $(basename $file)"
# YAML-Header extrahieren (zwischen ersten beiden --- Zeilen)
sed -n '/^---$/,/^---$/p' "$file" | head -n -1 | tail -n +2 > temp.yaml
if [[ -s temp.yaml ]]; then
# Python-basierte YAML-Validierung (robuster als yamllint)
python3 -c "import yaml, sys; yaml.safe_load(open('temp.yaml', 'r')); print(' ✅ YAML-Syntax OK')" || {
echo "❌ YAML-Syntax-Fehler in $file"
exit_code=1
}
else
echo " ⚠️ Kein YAML-Header in $file"
fi
rm -f temp.yaml
done
if [[ $exit_code -ne 0 ]]; then
exit 1
fi
- name: Validate Cross-References and Links
run: |
echo "🔗 Validiere Cross-Referenzen und Links..."
chmod +x .junie/scripts/validate-links.sh
./.junie/scripts/validate-links.sh
- name: Check Versions Consistency
run: |
echo "📊 Prüfe Versions-Konsistenz..."
# Alle last_updated Daten sammeln und auf Konsistenz prüfen
echo "Aktuelle Versions-Verteilung:"
find .junie/guidelines -name "*.md" -not -path "*/_archived/*" -exec grep -H "last_updated:" {} \; | \
cut -d'"' -f2 | sort | uniq -c | sort -rn
# Überprüfe guideline_type Konsistenz
echo -e "\nGuideline-Types:"
find .junie/guidelines -name "*.md" -not -path "*/_archived/*" -exec grep -H "guideline_type:" {} \; | \
cut -d'"' -f2 | sort | uniq -c | sort -rn
- name: Validate Template Structure and Metadata
run: |
echo "📋 Prüfe Template-Konsistenz und Metadaten..."
exit_code=0
find .junie/guidelines -name "*.md" -not -path "*/_archived/*" -not -name "README.md" | while read file; do
echo " Validiere: $(basename $file)"
# Prüfe erforderliche YAML-Felder
if ! grep -q "guideline_type:" "$file"; then
echo " ❌ Fehlt guideline_type in $file"
exit_code=1
fi
if ! grep -q "ai_context:" "$file"; then
echo " ❌ Fehlt ai_context in $file"
exit_code=1
fi
if ! grep -q "last_updated:" "$file"; then
echo " ❌ Fehlt last_updated in $file"
exit_code=1
fi
echo " ✅ Metadaten komplett"
done
if [[ $exit_code -ne 0 ]]; then
exit 1
fi
- name: Validate JSON Configuration Files
run: |
echo "🔧 Validiere JSON-Konfigurationsdateien..."
for json_file in .junie/guidelines/_meta/*.json; do
if [[ -f "$json_file" ]]; then
echo " Prüfe: $(basename $json_file)"
jq empty "$json_file" || {
echo "❌ JSON-Syntax-Fehler in $json_file"
exit 1
}
echo " ✅ $(basename $json_file) - JSON-Syntax OK"
fi
done
- name: Check Script Executability and Permissions
run: |
echo "⚙️ Prüfe Script-Berechtigungen..."
for script in .junie/scripts/*.sh; do
if [[ -f "$script" ]]; then
echo " Prüfe: $(basename $script)"
if [[ -x "$script" ]]; then
echo " ✅ $(basename $script) - Ausführbar"
else
echo " ❌ $(basename $script) - Nicht ausführbar"
exit 1
fi
fi
done
- name: Generate Validation Report
if: always()
run: |
echo "📈 Erstelle Validierungs-Report..."
cat > guidelines-validation-report.md << 'EOF'
# Guidelines Validation Report
**Datum:** $(date)
**Commit:** ${{ github.sha }}
**Branch:** ${{ github.ref_name }}
## Zusammenfassung
- ✅ YAML-Syntax validiert
- ✅ Cross-Referenzen geprüft
- ✅ Versions-Konsistenz überprüft
- ✅ Template-Struktur validiert
- ✅ JSON-Konfiguration validiert
- ✅ Script-Berechtigungen geprüft
## Statistiken
- **Aktive Guidelines:** $(find .junie/guidelines -name "*.md" -not -path "*/_archived/*" | wc -l)
- **Archivierte Guidelines:** $(find .junie/guidelines/_archived -name "*.md" 2>/dev/null | wc -l)
- **Templates verfügbar:** $(find .junie/guidelines/_templates -name "*.md" 2>/dev/null | wc -l)
- **Validierungs-Scripts:** $(find .junie/scripts -name "*.sh" 2>/dev/null | wc -l)
## Letzte Änderungen
```
$(git log --oneline -n 5 -- .junie/)
```
EOF
- name: Comment PR with Validation Results
if: github.event_name == 'pull_request'
uses: actions/github-script@v7
with:
script: |
const fs = require('fs');
if (fs.existsSync('guidelines-validation-report.md')) {
const report = fs.readFileSync('guidelines-validation-report.md', 'utf8');
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '## 📋 Guidelines Validation Report\n\n' + report
});
}
advanced-link-check:
runs-on: ubuntu-latest
name: Advanced Link and Structure Validation
needs: validate-guidelines
steps:
- name: Checkout Repository
uses: actions/checkout@v4
- name: Setup Node.js for markdown-link-check
uses: actions/setup-node@v4
with:
node-version: '18'
- name: Install Link Checker
run: |
npm install -g markdown-link-check@3.11.2
- name: Create Link Check Configuration
run: |
cat > .junie/link-check-config.json << 'EOF'
{
"ignorePatterns": [
{
"pattern": "^http://localhost"
},
{
"pattern": "^https://localhost"
},
{
"pattern": "^http://127.0.0.1"
}
],
"replacementPatterns": [],
"httpHeaders": [],
"timeout": "10s",
"retryOn429": true,
"retryCount": 3,
"fallbackRetryDelay": "30s",
"aliveStatusCodes": [200, 206]
}
EOF
- name: Check Internal Markdown Links
run: |
echo "🔍 Erweiterte Link-Validierung..."
exit_code=0
find .junie/guidelines -name "*.md" | while read file; do
echo "Prüfe Links in: $(basename $file)"
if ! markdown-link-check "$file" --config .junie/link-check-config.json --quiet; then
echo "❌ Link-Fehler in $file"
exit_code=1
else
echo "✅ Links OK in $(basename $file)"
fi
done
if [[ $exit_code -ne 0 ]]; then
echo "❌ Link-Validierung fehlgeschlagen"
exit 1
fi
echo "✅ Alle Links validiert"