#!/bin/bash # # validate-structure.sh — Valida a estrutura de um projecto contra o standard # ESTRUTURA.md do Modelo-Organizacao-Proc-Dev # # Uso: ./scripts/validate-structure.sh [caminho_do_projecto] # Se não for especificado caminho, valida o projecto actual (raiz) # # Exit codes: # 0 — Em conformidade # 1 — Não conforme (estrutura em falta) # 2 — Erro de execução set -euo pipefail ROOT="${1:-.}" ERRORS=0 WARNINGS=0 echo "=== Validação Estrutural (ESTRUTURA.md) ===" echo "Projecto: $(cd "$ROOT" && pwd)" echo "" # 1. docs/ existe if [ -d "$ROOT/docs" ]; then echo " [OK] docs/ existe" else echo " [FALHA] docs/ não existe" ERRORS=$((ERRORS + 1)) fi # 2. docs/PLANS/ existe if [ -d "$ROOT/docs/PLANS" ]; then echo " [OK] docs/PLANS/ existe" else echo " [FALHA] docs/PLANS/ não existe" ERRORS=$((ERRORS + 1)) fi # 3. docs/SPECS/ existe if [ -d "$ROOT/docs/SPECS" ]; then echo " [OK] docs/SPECS/ existe" else echo " [FALHA] docs/SPECS/ não existe" ERRORS=$((ERRORS + 1)) fi # 4. AGENTS.md existe if [ -f "$ROOT/AGENTS.md" ]; then # Verificar se tem conteúdo mínimo LINES=$(wc -l < "$ROOT/AGENTS.md") if [ "$LINES" -ge 5 ]; then echo " [OK] AGENTS.md existe ($LINES linhas)" else echo " [AVISO] AGENTS.md existe mas tem apenas $LINES linhas" WARNINGS=$((WARNINGS + 1)) fi else echo " [FALHA] AGENTS.md não existe" ERRORS=$((ERRORS + 1)) fi # 5. MEMORY.md existe if [ -f "$ROOT/MEMORY.md" ]; then echo " [OK] MEMORY.md existe" else echo " [FALHA] MEMORY.md não existe" ERRORS=$((ERRORS + 1)) fi # 6. desk.project existe e é JSON válido if [ -f "$ROOT/desk.project" ]; then if jq -e . "$ROOT/desk.project" > /dev/null 2>&1; then TASK_ID=$(jq -r '.task_id // "vazio"' "$ROOT/desk.project") echo " [OK] desk.project existe (task_id: $TASK_ID)" else echo " [FALHA] desk.project existe mas não é JSON válido" ERRORS=$((ERRORS + 1)) fi else echo " [FALHA] desk.project não existe" ERRORS=$((ERRORS + 1)) fi # 7. Anti-pattern: verificar se existem pastas docs/PROC ou docs/RUNBOOK if [ -d "$ROOT/docs/PROC" ]; then echo " [AVISO] docs/PROC existe — não devia. Usar 06-Operacoes/Procedimentos/ no Hub" WARNINGS=$((WARNINGS + 1)) fi if [ -d "$ROOT/docs/RUNBOOK" ]; then echo " [AVISO] docs/RUNBOOK existe — não devia. Usar 06-Operacoes/Runbooks/ no Hub" WARNINGS=$((WARNINGS + 1)) fi echo "" echo "=== Resultado ===" if [ "$ERRORS" -gt 0 ]; then echo " FALHAS: $ERRORS" echo " AVISOS: $WARNINGS" echo " VEREDICTO: NÃO CONFORME" exit 1 else echo " FALHAS: 0" echo " AVISOS: $WARNINGS" echo " VEREDICTO: CONFORME" exit 0 fi