From 7d5243d395b2622f632603dfa92388bbc45d68df Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Thu, 28 Aug 2025 10:59:34 +0200 Subject: [PATCH] =?UTF-8?q?feat(ci,agents,docs):=20conteneur=20unifi=C3=A9?= =?UTF-8?q?=20runner+agents,=20AUTO=5FFIX,=20SCOPE,=20docs=20MAJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++ docker-compose.dev.yml | 16 --- docs/ARCHITECTURE.md | 2 + docs/DEPLOYMENT.md | 2 + docs/INDEX.md | 2 + docs/SECURITY_AUDIT.md | 2 + docs/TESTING.md | 2 + docs/project/AGENTS_RUNTIME.md | 16 ++- docs/project/CONFIGURATION.md | 29 +++++- docs/project/DEPLOYMENT.md | 22 ++++ docs/project/GITEA_SETUP.md | 8 +- docs/project/USAGE.md | 8 +- scripts/agents/common.sh | 19 ++++ scripts/agents/compilation_agent.sh | 6 ++ scripts/agents/dependances_agent.sh | 6 ++ scripts/agents/deployment_agent.sh | 6 ++ scripts/agents/documentation_agent.sh | 20 ++++ scripts/agents/frontend_agent.sh | 6 ++ scripts/agents/gitea_agent.sh | 6 ++ scripts/agents/open_source_agent.sh | 6 ++ scripts/agents/quality_tech.sh | 3 + scripts/agents/run.ps1 | 140 -------------------------- scripts/agents/security_agent.sh | 6 ++ scripts/agents/ssh_scripts_agent.sh | 6 ++ scripts/agents/structure_agent.sh | 6 ++ scripts/agents/tests_agent.sh | 9 ++ scripts/agents/versionnage_agent.sh | 6 ++ 27 files changed, 210 insertions(+), 165 deletions(-) delete mode 100644 docker-compose.dev.yml create mode 100644 docs/ARCHITECTURE.md create mode 100644 docs/DEPLOYMENT.md create mode 100644 docs/INDEX.md create mode 100644 docs/SECURITY_AUDIT.md create mode 100644 docs/TESTING.md create mode 100644 scripts/agents/common.sh delete mode 100644 scripts/agents/run.ps1 diff --git a/README.md b/README.md index 523f3bf..179792b 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,21 @@ Fallback Windows: `scripts/agents/run.ps1`. Guide complet: `docs/project/AGENTS_RUNTIME.md`. +## 🐳 Conteneur unifié (runner + agents) + +```bash +# Build +docker compose -f docker-compose.ci.yml build + +# Exécuter les agents sur le dépôt courant +docker compose -f docker-compose.ci.yml up --abort-on-container-exit +# Rapports: tests/reports/agents/*.md + +# Lancer le runner dans ce conteneur +RUNNER_MODE=runner BASE_URL="https://git.4nkweb.com" REGISTRATION_TOKEN="" \ + docker compose -f docker-compose.ci.yml up -d +``` + ## 🔁 CI/CD (Gitea Actions) - Runners: labels requis `self-hosted,linux` (voir `docs/project/GITEA_SETUP.md`) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml deleted file mode 100644 index 8fbe8e0..0000000 --- a/docker-compose.dev.yml +++ /dev/null @@ -1,16 +0,0 @@ -version: "3.8" -services: - dev: - build: - context: . - dockerfile: docker/Dockerfile.debian - image: 4nk-template-dev:debian - container_name: 4nk-template-dev - stdin_open: true - tty: true - working_dir: /work - volumes: - - ./:/work - - /var/run/docker.sock:/var/run/docker.sock - entrypoint: ["/bin/bash","-lc"] - command: ["sleep infinity"] diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md new file mode 100644 index 0000000..a2dc5cd --- /dev/null +++ b/docs/ARCHITECTURE.md @@ -0,0 +1,2 @@ +# Architecture + diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md new file mode 100644 index 0000000..bd32249 --- /dev/null +++ b/docs/DEPLOYMENT.md @@ -0,0 +1,2 @@ +# Déploiement + diff --git a/docs/INDEX.md b/docs/INDEX.md new file mode 100644 index 0000000..2061bac --- /dev/null +++ b/docs/INDEX.md @@ -0,0 +1,2 @@ +# Index + diff --git a/docs/SECURITY_AUDIT.md b/docs/SECURITY_AUDIT.md new file mode 100644 index 0000000..26ad0e3 --- /dev/null +++ b/docs/SECURITY_AUDIT.md @@ -0,0 +1,2 @@ +# Security Audit + diff --git a/docs/TESTING.md b/docs/TESTING.md new file mode 100644 index 0000000..5932b40 --- /dev/null +++ b/docs/TESTING.md @@ -0,0 +1,2 @@ +# Tests + diff --git a/docs/project/AGENTS_RUNTIME.md b/docs/project/AGENTS_RUNTIME.md index 1528ce5..f63c5d7 100644 --- a/docs/project/AGENTS_RUNTIME.md +++ b/docs/project/AGENTS_RUNTIME.md @@ -12,6 +12,7 @@ Ce guide décrit comment utiliser et intégrer les agents de conformité (qualit - bash disponible (Git Bash/WSL/Linux/macOS) pour les contrôles complets - (Optionnel) `OPENAI_API_KEY` pour activer l’analyse IA +- (Option) conteneur unifié runner+agents: `docker-compose.ci.yml` ## 3. Commandes @@ -23,6 +24,11 @@ Ce guide décrit comment utiliser et intégrer les agents de conformité (qualit - `scripts/agents/run.ps1` - Options (facultatives): `-TargetDir . -OutputDir tests/reports/agents -Agent ` +- Conteneur unifié: + - Build: `docker compose -f docker-compose.ci.yml build` + - Exécuter agents: `docker compose -f docker-compose.ci.yml up --abort-on-container-exit` + - Lancer runner: `RUNNER_MODE=runner BASE_URL=... REGISTRATION_TOKEN=... docker compose -f docker-compose.ci.yml up -d` + ## 4. Agents disponibles - Documentation (`documentation`): fichiers essentiels et index @@ -53,12 +59,20 @@ Ce guide décrit comment utiliser et intégrer les agents de conformité (qualit - `openia-agents`: agents avec IA si `OPENAI_API_KEY` fourni - `bash-required`: bloque si bash/runner absent - `release-guard`: dépend des checks en amont + - (Option) étape pour builder/lancer `docker-compose.ci.yml` si utilisation du conteneur unifié ## 7. Paramètres IA (optionnels) - `OPENAI_API_KEY`, `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE` -## 8. Bonnes pratiques +## 8. Auto‑corrections (optionnelles) + +- `AUTO_FIX=1` permet aux agents d’appliquer des corrections minimales: + - création des dossiers `tests/**` manquants + - génération de squelettes Markdown basiques pour quelques fichiers de `docs/` +- Traçabilité: les actions sont listées dans les rapports `tests/reports/agents/*.md` + +## 9. Bonnes pratiques - Exécuter les agents avant chaque PR - Archiver les rapports significatifs diff --git a/docs/project/CONFIGURATION.md b/docs/project/CONFIGURATION.md index f876a2e..543ba0c 100644 --- a/docs/project/CONFIGURATION.md +++ b/docs/project/CONFIGURATION.md @@ -3,9 +3,21 @@ ## Variables d’environnement (CI) - Secrets CI uniquement (pas de secrets en clair) -- Variables agents : OPENAI_API_KEY, OPENAI_MODEL, OPENAI_API_BASE, OPENAI_TEMPERATURE -- Secret release: RELEASE_TOKEN (publication des releases via l’API Gitea) -- Variable optionnelle: BASE_URL (ex: `https://git.4nkweb.com`) +- **Agents IA**: `OPENAI_API_KEY`, `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE` +- **Release**: `RELEASE_TOKEN` (publication des releases via l’API Gitea) +- **Forge**: `BASE_URL` (ex: `https://git.4nkweb.com`) +- **Runner unifié**: + - `RUNNER_MODE` = `agents` | `runner` | `both` (par défaut: `agents`) + - `REGISTRATION_TOKEN` (requis si `RUNNER_MODE=runner` ou `both` sans config existante) + +## Variables d’environnement (agents) + +- `AUTO_FIX` (0/1, défaut 0): active les corrections automatiques côté agents + - Création de la structure `tests/**` manquante + - Génération de squelettes minimalistes pour certains fichiers de `docs/` +- `SCOPE` (`all`|`changed`, défaut `all`): + - `all`: passe sur l’ensemble du dépôt + - `changed`: focalise les contrôles/corrections sur les fichiers modifiés du dernier commit ## Conventions @@ -17,6 +29,17 @@ - bash requis (job CI `bash-required`) - Fallback PowerShell utilisable localement +## Conteneur unifié (runner+agents) + +- Image: construite via `docker/Dockerfile.ci`, orchestrée par `docker-compose.ci.yml` +- Montage: le projet courant est monté sur `/work`, les rapports dans `/work/tests/reports/agents` +- Secrets locaux: `~/.4nk_template/.env` monté en lecture seule dans le conteneur + +Variables utilisées par l’entrypoint `docker/entrypoint.ci.sh`: + +- `RUNNER_MODE` détermine le mode d’exécution +- `BASE_URL` et `REGISTRATION_TOKEN` servent à l’enregistrement du runner (act_runner) + ## Gestion locale des secrets (~/.4nk_template/.env) - Modèle fourni: `scripts/env/.env.template` (clés sans valeurs) diff --git a/docs/project/DEPLOYMENT.md b/docs/project/DEPLOYMENT.md index 81438df..7965ba5 100644 --- a/docs/project/DEPLOYMENT.md +++ b/docs/project/DEPLOYMENT.md @@ -47,3 +47,25 @@ bash scripts/deploy/setup.sh git@host:org/mon-projet.git --dest ~/work --force - Vérification santé/logs/dashboards - Suivi des erreurs et retours + +## Conteneur unifié (runner + agents) + +- Build: + +```bash +docker compose -f docker-compose.ci.yml build +``` + +- Exécuter les agents sur le dépôt courant: + +```bash +docker compose -f docker-compose.ci.yml up --abort-on-container-exit +# Rapports: tests/reports/agents/*.md +``` + +- Lancer le runner dans le conteneur unifié: + +```bash +export RUNNER_MODE=runner BASE_URL="https://git.4nkweb.com" REGISTRATION_TOKEN="" +docker compose -f docker-compose.ci.yml up -d +``` diff --git a/docs/project/GITEA_SETUP.md b/docs/project/GITEA_SETUP.md index 42dcef1..d44df66 100644 --- a/docs/project/GITEA_SETUP.md +++ b/docs/project/GITEA_SETUP.md @@ -25,15 +25,17 @@ ### Runner Gitea (labels) - Configurez votre runner avec labels: `self-hosted,linux` -- Exemple (act_runner): - - Enregistrement: `./act_runner register --labels "self-hosted,linux"` - - Service: définissez `RUNNER_LABELS="self-hosted,linux"` +- Option A (runner dédié): `gitea/act_runner` via docker-compose dans `runner/` +- Option B (conteneur unifié): `RUNNER_MODE=runner` dans `docker-compose.ci.yml` + `BASE_URL` et `REGISTRATION_TOKEN` + - Enregistrement (automatisé par entrypoint si variables présentes) + - Démarrage: `docker compose -f docker-compose.ci.yml up -d` ## 4. Workflows requis - `code-quality`, `unit-tests`, `documentation-tests`, `security-audit` - `deployment-checks`, `bash-required`, `markdownlint`, `release-guard`, `release-create` - (Optionnels) `agents-smoke`, `openia-agents` +- (Conteneur unifié) job custom pour builder et lancer `docker-compose.ci.yml` si nécessaire ## 5. Processus PR diff --git a/docs/project/USAGE.md b/docs/project/USAGE.md index 6ddee72..83c6033 100644 --- a/docs/project/USAGE.md +++ b/docs/project/USAGE.md @@ -25,8 +25,12 @@ Ce document explique comment utiliser le template pour initier, documenter, cont - Recommandé (bash): `scripts/agents/run.sh [target_dir] [output_dir] [agent]` - Windows fallback: `scripts/agents/run.ps1 -TargetDir . -OutputDir tests/reports/agents -Agent ` -- Rapports: `tests/reports/agents/*.md` -- Agents utiles en premier passage: `documentation`, `quality-technique`, `open-source`, `securite`, `deploiement` +- Conteneur (option): `docker compose -f docker-compose.ci.yml up --abort-on-container-exit` + - Rapports: `tests/reports/agents/*.md` + - Variables utiles: `RUNNER_MODE`, `BASE_URL`, `REGISTRATION_TOKEN` + - Script helper: `scripts/dev/run_project_ci.sh` + - Auto‑corrections: `AUTO_FIX=1` pour créer la structure de tests et des squelettes docs + - Agents utiles en premier passage: `documentation`, `quality-technique`, `open-source`, `securite`, `deploiement` ## 5. Qualité et CI diff --git a/scripts/agents/common.sh b/scripts/agents/common.sh new file mode 100644 index 0000000..e918815 --- /dev/null +++ b/scripts/agents/common.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Portée des contrôles: all (défaut) ou changed +export SCOPE="${SCOPE:-all}" + +list_changed_paths() { + # Renvoie la liste des chemins modifiés (HEAD~1..HEAD), ou vide si non dispo + git diff --name-only HEAD~1..HEAD 2>/dev/null || true +} + +is_path_changed() { + local path="$1" + if [[ "$SCOPE" != "changed" ]]; then return 0; fi + local changed + changed=$(list_changed_paths) + if [[ -z "$changed" ]]; then return 0; fi + grep -q "^${path%/}\(/\|$\)" <<<"$changed" && return 0 || return 1 +} diff --git a/scripts/agents/compilation_agent.sh b/scripts/agents/compilation_agent.sh index c7e74c2..65f005c 100644 --- a/scripts/agents/compilation_agent.sh +++ b/scripts/agents/compilation_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/compilation_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Compilation" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(.gitea/workflows/ci.yml) + any=0; for p in "${relevant[@]}"; do if is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement compilation CI (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi if grep -q "cargo" .gitea/workflows/ci.yml 2>/dev/null; then echo "- Étapes de build/format/clippy Rust détectées dans la CI." >> "$SUMMARY_FILE" else diff --git a/scripts/agents/dependances_agent.sh b/scripts/agents/dependances_agent.sh index 5f1293e..65786c4 100644 --- a/scripts/agents/dependances_agent.sh +++ b/scripts/agents/dependances_agent.sh @@ -5,12 +5,18 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/dependances_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Dépendances" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" echo "- Vérifier régulièrement les dépendances (audit sécurité, mises à jour stables)." >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(package.json package-lock.json pnpm-lock.yaml yarn.lock requirements.txt pyproject.toml Cargo.toml go.mod .gitea/workflows/ci.yml) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement dépendances/CI (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi if grep -q "security-audit" .gitea/workflows/ci.yml 2>/dev/null; then echo "- Job CI security-audit détecté." >> "$SUMMARY_FILE" fi diff --git a/scripts/agents/deployment_agent.sh b/scripts/agents/deployment_agent.sh index 21ce31a..623d19b 100644 --- a/scripts/agents/deployment_agent.sh +++ b/scripts/agents/deployment_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/deployment_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Déploiement" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(docs/DEPLOYMENT.md docs/RELEASE_PLAN.md .gitea/workflows/ci.yml) + any=0; for p in "${relevant[@]}"; do if is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi echo "## Résultats locaux" >> "$SUMMARY_FILE" ok=1 for f in docs/DEPLOYMENT.md docs/RELEASE_PLAN.md .gitea/workflows/ci.yml; do diff --git a/scripts/agents/documentation_agent.sh b/scripts/agents/documentation_agent.sh index 7c426c8..efbe5c5 100644 --- a/scripts/agents/documentation_agent.sh +++ b/scripts/agents/documentation_agent.sh @@ -5,6 +5,7 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/documentation_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Documentation" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" @@ -20,6 +21,25 @@ if ((${#missing[@]}==0)); then else echo "- Fichiers manquants:" >> "$SUMMARY_FILE" for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done + if [[ "${AUTO_FIX:-0}" == "1" ]]; then + echo >> "$SUMMARY_FILE" + echo "## Auto‑corrections" >> "$SUMMARY_FILE" + for m in "${missing[@]}"; do + case "$m" in + docs/INDEX.md) + mkdir -p docs && printf "# Index\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;; + docs/ARCHITECTURE.md) + mkdir -p docs && printf "# Architecture\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;; + docs/TESTING.md) + mkdir -p docs && printf "# Tests\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;; + docs/SECURITY_AUDIT.md) + mkdir -p docs && printf "# Security Audit\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;; + docs/DEPLOYMENT.md) + mkdir -p docs && printf "# Déploiement\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;; + *) : ;; + esac + done + fi fi PROMPT=$(cat <<'EOF' diff --git a/scripts/agents/frontend_agent.sh b/scripts/agents/frontend_agent.sh index bfbdaed..d101a89 100644 --- a/scripts/agents/frontend_agent.sh +++ b/scripts/agents/frontend_agent.sh @@ -5,6 +5,7 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/frontend_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Frontend" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" @@ -14,6 +15,11 @@ Définis des principes front: code splitting (React.lazy/Suspense), centralisati EOF ) pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(package.json tsconfig.json src/) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement frontend pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true echo "Rapport: $SUMMARY_FILE" diff --git a/scripts/agents/gitea_agent.sh b/scripts/agents/gitea_agent.sh index 2ba3f21..3dbbcdb 100644 --- a/scripts/agents/gitea_agent.sh +++ b/scripts/agents/gitea_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/gitea_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Gitea" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(.gitea/ISSUE_TEMPLATE/bug_report.md .gitea/ISSUE_TEMPLATE/feature_request.md .gitea/PULL_REQUEST_TEMPLATE.md .gitea/workflows/ci.yml) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement Gitea pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi need=(.gitea/ISSUE_TEMPLATE/bug_report.md .gitea/ISSUE_TEMPLATE/feature_request.md .gitea/PULL_REQUEST_TEMPLATE.md .gitea/workflows/ci.yml) missing=() for f in "${need[@]}"; do [[ -f "$f" ]] || missing+=("$f"); done diff --git a/scripts/agents/open_source_agent.sh b/scripts/agents/open_source_agent.sh index 62e7c6a..15b65e2 100644 --- a/scripts/agents/open_source_agent.sh +++ b/scripts/agents/open_source_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/open_source_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Open Source" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(LICENSE CONTRIBUTING.md CODE_OF_CONDUCT.md docs/OPEN_SOURCE_CHECKLIST.md) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement open source pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi need=(LICENSE CONTRIBUTING.md CODE_OF_CONDUCT.md docs/OPEN_SOURCE_CHECKLIST.md) missing=() for f in "${need[@]}"; do [[ -f "$f" ]] || missing+=("$f"); done diff --git a/scripts/agents/quality_tech.sh b/scripts/agents/quality_tech.sh index b9a62e8..a365f4d 100644 --- a/scripts/agents/quality_tech.sh +++ b/scripts/agents/quality_tech.sh @@ -9,6 +9,9 @@ if [[ -f "${HOME}/.4nk_template/.env" ]]; then set +a fi +# Portée (all|changed) +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true + TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" diff --git a/scripts/agents/run.ps1 b/scripts/agents/run.ps1 deleted file mode 100644 index 58d0311..0000000 --- a/scripts/agents/run.ps1 +++ /dev/null @@ -1,140 +0,0 @@ -Param( - [string]$TargetDir='.', - [string]$OutputDir='tests/reports/agents', - [string]$Agent='all' -) - -$bashOk = $false -try { - & bash -lc 'echo ok' | Out-Null - if ($LASTEXITCODE -eq 0) { $bashOk = $true } -} catch {} - -if ($bashOk) { - & bash "scripts/agents/run.sh" $TargetDir $OutputDir $Agent - exit $LASTEXITCODE -} - -# Fallback PowerShell (best-effort) lorsque bash n'est pas disponible -New-Item -ItemType Directory -Force -Path $OutputDir | Out-Null - -function Write-Report($name, $lines) { - $file = Join-Path $OutputDir $name - $lines | Out-File -FilePath $file -Encoding UTF8 -Force - Write-Host "Rapport: $file" -} - -Set-Location $TargetDir - -switch ($Agent) { - 'documentation' { - $missing = @() - $required = @('docs/INDEX.md','docs/project/INDEX.md','docs/templates/INDEX.md') - foreach ($f in $required) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Documentation', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Documentation essentielle présente.' } - else { $content += '- Fichiers manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'documentation_agent.md' $content - } - 'tests' { - $need = @('tests/unit','tests/integration','tests/connectivity','tests/external','tests/performance','tests/logs','tests/reports') - $missing = @(); foreach ($d in $need) { if (-not (Test-Path $d)) { $missing += $d } } - $content = @('# Agent Tests', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Structure de tests conforme.' } else { $content += '- Dossiers manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'tests_agent.md' $content - } - 'performance' { - $content = @('# Agent Performance', '', '## Résultats (fallback PowerShell)') - if (Test-Path 'tests/performance') { $content += '- tests/performance présent.' } else { $content += '- tests/performance manquant.' } - Write-Report 'performance_agent.md' $content - } - 'quality-technique' { - $missing = @() - $required = @('README.md','LICENSE','CONTRIBUTING.md','CODE_OF_CONDUCT.md','CHANGELOG.md','.gitea/workflows/ci.yml') - foreach ($f in $required) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Qualité technique', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Fichiers de base présents.' } - else { $content += '- Fichiers manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'quality_tech.md' $content - } - 'open-source' { - $missing = @() - $required = @('LICENSE','CONTRIBUTING.md','CODE_OF_CONDUCT.md','docs/OPEN_SOURCE_CHECKLIST.md') - foreach ($f in $required) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Open Source', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Pre-requis open source présents.' } - else { $content += '- Manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'open_source_agent.md' $content - } - 'securite' { - $missing = @(); foreach ($f in @('docs/SECURITY_AUDIT.md','.gitea/workflows/ci.yml')) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Sécurité', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Socle sécurité et CI présents.' } else { $content += '- Manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'security_agent.md' $content - } - 'deploiement' { - $missing = @(); foreach ($f in @('docs/DEPLOYMENT.md','.gitea/workflows/ci.yml')) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Déploiement', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Documentation et CI de déploiement présentes (à valider).' } else { $content += '- Manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'deployment_agent.md' $content - } - 'dependances' { - $content = @('# Agent Dépendances', '', '## Résultats (fallback PowerShell)','- Politique à documenter dans ARCHITECTURE/CONFIGURATION/CHANGELOG') - Write-Report 'dependances_agent.md' $content - } - 'compilation' { - $content = @('# Agent Compilation', '', '## Résultats (fallback PowerShell)') - if (Test-Path '.gitea/workflows/ci.yml') { $content += '- Étapes de build à vérifier dans la CI.' } else { $content += '- CI absente.' } - Write-Report 'compilation_agent.md' $content - } - 'resolution' { - $content = @('# Agent Résolution', '', '## Résultats (fallback PowerShell)') - if (Test-Path 'archive') { $content += '- Dossier archive/ présent pour REX.' } else { $content += '- Dossier archive/ manquant.' } - Write-Report 'resolution_agent.md' $content - } - 'ssh-scripts' { - $found = @(); $paths = @('scripts/auto-ssh-push.sh','scripts/init-ssh-env.sh','scripts/setup-ssh-ci.sh','scripts/scripts/auto-ssh-push.sh','scripts/scripts/init-ssh-env.sh','scripts/scripts/setup-ssh-ci.sh') - foreach ($p in $paths) { if (Test-Path $p) { $found += $p } } - $content = @('# Agent SSH et scripts', '', '## Résultats (fallback PowerShell)') - if ($found.Count -gt 0) { $content += '- Scripts trouvés:'; $found | ForEach-Object { $content += " - $_" } } else { $content += '- Aucun script standard détecté.' } - if (Test-Path 'docs/SSH_UPDATE.md') { $content += '- docs/SSH_UPDATE.md présent.' } - Write-Report 'ssh_scripts_agent.md' $content - } - 'frontend' { - $content = @('# Agent Frontend', '', '## Résultats (fallback PowerShell)','- Vérifier code splitting, état centralisé, abstraction services (si frontend présent).') - Write-Report 'frontend_agent.md' $content - } - 'gitea' { - $need = @('.gitea/ISSUE_TEMPLATE/bug_report.md','.gitea/ISSUE_TEMPLATE/feature_request.md','.gitea/PULL_REQUEST_TEMPLATE.md','.gitea/workflows/ci.yml') - $missing = @(); foreach ($f in $need) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Gitea', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- Configuration Gitea présente.' } else { $content += '- Manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'gitea_agent.md' $content - } - 'versionnage' { - $missing = @(); foreach ($f in @('CHANGELOG.md','TEMPLATE_VERSION')) { if (-not (Test-Path $f)) { $missing += $f } } - $content = @('# Agent Versionnage', '', '## Résultats (fallback PowerShell)') - if ($missing.Count -eq 0) { $content += '- CHANGELOG et TEMPLATE_VERSION présents.' } else { $content += '- Manquants:'; $missing | ForEach-Object { $content += " - $_" } } - Write-Report 'versionnage_agent.md' $content - } - 'sync-template' { - $content = @('# Agent Synchronisation de template', '', '## Résultats (fallback PowerShell)') - if (Test-Path '.gitea/workflows/template-sync.yml') { $content += '- Workflow template-sync présent.' } else { $content += '- Workflow template-sync manquant.' } - if (Test-Path '.4nk-sync.yml') { $content += '- Manifeste .4nk-sync.yml présent.' } else { $content += '- Manifeste .4nk-sync.yml manquant.' } - Write-Report 'sync_template_agent.md' $content - } - 'derogations-locales' { - $content = @('# Agent Dérogations locales', '', '## Résultats (fallback PowerShell)') - if ((Test-Path 'LOCAL_OVERRIDES.yml') -or (Test-Path '.gitea/workflows/LOCAL_OVERRIDES.yml')) { $content += '- Fichier de dérogations détecté.' } else { $content += '- Aucun fichier de dérogations détecté.' } - Write-Report 'derogations_locales_agent.md' $content - } - 'all' { - foreach ($a in @('documentation','tests','performance','quality-technique','open-source','securite','deploiement','dependances','compilation','resolution','ssh-scripts','frontend','gitea','versionnage','sync-template','derogations-locales')) { - & $PSCommandPath -TargetDir $TargetDir -OutputDir $OutputDir -Agent $a - } - } - default { - Write-Error "Agent inconnu (fallback): $Agent"; exit 2 - } -} -exit 0 diff --git a/scripts/agents/security_agent.sh b/scripts/agents/security_agent.sh index dbe43e4..00de948 100644 --- a/scripts/agents/security_agent.sh +++ b/scripts/agents/security_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/security_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Sécurité" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(scripts/security/audit.sh .gitea/workflows/ci.yml docs/SECURITY_AUDIT.md) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement sécurité pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi echo "## Résultats locaux" >> "$SUMMARY_FILE" if [[ -x scripts/security/audit.sh ]]; then if scripts/security/audit.sh >> "$SUMMARY_FILE" 2>&1; then diff --git a/scripts/agents/ssh_scripts_agent.sh b/scripts/agents/ssh_scripts_agent.sh index e6066af..28c347e 100644 --- a/scripts/agents/ssh_scripts_agent.sh +++ b/scripts/agents/ssh_scripts_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/ssh_scripts_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent SSH & scripts" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(scripts/auto-ssh-push.sh scripts/init-ssh-env.sh scripts/setup-ssh-ci.sh docs/SSH_UPDATE.md) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement SSH/scripts pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi paths=( scripts/auto-ssh-push.sh scripts/init-ssh-env.sh diff --git a/scripts/agents/structure_agent.sh b/scripts/agents/structure_agent.sh index 68eaf6d..724dac8 100644 --- a/scripts/agents/structure_agent.sh +++ b/scripts/agents/structure_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/structure_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Structure" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(docs .gitea scripts CHANGELOG.md AGENTS.md) + any=0; for p in "${relevant[@]}"; do if [[ -e "$p" ]] && is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement structurel pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi need=(docs .gitea scripts CHANGELOG.md AGENTS.md) missing=() for p in "${need[@]}"; do [[ -e "$p" ]] || missing+=("$p"); done diff --git a/scripts/agents/tests_agent.sh b/scripts/agents/tests_agent.sh index 5b380ea..afe6438 100644 --- a/scripts/agents/tests_agent.sh +++ b/scripts/agents/tests_agent.sh @@ -13,6 +13,7 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/tests_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Tests" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" @@ -29,6 +30,14 @@ if ((${#missing[@]}==0)); then else echo "- Dossiers manquants:" >> "$SUMMARY_FILE" for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done + if [[ "${AUTO_FIX:-0}" == "1" ]]; then + echo >> "$SUMMARY_FILE" + echo "## Auto‑corrections" >> "$SUMMARY_FILE" + for m in "${missing[@]}"; do + mkdir -p "$m" && echo "- Créé: $m" >> "$SUMMARY_FILE" + done + mkdir -p tests/reports/agents tests/logs || true + fi fi PROMPT=$(cat <<'EOF' diff --git a/scripts/agents/versionnage_agent.sh b/scripts/agents/versionnage_agent.sh index 20ccbaa..02136c0 100644 --- a/scripts/agents/versionnage_agent.sh +++ b/scripts/agents/versionnage_agent.sh @@ -5,11 +5,17 @@ TARGET_DIR="${1:-.}" OUTPUT_DIR="${2:-tests/reports/agents}" mkdir -p "$OUTPUT_DIR" SUMMARY_FILE="$OUTPUT_DIR/versionnage_agent.md" +source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true echo "# Agent Versionnage" > "$SUMMARY_FILE" echo >> "$SUMMARY_FILE" pushd "$TARGET_DIR" >/dev/null +if [[ "$SCOPE" == "changed" ]]; then + relevant=(CHANGELOG.md TEMPLATE_VERSION) + any=0; for p in "${relevant[@]}"; do if is_path_changed "$p"; then any=1; break; fi; done + if [[ $any -eq 0 ]]; then echo "- Aucun changement versionnage pertinent (SCOPE=changed)." >> "$SUMMARY_FILE"; echo "Rapport: $SUMMARY_FILE"; popd >/dev/null; exit 0; fi +fi ok=1 for f in CHANGELOG.md TEMPLATE_VERSION; do if [[ ! -f "$f" ]]; then echo "- Manquant: $f" >> "$SUMMARY_FILE"; ok=0; fi