309 lines
8.5 KiB
Bash
Executable File
309 lines
8.5 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# create-guideline.sh - Automatisierte Guideline-Erstellung für Meldestelle Guidelines
|
||
# Version: 1.0.0
|
||
# Autor: Junie AI-Assistant
|
||
# Datum: 2025-09-15
|
||
|
||
set -euo pipefail
|
||
|
||
# Bestimme das Projekt-Root-Verzeichnis
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||
|
||
# Wechsle ins Projekt-Root für korrekte relative Pfade
|
||
cd "$PROJECT_ROOT"
|
||
|
||
GUIDELINES_DIR=".junie/guidelines"
|
||
TEMPLATES_DIR="$GUIDELINES_DIR/_templates"
|
||
META_DIR="$GUIDELINES_DIR/_meta"
|
||
|
||
# Farben für Output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Logging-Funktionen
|
||
log_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
log_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
log_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
log_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
# Hilfe-Funktion
|
||
show_help() {
|
||
cat << 'EOF'
|
||
Meldestelle Guidelines Creator
|
||
|
||
USAGE:
|
||
./create-guideline.sh [TYPE] [NAME] [SCOPE] [OPTIONS]
|
||
|
||
ARGUMENTE:
|
||
TYPE Typ der Guideline (project-standard|process-guide|technology)
|
||
NAME Name der neuen Guideline (ohne .md Extension)
|
||
SCOPE Bereich/Scope der Guideline
|
||
|
||
OPTIONEN:
|
||
--output-dir DIR Alternatives Zielverzeichnis (Standard: entsprechend TYPE)
|
||
--no-meta-update Metadaten (versions.json) nicht automatisch aktualisieren
|
||
--dry-run Zeige nur was erstellt würde, ohne Dateien zu schreiben
|
||
--help Diese Hilfe anzeigen
|
||
|
||
BEISPIELE:
|
||
./create-guideline.sh project-standard security-standards security-practices
|
||
./create-guideline.sh process-guide deployment-process deployment-workflow
|
||
./create-guideline.sh technology kubernetes-guide kubernetes-orchestration
|
||
|
||
VERFÜGBARE TEMPLATES:
|
||
project-standard-template.md -> project-standards/
|
||
process-guide-template.md -> process-guides/
|
||
technology-guideline-template.md -> technology-guides/
|
||
|
||
EOF
|
||
}
|
||
|
||
# Globale Variablen
|
||
TYPE=""
|
||
NAME=""
|
||
SCOPE=""
|
||
OUTPUT_DIR=""
|
||
NO_META_UPDATE=false
|
||
DRY_RUN=false
|
||
|
||
# Command-line Parameter parsen
|
||
parse_arguments() {
|
||
if [[ $# -eq 0 ]] || [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then
|
||
show_help
|
||
exit 0
|
||
fi
|
||
|
||
# Erforderliche Argumente
|
||
if [[ $# -lt 3 ]]; then
|
||
log_error "Nicht genug Argumente. Benötigt: TYPE NAME SCOPE"
|
||
echo "Nutze --help für Details"
|
||
exit 1
|
||
fi
|
||
|
||
TYPE="$1"
|
||
NAME="$2"
|
||
SCOPE="$3"
|
||
shift 3
|
||
|
||
# Optionale Parameter
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--output-dir)
|
||
OUTPUT_DIR="$2"
|
||
shift 2
|
||
;;
|
||
--no-meta-update)
|
||
NO_META_UPDATE=true
|
||
shift
|
||
;;
|
||
--dry-run)
|
||
DRY_RUN=true
|
||
shift
|
||
;;
|
||
*)
|
||
log_error "Unbekannter Parameter: $1"
|
||
echo "Nutze --help für verfügbare Optionen"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
}
|
||
|
||
# Template-Pfad und Zielverzeichnis bestimmen
|
||
determine_paths() {
|
||
local template_file=""
|
||
local default_target_dir=""
|
||
|
||
case "$TYPE" in
|
||
"project-standard")
|
||
template_file="$TEMPLATES_DIR/project-standard-template.md"
|
||
default_target_dir="$GUIDELINES_DIR/project-standards"
|
||
;;
|
||
"process-guide")
|
||
template_file="$TEMPLATES_DIR/process-guide-template.md"
|
||
default_target_dir="$GUIDELINES_DIR/process-guides"
|
||
;;
|
||
"technology")
|
||
template_file="$TEMPLATES_DIR/technology-guideline-template.md"
|
||
default_target_dir="$GUIDELINES_DIR/technology-guides"
|
||
;;
|
||
*)
|
||
log_error "Unbekannter Guideline-Typ: $TYPE"
|
||
echo "Verfügbare Typen: project-standard, process-guide, technology"
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
if [[ ! -f "$template_file" ]]; then
|
||
log_error "Template nicht gefunden: $template_file"
|
||
exit 1
|
||
fi
|
||
|
||
# Zielverzeichnis bestimmen
|
||
if [[ -n "$OUTPUT_DIR" ]]; then
|
||
TARGET_DIR="$OUTPUT_DIR"
|
||
else
|
||
TARGET_DIR="$default_target_dir"
|
||
fi
|
||
|
||
TARGET_FILE="$TARGET_DIR/$NAME.md"
|
||
TEMPLATE_PATH="$template_file"
|
||
}
|
||
|
||
# Prüfe ob Ziel bereits existiert
|
||
check_target_exists() {
|
||
if [[ -f "$TARGET_FILE" ]]; then
|
||
log_error "Guideline existiert bereits: $TARGET_FILE"
|
||
log_info "Lösche die existierende Datei oder wähle einen anderen Namen"
|
||
exit 1
|
||
fi
|
||
|
||
# Stelle sicher, dass Zielverzeichnis existiert
|
||
if [[ "$DRY_RUN" = false ]] && [[ ! -d "$TARGET_DIR" ]]; then
|
||
mkdir -p "$TARGET_DIR"
|
||
log_info "Zielverzeichnis erstellt: $TARGET_DIR"
|
||
fi
|
||
}
|
||
|
||
# Template-Platzhalter ersetzen
|
||
process_template() {
|
||
local current_date=$(date +%Y-%m-%d)
|
||
local processed_content
|
||
|
||
if [[ "$DRY_RUN" = true ]]; then
|
||
log_info "DRY-RUN: Würde Template verarbeiten..."
|
||
log_info " Template: $TEMPLATE_PATH"
|
||
log_info " NAME: $NAME"
|
||
log_info " SCOPE: $SCOPE"
|
||
log_info " DATE: $current_date"
|
||
log_info " Ziel: $TARGET_FILE"
|
||
return
|
||
fi
|
||
|
||
# Template lesen und Platzhalter ersetzen
|
||
processed_content=$(cat "$TEMPLATE_PATH")
|
||
processed_content="${processed_content//\{\{NAME\}\}/$NAME}"
|
||
processed_content="${processed_content//\{\{SCOPE\}\}/$SCOPE}"
|
||
processed_content="${processed_content//\{\{DATE\}\}/$current_date}"
|
||
|
||
# Zieldatei erstellen
|
||
echo "$processed_content" > "$TARGET_FILE"
|
||
log_success "Neue Guideline erstellt: $TARGET_FILE"
|
||
}
|
||
|
||
# Metadaten aktualisieren
|
||
update_metadata() {
|
||
if [[ "$NO_META_UPDATE" = true ]]; then
|
||
log_info "Überspringe Metadaten-Update (--no-meta-update)"
|
||
return
|
||
fi
|
||
|
||
if [[ "$DRY_RUN" = true ]]; then
|
||
log_info "DRY-RUN: Würde Metadaten aktualisieren..."
|
||
return
|
||
fi
|
||
|
||
local versions_file="$META_DIR/versions.json"
|
||
if [[ ! -f "$versions_file" ]]; then
|
||
log_warning "versions.json nicht gefunden: $versions_file"
|
||
return
|
||
fi
|
||
|
||
# Relative Pfad für versions.json
|
||
local relative_path="${TARGET_FILE#$GUIDELINES_DIR/}"
|
||
local current_date=$(date +%Y-%m-%d)
|
||
|
||
# Temporäre JSON-Update (einfache Implementierung)
|
||
# In einer vollständigen Implementation würde man jq verwenden
|
||
log_info "Metadaten-Update für $relative_path implementierung ausstehend"
|
||
log_warning "Bitte aktualisieren Sie $versions_file manuell"
|
||
}
|
||
|
||
# Cross-Referenzen aktualisieren
|
||
update_cross_references() {
|
||
if [[ "$DRY_RUN" = true ]]; then
|
||
log_info "DRY-RUN: Würde Cross-Referenzen aktualisieren..."
|
||
return
|
||
fi
|
||
|
||
local cross_refs_file="$META_DIR/cross-refs.json"
|
||
if [[ ! -f "$cross_refs_file" ]]; then
|
||
log_warning "cross-refs.json nicht gefunden: $cross_refs_file"
|
||
return
|
||
fi
|
||
|
||
log_info "Cross-Referenz-Update implementierung ausstehend"
|
||
log_warning "Bitte aktualisieren Sie $cross_refs_file manuell"
|
||
}
|
||
|
||
# Validierung der neuen Guideline
|
||
validate_new_guideline() {
|
||
if [[ "$DRY_RUN" = true ]]; then
|
||
log_info "DRY-RUN: Würde neue Guideline validieren..."
|
||
return
|
||
fi
|
||
|
||
log_info "Validiere neue Guideline..."
|
||
|
||
# Nutze das validate-links.sh Script falls verfügbar
|
||
local validate_script=".junie/scripts/validate-links.sh"
|
||
if [[ -x "$validate_script" ]]; then
|
||
log_info "Führe Link-Validierung aus..."
|
||
if "$validate_script" --quick; then
|
||
log_success "Validierung erfolgreich!"
|
||
else
|
||
log_warning "Validierung ergab Warnungen - bitte prüfen Sie die Ausgabe"
|
||
fi
|
||
else
|
||
log_warning "validate-links.sh nicht verfügbar - manuelle Validierung empfohlen"
|
||
fi
|
||
}
|
||
|
||
# Hauptfunktion
|
||
main() {
|
||
echo "🚀 Meldestelle Guidelines Creator"
|
||
echo "=================================="
|
||
|
||
parse_arguments "$@"
|
||
determine_paths
|
||
check_target_exists
|
||
process_template
|
||
update_metadata
|
||
update_cross_references
|
||
validate_new_guideline
|
||
|
||
echo ""
|
||
if [[ "$DRY_RUN" = true ]]; then
|
||
log_info "DRY-RUN abgeschlossen - keine Dateien wurden geändert"
|
||
else
|
||
log_success "Guideline-Erstellung erfolgreich abgeschlossen!"
|
||
echo ""
|
||
echo "📋 Nächste Schritte:"
|
||
echo "1. Bearbeiten Sie die neue Guideline: $TARGET_FILE"
|
||
echo "2. Aktualisieren Sie die Metadaten manuell:"
|
||
echo " - $META_DIR/versions.json"
|
||
echo " - $META_DIR/cross-refs.json"
|
||
echo "3. Führen Sie eine vollständige Validierung aus:"
|
||
echo " - .junie/scripts/validate-links.sh"
|
||
fi
|
||
}
|
||
|
||
# Script ausführen
|
||
main "$@"
|