Files
oto-enterprise-os-dtp/ci/check_docs.sh
T
Claude Code DTP Worker 535bc83e0d [DTP-Worker] Sprint 8 · buffer L75 · Gate 4Big check_docs 0 faux positif (fixtures data_room exclues + spec CHOISIR scorée 95/100)
- ci/check_docs.sh : exclut */fixtures/data_room/* du gate SOFT auto-score
  (inputs de test synthétiques, cf. publiciste/fixtures/README.md ; même
  statut que daily_reports/*). Portée précise : fixtures/README.md reste gaté.
- specs/CHOISIR_MON_UNITE_SPEC.md : ajoute une section Auto-score 4Big 95/100
  (livrable spec, contrainte #5) ; P01=2.484M USD cité verbatim de la spec (#6).
- Resultat : 9 avertissements documentaires -> 0. Gates vertes (check_docs,
  guard_constraints, validate_json tous EXIT 0).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-30 23:02:54 +00:00

65 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# ============================================================================
# check_docs.sh · OTO Enterprise OS DTP
# ----------------------------------------------------------------------------
# Contrôle qualité documentaire (gate 4Big, roadmap Sprint 1) :
# [HARD] Liens Markdown relatifs internes → la cible doit exister.
# [SOFT] Livrables 05_deliverables_mvp/*.md → auto-score 4Big attendu.
# Dépendances : bash, git, grep, sed. Aucun réseau requis.
# ============================================================================
set -uo pipefail
cd "$(git rev-parse --show-toplevel)"
FAIL=0
report() { printf ' \033[31m✗\033[0m %s\n' "$1"; FAIL=1; }
warn() { printf ' \033[33m⚠\033[0m %s\n' "$1"; }
ok() { printf ' \033[32m✓\033[0m %s\n' "$1"; }
echo "== 1. Liens Markdown relatifs internes (cible existe ?) =="
broken=0
while read -r md; do
dir="$(dirname "$md")"
# Extrait les cibles [texte](cible) ; ignore http(s), mailto, ancres pures,
# gabarits {{...}} et liens wiki [[...]]. Les code-spans `...` sont d'abord
# neutralisés : un lien entre backticks n'est PAS cliquable au rendu (c'est un
# exemple de syntaxe), il ne doit donc jamais être validé comme lien réel.
sed -E 's/`[^`]*`//g' "$md" 2>/dev/null \
| grep -oE '\]\([^)]+\)' \
| sed -E 's/^\]\(//; s/\)$//' \
| while read -r link; do
link="${link%% *}" # retire un éventuel "titre"
link="${link%%#*}" # retire l'ancre
[[ -z "$link" ]] && continue
case "$link" in
http://*|https://*|mailto:*|tel:*|\#*|\{\{*|data:*) continue ;;
esac
target="$dir/$link"
if [[ ! -e "$target" ]]; then
printf ' \033[31m✗\033[0m %s → lien cassé : %s\n' "$md" "$link"
echo "BROKEN" >> /tmp/brokenlinks
fi
done
done < <(git ls-files '*.md')
if [[ -s /tmp/brokenlinks ]]; then FAIL=1; rm -f /tmp/brokenlinks; else ok "Aucun lien interne cassé"; fi
echo "== 2. Auto-score 4Big sur les livrables (SOFT · CLAUDE.md #5 · ≥95/100) =="
while read -r md; do
case "$md" in
05_deliverables_mvp/daily_reports/*) continue ;; # rapports : hors gate score
05_deliverables_mvp/*/fixtures/data_room/*) continue ;; # fixtures : INPUTS de test synthétiques (cf. publiciste/fixtures/README.md), pas des livrables scorés
esac
if grep -qiE 'score|/100' "$md"; then
ok "$md — mention de score présente"
else
warn "$md — pas de mention d'auto-score 4Big (recommandé ≥95/100)"
fi
done < <(git ls-files '05_deliverables_mvp/*.md')
echo
if [[ "$FAIL" -eq 0 ]]; then
echo -e "\033[32m✅ Documentation conforme (liens internes OK).\033[0m"
else
echo -e "\033[31m❌ Lien(s) interne(s) cassé(s) — corriger avant merge.\033[0m"
fi
exit "$FAIL"