feat(okf-hub): adicionar okf-normalize-types.sh (normalizador taxonomia, Fase D)
This commit is contained in:
Executable
+86
@@ -0,0 +1,86 @@
|
||||
#!/usr/bin/env bash
|
||||
# okf-normalize-types.sh — normaliza type taxonomy para vocabulário canónico OKF
|
||||
# Uso: okf-normalize-types.sh [--dry-run]
|
||||
# §5 do OKF-Compliance-Plan-Global.md
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
HUB_ROOT="/media/ealmeida/Dados/Hub"
|
||||
DRY_RUN=false
|
||||
[[ "${1:-}" == "--dry-run" ]] && DRY_RUN=true
|
||||
|
||||
# Canonical type mappings (lowercase → Canonical)
|
||||
declare -A TYPE_MAP=(
|
||||
["procedimento"]="Playbook"
|
||||
["procedure"]="Playbook"
|
||||
["playbook"]="Playbook"
|
||||
["reference"]="Reference"
|
||||
["api"]="Reference"
|
||||
["spec"]="Specification"
|
||||
["index"]="Index"
|
||||
["changelog"]="Changelog"
|
||||
["status"]="Status"
|
||||
["document"]="Document"
|
||||
["template"]="Template"
|
||||
["client profile"]="Client Profile"
|
||||
["note"]="note"
|
||||
)
|
||||
|
||||
is_excluded() {
|
||||
local rel="$1"
|
||||
[[ "$rel" == *99-Arquivo/* ]] && return 0
|
||||
[[ "$rel" == *.stversions/* ]] && return 0
|
||||
[[ "$rel" == *.obsidian/* ]] && return 0
|
||||
[[ "$rel" == *.ijfw/* ]] && return 0
|
||||
[[ "$rel" == *_templates/* ]] && return 0
|
||||
[[ "$rel" == *90-Templates/* ]] && return 0
|
||||
[[ "$rel" == *.git/* ]] && return 0
|
||||
[[ "$rel" == *node_modules/* ]] && return 0
|
||||
[[ "$rel" == *.github/* ]] && return 0
|
||||
[[ "$rel" == *.wayland/* ]] && return 0
|
||||
[[ "$rel" == *.hermes/* ]] && return 0
|
||||
local base
|
||||
base="$(basename "$rel")"
|
||||
[[ "$base" == "MEMORY.md" ]] && return 0
|
||||
[[ "$base" == "CLAUDE.md" ]] && return 0
|
||||
[[ "$base" == "GEMINI.md" ]] && return 0
|
||||
[[ "$base" == "AGENTS.md" ]] && return 0
|
||||
return 1
|
||||
}
|
||||
|
||||
CHANGED=0
|
||||
TOTAL=0
|
||||
|
||||
echo "Normalizing type taxonomy in $HUB_ROOT..."
|
||||
[[ "$DRY_RUN" == "true" ]] && echo "(DRY-RUN mode — no files modified)"
|
||||
echo ""
|
||||
|
||||
while IFS= read -r -d '' f; do
|
||||
rel="${f#$HUB_ROOT/}"
|
||||
is_excluded "$rel" && continue
|
||||
|
||||
# Get current type
|
||||
current_type="$(awk 'BEGIN{n=0} /^---[[:space:]]*$/{n++; if(n==2) exit} n==1 && /^type:/{print; exit}' "$f" 2>/dev/null || true)"
|
||||
[[ -z "$current_type" ]] && continue
|
||||
|
||||
# Extract value after "type:"
|
||||
type_val="$(echo "$current_type" | sed 's/^type: *//' | tr -d '"' | tr -d "'" | xargs)"
|
||||
|
||||
# Check if needs normalization
|
||||
type_lower="$(echo "$type_val" | tr '[:upper:]' '[:lower:]')"
|
||||
canonical="${TYPE_MAP[$type_lower]:-}"
|
||||
|
||||
if [[ -n "$canonical" ]] && [[ "$canonical" != "$type_val" ]]; then
|
||||
((TOTAL++)) || true
|
||||
echo " $rel: '$type_val' → '$canonical'"
|
||||
if [[ "$DRY_RUN" != "true" ]]; then
|
||||
sed -i "s/^type:.*$/type: $canonical/" "$f"
|
||||
((CHANGED++)) || true
|
||||
fi
|
||||
fi
|
||||
done < <(find "$HUB_ROOT" -name '*.md' -not -path '*/.git/*' -not -path '*/node_modules/*' -print0)
|
||||
|
||||
echo ""
|
||||
echo "────────────────────────────────────"
|
||||
echo "To normalize: $TOTAL | Changed: $CHANGED"
|
||||
[[ "$DRY_RUN" == "true" ]] && echo "(Re-run without --dry-run to apply)"
|
||||
Reference in New Issue
Block a user