Compare commits

..

34 Commits

Author SHA1 Message Date
Debian
6ced5d2923 feat: Mise à jour de l'index de documentation et suppression des templates génériques
Some checks failed
4NK Template Sync / check-and-sync (push) Has been cancelled
2025-08-29 16:29:55 +00:00
Debian
7f8dc0a926 [skip ci] chore(release): v2025.08.6 2025-08-28 15:56:17 +00:00
Debian
4c47efc9b4 fix(install): finalize host dependencies script 2025-08-28 15:30:42 +00:00
Debian
e43abef18f docs(usage): script installation host dependencies 2025-08-28 15:21:16 +00:00
Debian
043434bfe8 fix(agents): entrypoint utilisé; safe.directory; guard diff si hors repo 2025-08-28 14:48:08 +00:00
Debian
57c047e76d fix(agents): git -C partout; safe.directory; compat git (no show-current) 2025-08-28 14:46:04 +00:00
Debian
46d5d20c7d fix(push): compat git sans show-current (fallback branche) 2025-08-28 14:35:55 +00:00
Debian
99e1e0bda7 fix(agents): safe.directory et git -C pour éviter Not a git repository 2025-08-28 13:59:34 +00:00
Debian
948b11793a docs(USAGE): hooks pre-commit/pre-push via run_agents_for_project.sh; fix hooks 2025-08-28 11:58:27 +00:00
Debian
25453b045e feat(local): run_agents_for_project + ajustements pour image module 2025-08-28 11:36:04 +00:00
Debian
21e4f76445 feat: script pour lancer les agents sur des projets externes 2025-08-28 11:25:55 +00:00
Debian
5674437bc4 feat: test agents Docker et rapport des modifications 2025-08-28 11:19:19 +00:00
Debian
1add88bcbb feat: agents via Docker et rapport des modifications appliquées 2025-08-28 11:11:47 +00:00
27297dbb77 [skip ci] chore(release): v2025.08.5 2025-08-28 11:43:53 +02:00
01926eb9c0 [skip ci] merge: chore/docs-agents-ci-2025-08-27 -> main 2025-08-28 11:43:14 +02:00
5bf8bd280c [skip ci] chore: finalize local changes 2025-08-28 11:41:55 +02:00
a9f4ce0485 [skip ci] docs: intégration via Docker, stratégies merge tags→branches 2025-08-28 11:29:46 +02:00
ee48b95f54 [skip ci] docs: intégration template, exécution locale (hooks), CI_SKIP 2025-08-28 11:28:08 +02:00
86b01563fc [skip ci] chore(ci): CI_SKIP par défaut et documentation mise à jour 2025-08-28 11:23:38 +02:00
0783d30c10 chore(release): align TEMPLATE_VERSION to v2025.08.4 2025-08-28 11:04:18 +02:00
dc92b4082a feat(ci,agents,docs): conteneur unifié runner+agents, AUTO_FIX, SCOPE, docs MAJ 2025-08-28 11:04:17 +02:00
a624d091a0 feat(ci): image unifiée runner+agents (Dockerfile.ci, entrypoint, compose, helper) 2025-08-28 11:04:17 +02:00
86ad8eb62a fix(agents): LF + heredocs, charge .env conteneur, nettoyage rapports 2025-08-28 11:04:17 +02:00
68ce80c2cf dev(docker): add Debian image and run_container.sh to run agents in container 2025-08-28 11:04:17 +02:00
270ad3488c ci(runner): read env from C:\Users\Nicolas Cantu/4nk_template/.env; update README accordingly 2025-08-28 11:04:17 +02:00
8713c7f971 ci(runner): add docker-compose runner with self-hosted,linux labels and README 2025-08-28 11:04:16 +02:00
7f8e36f69e merge: chore/docs-agents-ci-2025-08-27 → main (v2025.08.3) 2025-08-28 00:28:34 +02:00
5210126c82 docs: minor normalize after release v2025.08.3 2025-08-28 00:28:31 +02:00
d02901689c chore(release): v2025.08.3 (README refonte; runners self-hosted,linux) 2025-08-28 00:27:09 +02:00
7aee843d9d docs(README): refonte ludique + Linux quickstart; ci: runners self-hosted,linux 2025-08-28 00:24:42 +02:00
fb1968f610 ci(runners): use runs-on [self-hosted, linux] across workflows; docs: add runner labels setup 2025-08-28 00:22:20 +02:00
dfa25324e1 ci(template-sync): use self-hosted runner label instead of linux 2025-08-28 00:18:56 +02:00
e1b89fa6ed merge: chore/docs-agents-ci-2025-08-27 → main (v2025.08.2) 2025-08-28 00:11:30 +02:00
c29e061c34 merge: chore/docs-agents-ci-2025-08-27 → main 2025-08-27 23:22:00 +02:00
81 changed files with 1241 additions and 520 deletions

View File

@ -1,3 +1,8 @@
# Règles SSH & Automatisation — Flux local
- Interdiction de secrets en clair; secrets via `~/.4nk_template/.env` ou variables CI
- Scripts SSH conservés exécutables, journaux non sensibles
- Le flux local prime: agents exécutés avant merge/push/release; CI neutralisable via `CI_SKIP=true` et `[skip ci]`
---
alwaysApply: true
---

View File

@ -25,6 +25,9 @@ Tous les projets issus de 4NK_project_template. Contrôle de lalignement sur
- Erreur bloquante si un path requis nexiste pas après sync.
- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles.
[note]
Les validations CI peuvent être remplacées par lexécution locale des agents (AUTO_FIX/SCOPE) lorsque `CI_SKIP=true` est activé. Conserver une PR de synthèse et la traçabilité dans le changelog.
[artefacts concernés]
- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md.
# Synchronisation de template (4NK)
@ -49,5 +52,8 @@ Tous les projets issus de 4NK_project_template. Contrôle de lalignement sur
- Erreur bloquante si un path requis nexiste pas après sync.
- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles.
[note]
Les validations CI peuvent être remplacées par lexécution locale des agents (AUTO_FIX/SCOPE) lorsque `CI_SKIP=true` est activé. Conserver une PR de synthèse et la traçabilité dans le changelog.
[artefacts concernés]
- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md.

View File

@ -21,3 +21,4 @@ tests/reports/
!/.cursor
!/AGENTS.md

View File

@ -11,12 +11,14 @@ on:
env:
RUST_VERSION: '1.70'
DOCKER_COMPOSE_VERSION: '2.20.0'
CI_SKIP: 'true'
jobs:
# Job de vérification du code
code-quality:
name: Code Quality
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
@ -64,7 +66,8 @@ jobs:
# Job de tests unitaires
unit-tests:
name: Unit Tests
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
@ -100,7 +103,8 @@ jobs:
# Job de tests d'intégration
integration-tests:
name: Integration Tests
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
services:
docker:
@ -147,7 +151,8 @@ jobs:
# Job de tests de sécurité
security-tests:
name: Security Tests
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
@ -184,7 +189,8 @@ jobs:
# Job de build et test Docker
docker-build:
name: Docker Build & Test
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
services:
docker:
@ -227,7 +233,8 @@ jobs:
# Job de tests de documentation
documentation-tests:
name: Documentation Tests
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
@ -242,7 +249,8 @@ jobs:
markdownlint:
name: Markdown Lint
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -272,7 +280,8 @@ jobs:
bash-required:
name: Bash Requirement
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -289,7 +298,8 @@ jobs:
agents-smoke:
name: Agents Smoke (no AI)
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -309,8 +319,8 @@ jobs:
openia-agents:
name: Agents with OpenIA
runs-on: ubuntu-latest
if: ${{ secrets.OPENAI_API_KEY != '' }}
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' && secrets.OPENAI_API_KEY != '' }}
env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
OPENAI_MODEL: ${{ vars.OPENAI_MODEL }}
@ -333,7 +343,8 @@ jobs:
deployment-checks:
name: Deployment Checks
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -350,7 +361,8 @@ jobs:
security-audit:
name: Security Audit
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -368,8 +380,9 @@ jobs:
# Job de release guard (cohérence release)
release-guard:
name: Release Guard
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
needs: [code-quality, unit-tests, documentation-tests, markdownlint, security-audit, deployment-checks, bash-required]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
uses: actions/checkout@v3
@ -401,7 +414,7 @@ jobs:
name: Create Release (Gitea API)
runs-on: ubuntu-latest
needs: [release-guard]
if: startsWith(github.ref, 'refs/tags/')
if: ${{ env.CI_SKIP != 'true' && startsWith(github.ref, 'refs/tags/') }}
env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
BASE_URL: ${{ vars.BASE_URL }}
@ -430,7 +443,8 @@ jobs:
# Job de tests de performance
performance-tests:
name: Performance Tests
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps:
- name: Checkout code
@ -455,9 +469,9 @@ jobs:
# Job de notification
notify:
name: Notify
runs-on: ubuntu-latest
runs-on: [self-hosted, linux]
needs: [code-quality, unit-tests, integration-tests, security-tests, docker-build, documentation-tests]
if: always()
if: ${{ env.CI_SKIP != 'true' && always() }}
steps:
- name: Notify success

View File

@ -7,7 +7,7 @@ on:
jobs:
check-and-sync:
runs-on: linux
runs-on: [self-hosted, linux]
steps:
- name: Lire TEMPLATE_VERSION et .4nk-sync.yml
# Doit charger ref courant, source_repo et périmètre paths

1
.gitignore vendored
View File

@ -34,3 +34,4 @@ git-installer.exe
# Ne pas ignorer .cursor ni AGENTS.md

View File

@ -399,3 +399,14 @@ Ce `AGENTS.md` mis à jour introduit l**Agent Synchronisation de template** e
La matrice de coordination formalise les validations obligatoires pour chaque type de changement, garantissant cohérence structurelle, qualité documentaire, sécurité, traçabilité.
Ainsi que la stabilité à long terme sur tous les projets issus de `4NK_project_template`.
---
## Exécution locale et neutralisation de la CI
- Les contrôles CI peuvent être remplacés par lexécution locale des agents: `scripts/agents/run.sh` avec `AUTO_FIX=1`, `SCOPE=changed|all`.
- La CI peut être neutralisée par défaut via `CI_SKIP=true` dans le workflow; ponctuellement via des commits `[skip ci]`.
- Des hooks sont fournis pour automatiser le flux local:
- `scripts/local/precommit.sh` et `scripts/local/prepush.sh`
- installation: `bash scripts/local/install_hooks.sh`
- Un conteneur unifié (runner+agents) permet une exécution reproductible: `docker-compose.ci.yml`.

View File

@ -26,14 +26,22 @@ et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Déploiement: copie étendue (.cursor, AGENTS.md, LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, TEMPLATE_VERSION, .markdownlint.json, .cursorignore, .gitignore, security/, scripts/)
### Changed
## [2025.08.3] - 2025-08-27
### Changed
- README refondu (ludique) avec Quickstart Debian, exécution agents sans arguments, secrets et CI
- Workflows Gitea configurés pour runners `self-hosted, linux` (docs mises à jour)
## [2025.08.2] - 2025-08-27
### Changed
- Renommage variable CI/Docs `GITEA_BASE_URL``BASE_URL`
- Exécution des agents simplifiée: `scripts/agents/run.sh` sans arguments par défaut
- CI mise à jour pour utiliser lexécution sans paramètres
## [2025.08.1] - 2025-08-27
### Added

177
README.md
View File

@ -1,128 +1,99 @@
# 4NK Project Template — Qualité, Sécurité et Open Source
# 4NK Project Template — Qualité, Sécurité, Open Source ✨
Ce dépôt est le template de référence 4NK. Il formalise la démarche de qualité, de sécurité et dopen source applicable à tous les projets 4NK et fournit des supports initiaux (modèles CI/CD, règles Cursor, scripts, guides). Chaque projet doit ladapter à ses spécificités, et proposer des améliorations en retour (feedback) vers ce template.
Bienvenue dans le template 4NK. Objectifs: démarrer vite, rester propre, publier serein. Vous y trouverez des règles, des workflows CI, des scripts dagents et une documentation prête à adapter.
## 📋 Table des Matières
## 📦 Ce que vous obtenez
- Standards de qualité et sécurité (lint, audit, releaseguard)
- Agents automatisés (qualité, docs, tests, sécurité, déploiement)
- CI Gitea prête à lemploi (selfhosted, linux)
- Documentation structurée: `docs/project/**` (ce dépôt) et `docs/templates/**` (modèles pour vos projets)
## 🏗️ Architecture
## 🐧 Linux (Debian) — Prérequis rapides
### 🔄 Flux de Données
```bash
sudo apt update
sudo apt install -y bash git curl jq ca-certificates
# Lint Markdown
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
```
## ⚙️ Configuration locale (secrets)
## 🚀 Démarrage Rapide
```bash
bash scripts/deploy/setup.sh # crée ~/.4nk_template/.env (chmod 600)
```
### Prérequis
À renseigner ensuite dans `~/.4nk_template/.env` (extraits):
- OPENAI_API_KEY, OPENAI_MODEL (si agents IA)
- RELEASE_TOKEN (release via API Gitea)
- BASE_URL (optionnel, par défaut `https://git.4nkweb.com`)
### Installation
Plus dinfos: `docs/project/CONFIGURATION.md` et `docs/project/GITEA_SETUP.md`.
## 🤖 Exécuter les agents
### Configuration SSH (Recommandé)
```bash
scripts/agents/run.sh # exécution complète, rapports dans tests/reports/agents
scripts/agents/run.sh . . documentation # exécution ciblée (facultatif)
```
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="<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`)
- Jobs clés: `markdownlint`, `agents-smoke`, `release-guard`, `release-create`
- Secrets/Variables: `RELEASE_TOKEN`, `OPENAI_API_KEY`, `BASE_URL`, `OPENAI_*`
## 🚀 Release
```bash
# Vérifier/mettre à jour la version
cat TEMPLATE_VERSION
# Tagger (déclenche la release via API si RELEASE_TOKEN existe côté dépôt)
git tag -a vYYYY.MM.P -m 'release: vYYYY.MM.P (latest)'
git push origin vYYYY.MM.P
```
Changelog: `CHANGELOG.md`. Gardien de release: `release-guard` en CI.
## 📚 Documentation
### 📖 Guides Principaux
- docs/TEMPLATE_ADAPTATION.md — Comment adapter ce template à votre projet
- docs/TEMPLATE_FEEDBACK.md — Comment proposer des améliorations au template
### 🔧 Guides Techniques
### 🧪 Guides de Test
### 🌐 Guides Réseau
## 🔧 Configuration
### Services Disponibles
### Variables d'Environnement
## 🧪 Tests et Monitoring
### Tests de Base
### Monitoring
### Tests de Performance
## 🌐 Réseau de Relais
### Architecture Mesh
### Ajout de Nœuds Externes
### Configuration Externe
## 🛠️ Développement
### Structure du Projet
### Ajout d'un Nouveau Service
### Modification de la Configuration
## 🚨 Dépannage
### Problèmes Courants
#### 1. Ports Déjà Utilisés
#### 2. Problèmes de Synchronisation
#### 3. Problèmes de Connectivité
### Logs Détaillés
### Healthchecks
## 📈 Performance
### Ressources Recommandées
### Optimisations
- Projet (ce dépôt): `docs/project/`
- Modèles à réutiliser: `docs/templates/`
- Standards de qualité: `docs/project/QUALITY_STANDARDS.md`
## 🤝 Contribution
1. Fork le repository
2. Créer une branche feature (`git checkout -b feature/nouvelle-fonctionnalite`)
3. Commit les changements (`git commit -am 'Ajout de nouvelle fonctionnalité'`)
4. Push la branche (`git push origin feature/nouvelle-fonctionnalite`)
5. Créer une Pull Request
Pour les améliorations du template luimême (règles, CI, scripts), se référer à `docs/TEMPLATE_FEEDBACK.md` et utiliser le type dissue « Template Feedback ».
- Fork → branche → PR (CI verte, docs/changelog à jour)
- Respect des règles éditoriales (français, pas de secrets, pas dexemples applicatifs)
## 📄 Licence
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
MIT — voir `LICENSE`.
## 🆘 Support
Pour obtenir de l'aide :
1. Consulter la [documentation](docs/)
2. Vérifier les [issues existantes](https://git.4nkweb.com/4nk/4NK_node/issues)
3. Créer une nouvelle issue avec les détails du problème
4. Inclure les logs et la configuration utilisée
---
- Lire `docs/project/INDEX.md`
- Ouvrir une issue si besoin

View File

@ -1,2 +1 @@
v2025.08.2
v2025.08.6

19
docker-compose.ci.yml Normal file
View File

@ -0,0 +1,19 @@
services:
project-ci:
build:
context: .
dockerfile: docker/Dockerfile.ci
image: 4nk-template-ci:latest
environment:
- RUNNER_MODE=${RUNNER_MODE:-agents}
- TARGET_DIR=/work
- OUTPUT_DIR=/work/tests/reports/agents
- BASE_URL
- REGISTRATION_TOKEN
volumes:
- ./:/work
- ${HOME}/.4nk_template/.env:/root/.4nk_template/.env:ro
tty: true
labels:
- "com.4nk.template=ci"

26
docker/Dockerfile.ci Normal file
View File

@ -0,0 +1,26 @@
FROM gitea/act_runner:nightly
USER root
RUN apk update || true && \
(apk add --no-cache bash curl jq git coreutils dos2unix || \
(apt-get update && apt-get install -y bash curl jq git coreutils dos2unix)) && \
mkdir -p /app /work /root/.4nk_template && chmod 700 /root/.4nk_template
WORKDIR /app
# Copier les scripts agents
COPY scripts /work/scripts
# Normaliser les fins de ligne et permissions
RUN find /work/scripts -type f -name "*.sh" -print0 | xargs -0 -r dos2unix -f && \
find /work/scripts -type f -name "*.sh" -exec chmod +x {} +
# Entrypoint unifié: lance le runner si variables présentes, sinon agents
COPY docker/entrypoint.ci.sh /entrypoint.sh
RUN dos2unix -f /entrypoint.sh && chmod +x /entrypoint.sh
WORKDIR /work
ENTRYPOINT ["/entrypoint.sh"]

10
docker/Dockerfile.debian Normal file
View File

@ -0,0 +1,10 @@
FROM debian:12-slim
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
bash curl jq ca-certificates git docker.io docker-compose-plugin \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /work
ENTRYPOINT ["/bin/bash","-lc"]

55
docker/entrypoint.ci.sh Normal file
View File

@ -0,0 +1,55 @@
#!/usr/bin/env bash
set -euo pipefail
# Charge l'env utilisateur si monté
if [[ -f "/root/.4nk_template/.env" ]]; then
set -a
. "/root/.4nk_template/.env"
set +a
fi
MODE="${RUNNER_MODE:-agents}"
TARGET_DIR="${TARGET_DIR:-/work}"
OUTPUT_DIR="${OUTPUT_DIR:-/work/tests/reports/agents}"
# Rendre le dépôt monté sûr pour Git (propriétaire différent dans le conteneur)
git config --global --add safe.directory "/work" || true
git config --global --add safe.directory "${TARGET_DIR}" || true
normalize_scripts() {
if command -v dos2unix >/dev/null 2>&1; then
find /work/scripts -type f -name "*.sh" -print0 | xargs -0 -r dos2unix -f || true
fi
find /work/scripts -type f -name "*.sh" -exec chmod +x {} + || true
}
start_runner() {
# Démarre le runner gitea/act_runner (processus au premier plan)
# Requiert : GITEA_INSTANCE_URL (BASE_URL), REGISTRATION_TOKEN ou config existante
if [[ -n "${BASE_URL:-}" && -n "${REGISTRATION_TOKEN:-}" ]]; then
act_runner register --no-interactive \
--instance "$BASE_URL" \
--token "$REGISTRATION_TOKEN" \
--labels "self-hosted,linux" || true
fi
exec act_runner daemon
}
run_agents() {
normalize_scripts
mkdir -p "$OUTPUT_DIR"
cd "$TARGET_DIR"
/work/scripts/agents/run.sh "$TARGET_DIR" "$OUTPUT_DIR" all || true
echo "Rapports disponibles dans $OUTPUT_DIR" >&2
}
case "$MODE" in
runner) start_runner ;;
agents) run_agents ;;
both)
start_runner &
run_agents
wait -n || true
;;
*) run_agents ;;
esac

2
docs/ARCHITECTURE.md Normal file
View File

@ -0,0 +1,2 @@
# Architecture

2
docs/DEPLOYMENT.md Normal file
View File

@ -0,0 +1,2 @@
# Déploiement

156
docs/INDEX.md Normal file
View File

@ -0,0 +1,156 @@
# 📚 Index de Documentation - 4NK_template
Index complet de la documentation du template 4NK pour la création de nouveaux projets.
## 🚀 Vue d'Ensemble
4NK_template est un template complet pour créer de nouveaux projets dans l'écosystème 4NK. Il fournit une structure standardisée avec tous les éléments nécessaires pour un projet open source moderne.
## 📖 Guides Principaux
### 🚀 [Guide d'Installation](INSTALLATION.md)
Guide complet pour installer et configurer un nouveau projet basé sur 4NK_template.
- **Prérequis système et logiciels**
- **Installation du template**
- **Configuration initiale**
- **Personnalisation du projet**
- **Tests post-installation**
### 📖 [Guide d'Utilisation](USAGE.md)
Guide complet pour utiliser le template et créer de nouveaux projets.
- **Création d'un nouveau projet**
- **Personnalisation de la structure**
- **Configuration des scripts**
- **Adaptation de la documentation**
- **Tests et validation**
### ⚙️ [Guide de Configuration](CONFIGURATION.md)
Guide complet pour configurer le template selon vos besoins.
- **Configuration générale**
- **Personnalisation des scripts**
- **Configuration CI/CD**
- **Configuration Docker**
- **Configuration de sécurité**
## 🔧 Guides Techniques
### 🏗️ [Architecture Technique](ARCHITECTURE.md)
Documentation technique détaillée de l'architecture du template.
- **Structure générale du template**
- **Composants principaux**
- **Scripts et utilitaires**
- **Configuration Docker**
- **Intégration CI/CD**
- **Sécurité et bonnes pratiques**
### 📡 [API Reference](API.md)
Documentation des APIs et interfaces du template.
- **Scripts disponibles**
- **Configuration des hooks Git**
- **Variables d'environnement**
- **Format des fichiers de configuration**
### 🔒 [Sécurité](SECURITY.md)
Guide de sécurité et bonnes pratiques.
- **Audit de sécurité**
- **Bonnes pratiques**
- **Configuration sécurisée**
- **Tests de sécurité**
## 🧪 Guides de Test
### 🧪 [Guide des Tests](TESTING.md)
Guide complet pour les tests du template.
- **Tests unitaires**
- **Tests d'intégration**
- **Tests de sécurité**
- **Tests de configuration**
### 🔍 [Audit de Sécurité](SECURITY_AUDIT.md)
Audit de sécurité détaillé du template.
- **Vulnérabilités connues**
- **Tests de pénétration**
- **Audit de code**
- **Recommandations de sécurité**
## 🔧 Guides de Développement
### 🔧 [Guide de Développement](DEVELOPMENT.md)
Guide complet pour le développement avec le template.
- **Environnement de développement**
- **Workflow de développement**
- **Standards de code**
- **Debugging et profiling**
- **Optimisation des performances**
## 📊 Déploiement
### 🚀 [Guide de Déploiement](DEPLOYMENT.md)
Guide complet pour déployer des projets basés sur le template.
- **Configuration de production**
- **Déploiement Docker**
- **Intégration CI/CD**
- **Monitoring et observabilité**
## 🎯 Navigation Rapide
### 🚀 Démarrage Rapide
1. [Installation](INSTALLATION.md) - Installer le template
2. [Configuration](CONFIGURATION.md) - Configurer le projet
3. [Utilisation](USAGE.md) - Créer un nouveau projet
### 🔧 Développement
1. [Architecture](ARCHITECTURE.md) - Comprendre l'architecture
2. [API](API.md) - Consulter les APIs
3. [Tests](TESTING.md) - Exécuter les tests
### 📚 Documentation
1. [Index](INDEX.md) - Cet index
2. [Déploiement](DEPLOYMENT.md) - Guide de déploiement
---
## 🧪 Tests et Validation
### Tests Automatisés
```bash
# Tests du template
./scripts/test-template.sh
# Tests de configuration
./scripts/test-config.sh
# Tests de sécurité
./scripts/security-audit.sh
```
---
## 🚀 Développement
### Commandes Essentielles
```bash
# Créer un nouveau projet
./scripts/create-project.sh my-new-project
# Configurer un projet existant
./scripts/setup-project.sh
# Tests du template
./scripts/test-template.sh
```
---
## 📊 Métriques
### Fonctionnalités
- **Structure standardisée** : ✅ Complète
- **Scripts automatisés** : ✅ Disponibles
- **Configuration CI/CD** : ✅ Intégrée
- **Documentation** : ✅ Template complet
- **Tests** : ✅ Automatisés
---
**📚 Documentation complète pour 4NK_template - Template pour nouveaux projets 4NK** 🚀

2
docs/SECURITY_AUDIT.md Normal file
View File

@ -0,0 +1,2 @@
# Security Audit

2
docs/TESTING.md Normal file
View File

@ -0,0 +1,2 @@
# Tests

View File

@ -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 lanalyse IA
- (Option) conteneur unifié runner+agents: `docker-compose.ci.yml`
## 3. Commandes
@ -23,6 +24,18 @@ 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 <nom>`
- 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`
## 10. Intégration dans un projet existant
```bash
bash scripts/deploy/setup.sh <git_url_du_projet> [--dest DIR] [--force]
# Compléter ~/.4nk_template/.env si besoin
```
## 4. Agents disponibles
- Documentation (`documentation`): fichiers essentiels et index
@ -53,13 +66,22 @@ 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. Autocorrections (optionnelles)
- `AUTO_FIX=1` permet aux agents dappliquer 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
- Documenter les décisions dans le changelog et la doc
- Si contrôle local complet: activer `CI_SKIP=true` côté dépôt pour ne pas consommer la CI; ajouter au besoin `[skip ci]` dans les commits automatisés

View File

@ -3,9 +3,25 @@
## Variables denvironnement (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 lAPI 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 lAPI 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)
- **Flag de gel CI**:
- `CI_SKIP` (défaut `true` dans le template): quand `true`, les jobs CI sont courtcircuités
- Définir à `false` pour réactiver la CI côté dépôt
- Alternative ponctuelle: commit message `[skip ci]`
## Variables denvironnement (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 lensemble du dépôt
- `changed`: focalise les contrôles/corrections sur les fichiers modifiés du dernier commit
## Conventions
@ -17,6 +33,21 @@
- 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 lentrypoint `docker/entrypoint.ci.sh`:
- `RUNNER_MODE` détermine le mode dexécution
- `BASE_URL` et `REGISTRATION_TOKEN` servent à lenregistrement du runner (act_runner)
## Commit message — désactiver la CI ponctuellement
- Ajouter `[skip ci]` au message de commit pour ignorer un run côté Gitea Actions
## Gestion locale des secrets (~/.4nk_template/.env)
- Modèle fourni: `scripts/env/.env.template` (clés sans valeurs)

View File

@ -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="<token>"
docker compose -f docker-compose.ci.yml up -d
```

View File

@ -22,11 +22,20 @@
- Nom: `RELEASE_TOKEN` ; Valeur: un token personnel avec portée API sur le dépôt
- Le job `release-create` utilisera ce secret lors dun push de tag `v*`
### Runner Gitea (labels)
- Configurez votre runner avec 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

View File

@ -16,6 +16,23 @@
- Tagging: `vX.Y.Z` ou `vX.Y.Z-wip.N`
- Notes de release (résumé, changements majeurs, impacts)
### Stratégies de merge (tags → branches cibles)
- Tag sur `main` (latest):
- Aligner `TEMPLATE_VERSION` et `CHANGELOG.md` sur la branche de travail
- Taguer `vX.Y.Z` puis merger la branche (PR) vers `main`
- Si flux local (CI désactivée): appliquer les agents en local avant tag/push
- Tag sur `develop` (prérelease/wip):
- Utiliser `vX.Y.Z-wip.N` pour itérer
- Merger régulièrement vers `develop`; rebase/merge planifié vers `main` pour la release finale
### Cas particuliers
- Merge de tag existant vers `main` ou `develop`:
- Créer une PR contenant lalignement version/changelog correspondant au tag
- Appliquer les agents (localement si CI neutre) puis merger
## Postlancement
- Suivi issues/retours

View File

@ -1,3 +1,13 @@
### Installation des dépendances hôte (Debian/Ubuntu)
Exécuter en root:
```bash
sudo ./scripts/local/install_host_deps.sh
```
Ce script installe: `dos2unix`, `rsync`, `direnv`, `git`, `curl`, `vim`, `tree`, `sed`, `net-tools`, `iproute2`, `procps`, `lsof`, `psmisc`, `htop`, `dstat`, `iotop`, `strace`, `ltrace`, `tcpdump`, `nmap`, `wget`, `jq`, `gawk`, `grep`, `coreutils`, `dnsutils`, `traceroute`, `whois`, `sysstat`, `iputils-ping`, `iputils-tracepath`, ainsi que Docker (`docker-ce`, `docker-ce-cli`, `containerd.io`, `docker-buildx-plugin`, `docker-compose-plugin`).
# Guide dusage — 4NK_template (projet)
Ce document explique comment utiliser le template pour initier, documenter, contrôler et publier des projets dérivés, en respectant les standards qualité, sécurité et open source.
@ -15,6 +25,25 @@ Ce document explique comment utiliser le template pour initier, documenter, cont
3) Tenir `docs/INDEX.md` et `CHANGELOG.md` à jour
4) Activer les workflows CI et vérifier `release-guard`/`security-audit`
## 2.1 Intégrer 4NK_template dans un projet existant
```bash
# Depuis le dépôt 4NK_template
bash scripts/deploy/setup.sh <git_url_du_projet> [--dest DIR] [--force]
# Compléter ensuite ~/.4nk_template/.env si nécessaire (OPENAI_*, BASE_URL, RELEASE_TOKEN)
```
### Intégration via Docker (recommandé)
```bash
# Build limage unifiée
docker compose -f docker-compose.ci.yml build
# Appliquer le template depuis le conteneur (monter le repo projet sur /host)
docker run --rm -v "$PWD":/work -v "/chemin/vers/projet":/host 4nk-template-ci:latest \
bash -lc "/work/scripts/deploy/setup.sh file:///host/.git --dest /host"
```
## 3. Documentation
- Utiliser les squelettes de `docs/templates/**` comme base
@ -25,9 +54,79 @@ 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 <nom>`
- Rapports: `tests/reports/agents/*.md`
- 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`
- Autocorrections: `AUTO_FIX=1` pour créer la structure de tests et des squelettes docs
## 5. Remplacer la CI par une exécution locale (recommandé)
- CI neutre par défaut: `CI_SKIP=true` dans le workflow; réactivez en le passant à `false` côté dépôt.
- Commits: contrôles rapides avant commit
```bash
npx -y markdownlint-cli "**/*.md" --ignore "archive/**"
AUTO_FIX=1 SCOPE=changed scripts/agents/run.sh
# Ajoutez [skip ci] dans le message de commit pour éviter les runs distants
```
- Push: contrôles complets prépush
```bash
AUTO_FIX=1 SCOPE=all scripts/agents/run.sh
bash scripts/security/audit.sh || true
# Si outillage présent (exemples): cargo check / go vet / npx eslint / tsc --noEmit / ruff…
bash scripts/release/guard.sh || true
```
- Release locale (puis push tag)
```bash
echo "vYYYY.MM.P" > TEMPLATE_VERSION
git add TEMPLATE_VERSION CHANGELOG.md
git commit -m "[skip ci] chore(release): vYYYY.MM.P"
git tag -a vYYYY.MM.P -m "release: vYYYY.MM.P (latest)"
git push && git push origin vYYYY.MM.P
```
### Hooks conseillés (agents centralisés via 4NK_template)
`.git/hooks/pre-commit`:
```bash
#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(git rev-parse --show-toplevel)"
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
```
`.git/hooks/pre-push`:
```bash
#!/usr/bin/env bash
set -euo pipefail
PROJECT_DIR="$(git rev-parse --show-toplevel)"
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
if [ -f "${PROJECT_DIR}/scripts/security/audit.sh" ]; then (cd "${PROJECT_DIR}" && bash scripts/security/audit.sh) || true; fi
if [ -f "${PROJECT_DIR}/scripts/release/guard.sh" ]; then (cd "${PROJECT_DIR}" && bash scripts/release/guard.sh) || true; fi
```
Ou installez-les automatiquement (les hooks fournis appellent déjà le runner centralisé):
```bash
bash scripts/local/install_hooks.sh
```
- Agents utiles en premier passage: `documentation`, `quality-technique`, `open-source`, `securite`, `deploiement`
### Script de merge local (main/develop)
```bash
# Merge de la branche courante vers main (valide localement avant)
bash scripts/local/merge_branch.sh main
# Merge vers develop
bash scripts/local/merge_branch.sh develop
```
## 5. Qualité et CI
- Jobs attendus: qualité, tests (catégories pertinentes), documentation, securityaudit, bashrequired, releaseguard

View File

@ -1,8 +0,0 @@
# Référence API — Template
- Vue densemble
- Authentification/permissions
- Endpoints par domaine (schémas, invariants)
- Codes derreur
- Limites et quotas
- Sécurité et conformité

View File

@ -1,8 +0,0 @@
# Architecture — Template
- Contexte et objectifs
- Découpage en couches (UI, services, données)
- Flux principaux
- Observabilité
- CI/CD
- Contraintes et SLA

View File

@ -1,6 +0,0 @@
# Configuration — Template
- Variables denvironnement (nom, type, défaut, portée)
- Fichiers de configuration (format, validation)
- Réseau et sécurité (ports, TLS, auth)
- Observabilité (logs, métriques, traces)

View File

@ -1,12 +0,0 @@
# Index — Templates de documentation (pour projets dérivés)
Utilisez ces squelettes pour démarrer la documentation de votre projet.
- API.md — squelette de référence API
- ARCHITECTURE.md — squelette darchitecture
- CONFIGURATION.md — squelette de configuration
- USAGE.md — squelette dusage
- TESTING.md — squelette de stratégie de tests
- SECURITY_AUDIT.md — squelette daudit sécurité
- RELEASE_PLAN.md — squelette de plan de release
- OPEN_SOURCE_CHECKLIST.md — squelette de checklist open source

View File

@ -1,7 +0,0 @@
# Checklist open source — Template
- Gouvernance: LICENSE, CONTRIBUTING, CODE_OF_CONDUCT
- CI/CD: workflows, tests, security-audit, release-guard
- Documentation: README, INDEX, guides essentiels
- Sécurité: secrets, permissions, audit
- Publication: tag, changelog, release notes

View File

@ -1,29 +0,0 @@
# README — Template de projet
## Présentation
Décrivez brièvement lobjectif du projet, son périmètre et ses utilisateurs cibles.
## Démarrage rapide
- Prérequis (langages/outils)
- Étapes dinstallation
- Commandes de démarrage
## Documentation
- Index: `docs/INDEX.md`
- Architecture: `docs/ARCHITECTURE.md`
- Configuration: `docs/CONFIGURATION.md`
- Tests: `docs/TESTING.md`
- Sécurité: `docs/SECURITY_AUDIT.md`
- Déploiement: `docs/DEPLOYMENT.md`
## Contribution
- GUIDE: `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`
- Processus de PR et revues
## Licence
- Indiquez la licence choisie (MIT/Apache-2.0/GPL)

View File

@ -1,7 +0,0 @@
# Plan de release — Template
- Vue densemble, objectifs, date cible
- Préparation (docs/CI/tests/sécurité)
- Communication (annonces, canaux)
- Lancement (checklist, tagging)
- Postlancement (support, retours)

View File

@ -1,7 +0,0 @@
# Audit de sécurité — Template
- Menaces et surfaces dattaque
- Contrôles préventifs et détectifs
- Gestion des secrets
- Politique de dépendances
- Vérifications CI (security-audit)

View File

@ -1,6 +0,0 @@
# Tests — Template
- Pyramide: unit, integration, connectivity, external, performance
- Structure des répertoires
- Exécution et rapports
- Intégration CI

View File

@ -1,7 +0,0 @@
# Usage — Template
- Démarrage quotidien
- Opérations courantes
- Tests (référence vers TESTING.md)
- Sécurité (référence vers SECURITY_AUDIT.md)
- Déploiement (référence vers DEPLOYMENT.md)

49
runner/README.md Normal file
View File

@ -0,0 +1,49 @@
# Runner Gitea (act_runner)
Ce dossier contient une configuration prête à l'emploi pour exécuter un runner Gitea via Docker Compose.
## Prérequis
- Hôte Linux avec Docker et Docker Compose
- URL de l'instance Gitea et un token d'enregistrement (repo/org/instance)
## Configuration
- Le runner lit un fichier .env GLOBAL: `$HOME/4nk_template/.env` (commun à tous les dépôts)
- Variables attendues dans ce fichier:
- `INSTANCE_URL` (ex: `https://git.4nkweb.com`)
- `REGISTRATION_TOKEN` (token d'enregistrement)
- `RUNNER_NAME` (optionnel)
- `RUNNER_LABELS` (optionnel, défaut: `self-hosted,linux`)
- Aucun `.env` local dans `runner/` nest nécessaire.
Exemple de contenu minimal:
```dotenv
INSTANCE_URL=https://git.4nkweb.com
REGISTRATION_TOKEN=...
RUNNER_NAME=$(hostname)-runner
RUNNER_LABELS=self-hosted,linux
```
## Démarrage
```bash
cd runner
docker compose up -d
```
Le runner s'enregistre automatiquement et apparaît dans Settings → Actions → Runners.
## Arrêt / Mise à jour
```bash
docker compose down
# Mise à jour d'image
docker compose pull && docker compose up -d
```
## Mode éphémère (optionnel)
Activez `GITEA_RUNNER_EPHEMERAL=1` dans `docker-compose.yml` pour des runners jetables.
Réf: Gitea Act Runner — https://docs.gitea.com/usage/actions/act-runner

18
runner/docker-compose.yml Normal file
View File

@ -0,0 +1,18 @@
version: "3.8"
services:
runner:
image: docker.io/gitea/act_runner:nightly
container_name: gitea-act-runner
restart: unless-stopped
env_file:
- ${USERPROFILE}/.4nk_template/.env
environment:
- GITEA_RUNNER_LABELS=${RUNNER_LABELS:-self-hosted,linux}
- GITEA_RUNNER_NAME=${RUNNER_NAME:-local-runner}
- GITEA_INSTANCE_URL=${INSTANCE_URL}
- GITEA_RUNNER_REGISTRATION_TOKEN=${REGISTRATION_TOKEN}
# Uncomment to enable ephemeral mode
# - GITEA_RUNNER_EPHEMERAL=1
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock

8
scripts/agents/ai_prompt.sh Normal file → Executable file
View File

@ -4,6 +4,14 @@ set -euo pipefail
# Utilitaire générique pour appeler l'API OpenAI Chat Completions.
# Prérequis: variable d'environnement OPENAI_API_KEY et curl.
# Chargement env utilisateur (~/.4nk_template/.env) pour exécutions locales/CI docke
"$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/env/ensure_env.sh" || true
if [[ -f "${HOME}/.4nk_template/.env" ]]; then
set -a
. "${HOME}/.4nk_template/.env"
set +a
fi
for bin in curl jq; do
if ! command -v "$bin" >/dev/null 2>&1; then
echo "$bin manquant. Installez $bin." >&2

19
scripts/agents/common.sh Executable file
View File

@ -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 -C "${TARGET_DIR:-.}" 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
}

12
scripts/agents/compilation_agent.sh Normal file → Executable file
View File

@ -5,22 +5,28 @@ 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
echo "- Étapes de compilation non détectées dans la CI (à ajouter si nécessaire)." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Précise une cadence de compilation (avant refactor/push, après update deps) et les conditions de blocage si erreurs.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/dependances_agent.sh Normal file → Executable file
View File

@ -5,21 +5,27 @@ 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
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Établis une politique de dépendances: ajout automatique si justifié, vérification des dernières versions stables, documentation des impacts (ARCHITECTURE, CONFIGURATION, CHANGELOG), et rollback.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/deployment_agent.sh Normal file → Executable file
View File

@ -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
@ -17,11 +23,11 @@ for f in docs/DEPLOYMENT.md docs/RELEASE_PLAN.md .gitea/workflows/ci.yml; do
done
if [[ $ok -eq 1 ]]; then echo "- Prérequis documentaires présents." >> "$SUMMARY_FILE"; fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Établis une checklist de déploiement minimale (préchecks, variables, smoke tests, rollback, postdeploy) adaptée à un template CI Gitea.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

6
scripts/agents/derogations_locales_agent.sh Normal file → Executable file
View File

@ -16,11 +16,11 @@ else
echo "- Aucun fichier de dérogations locales détecté." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Définis un format pour enregistrer les dérogations (path, raison, propriétaire, échéance), tolérance CI, et revue périodique.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

26
scripts/agents/documentation_agent.sh Normal file → Executable file
View File

@ -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,13 +21,32 @@ 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 "## Autocorrections" >> "$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 <<'P'
PROMPT=$(cat <<'EOF'
Élabore une liste courte daméliorations documentation (INDEX à jour, traçabilité changes ↔ CHANGELOG, sections sécurité/tests/déploiement).
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

8
scripts/agents/documents_bureautiques_agent.sh Normal file → Executable file
View File

@ -10,7 +10,7 @@ echo "# Agent Documents bureautiques" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null
docsx=$(git ls-files '*.docx' 2>/dev/null || true)
docsx=$(git -C "$TARGET_DIR" ls-files '*.docx' 2>/dev/null || true)
if [[ -z "$docsx" ]]; then
echo "- Aucun fichier .docx détecté." >> "$SUMMARY_FILE"
else
@ -19,11 +19,11 @@ else
echo "- Utiliser docx2txt pour extraction et documenter dans docs/INDEX.md" >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Décris une procédure standard de traitement des .docx (docx2txt, import, traçabilité dans docs/INDEX.md) et les risques à éviter.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

8
scripts/agents/donnees_csv_agent.sh Normal file → Executable file
View File

@ -10,7 +10,7 @@ echo "# Agent Données CSV" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null
csvs=$(git ls-files '*.csv' 2>/dev/null || true)
csvs=$(git -C "$TARGET_DIR" ls-files '*.csv' 2>/dev/null || true)
if [[ -z "$csvs" ]]; then
echo "- Aucun CSV détecté dans le dépôt." >> "$SUMMARY_FILE"
else
@ -18,11 +18,11 @@ else
echo "$csvs" | sed 's/^/ - /' >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
À partir des CSV présents (entêtes multilignes possibles), propose une méthode pour définir toutes les colonnes, types et validations, et pointer vers les docs à mettre à jour (API, ARCHITECTURE, USAGE).
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

6
scripts/agents/fondation_agent.sh Normal file → Executable file
View File

@ -18,11 +18,11 @@ done
if [[ $issues -eq 0 ]]; then echo "- Conformité éditoriale de base: OK (présence des fichiers clés)." >> "$SUMMARY_FILE"; fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Évalue la conformité éditoriale (français, pas dexemples applicatifs, intro/conclusion) et liste 5 actions damélioration priorisées.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/frontend_agent.sh Normal file → Executable file
View File

@ -5,16 +5,22 @@ 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"
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Définis des principes front: code splitting (React.lazy/Suspense), centralisation détat (Redux/Context), abstraction des services, et tests associés.
P
EOF
)
pushd "$TARGET_DIR" >/dev/null
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
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"
popd >/dev/null

12
scripts/agents/gitea_agent.sh Normal file → Executable file
View File

@ -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
@ -20,11 +26,11 @@ else
echo "- Manquants:" >> "$SUMMARY_FILE"; for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Propose des vérifications CI additionnelles Gitea (lint, tests, sécurité, scripts exécutables) et notifications en cas déchecs.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

8
scripts/agents/lang_detect.sh Normal file → Executable file
View File

@ -12,7 +12,7 @@ export HAS_NODE=0 HAS_TYPESCRIPT=0 HAS_GO=0 HAS_RUST=0 HAS_PYTHON=0 HAS_SHELL_BA
# Node / TypeScript
if has_file package.json; then HAS_NODE=1; fi
if has_file tsconfig.json || git ls-files '*.ts' | grep -q . 2>/dev/null; then HAS_TYPESCRIPT=1; fi
if has_file tsconfig.json || git -C "${TARGET_DIR:-.}" ls-files '*.ts' | grep -q . 2>/dev/null; then HAS_TYPESCRIPT=1; fi
# Go
if has_file go.mod || has_file go.work; then HAS_GO=1; fi
@ -21,13 +21,13 @@ if has_file go.mod || has_file go.work; then HAS_GO=1; fi
if has_file Cargo.toml; then HAS_RUST=1; fi
# Python
if has_file pyproject.toml || has_file requirements.txt || git ls-files '*.py' | grep -q . 2>/dev/null; then HAS_PYTHON=1; fi
if has_file pyproject.toml || has_file requirements.txt || git -C "${TARGET_DIR:-.}" ls-files '*.py' | grep -q . 2>/dev/null; then HAS_PYTHON=1; fi
# Shell (bash)
if git ls-files '*.sh' | grep -q . 2>/dev/null; then HAS_SHELL_BASH=1; fi
if git -C "${TARGET_DIR:-.}" ls-files '*.sh' | grep -q . 2>/dev/null; then HAS_SHELL_BASH=1; fi
# PowerShell (pwsh)
if git ls-files '*.ps1' | grep -q . 2>/dev/null; then HAS_SHELL_PWSH=1; fi
if git -C "${TARGET_DIR:-.}" ls-files '*.ps1' | grep -q . 2>/dev/null; then HAS_SHELL_PWSH=1; fi
# Exposer aussi l'état des outils lorsquils existent
export HAS_NPM=0 HAS_NPX=0 HAS_GO_BIN=0 HAS_CARGO=0 HAS_PYTHON_BIN=0 HAS_PIP=0 HAS_SHELLCHECK=0 HAS_PWSH=0

12
scripts/agents/open_source_agent.sh Normal file → Executable file
View File

@ -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
@ -20,11 +26,11 @@ else
echo "- Manquants:" >> "$SUMMARY_FILE"; for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Propose une checklist pour préparer louverture open source (gouvernance, CI, sécurité, documentation) compatible avec Gitea.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

6
scripts/agents/performance_agent.sh Normal file → Executable file
View File

@ -16,11 +16,11 @@ else
echo "- Dossier tests/performance manquant." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Propose un plan minimal de tests de performance reproductibles (outillage, métriques, critères de succès) et archivage des rapports.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

14
scripts/agents/qualite_formelle.sh Normal file → Executable file
View File

@ -1,6 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
# Chargement env utilisateur (~/.4nk_template/.env)
"$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/env/ensure_env.sh" || true
if [[ -f "${HOME}/.4nk_template/.env" ]]; then
set -a
. "${HOME}/.4nk_template/.env"
set +a
fi
TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR"
@ -21,11 +29,11 @@ if [[ $issues -eq 0 ]]; then
echo "- Aucun problème formel bloquant détecté." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Évalue la qualité formelle (français uniquement, typographie, absence dexemples applicatifs, intro/conclusion) et propose 5 recommandations priorisées.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

19
scripts/agents/quality_tech.sh Normal file → Executable file
View File

@ -1,6 +1,17 @@
#!/usr/bin/env bash
set -euo pipefail
# Chargement env utilisateur (~/.4nk_template/.env)
"$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/env/ensure_env.sh" || true
if [[ -f "${HOME}/.4nk_template/.env" ]]; then
set -a
. "${HOME}/.4nk_template/.env"
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"
@ -64,7 +75,7 @@ if [[ "$HAS_PYTHON" -eq 1 ]]; then
fi
if [[ "$HAS_SHELL_BASH" -eq 1 ]]; then
if [[ "$HAS_SHELLCHECK" -eq 1 ]]; then
(git ls-files '*.sh' | xargs -r shellcheck >/dev/null 2>&1 && echo "- Shell: shellcheck OK" >> "$SUMMARY_FILE") || echo "- Shell: shellcheck a signalé des problèmes" >> "$SUMMARY_FILE"
(git -C "$TARGET_DIR" ls-files '*.sh' | xargs -r shellcheck >/dev/null 2>&1 && echo "- Shell: shellcheck OK" >> "$SUMMARY_FILE") || echo "- Shell: shellcheck a signalé des problèmes" >> "$SUMMARY_FILE"
else
echo "- Shell: shellcheck non disponible" >> "$SUMMARY_FILE"
fi
@ -74,11 +85,11 @@ if [[ "$HAS_SHELL_PWSH" -eq 1 && "$HAS_PWSH" -eq 1 ]]; then
fi
# IA (optionnelle)
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Analyse la conformité qualité technique du dépôt selon AGENTS.md et la CI. Priorise: lint/format/type-check, structure de tests, cohérence docs/CI, sécurité basique. Propose 5 actions concrètes.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

6
scripts/agents/resolution_agent.sh Normal file → Executable file
View File

@ -16,11 +16,11 @@ else
echo "- Dossier archive/ manquant (recommandé pour REX)." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Décris la boucle de triage complète (repro minimale, logs, bissection, hypothèses, tests ciblés, correctif, nonrégression) et quand produire un REX.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

View File

@ -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 += '- Pré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 & 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

163
scripts/agents/run.sh Normal file → Executable file
View File

@ -12,94 +12,105 @@ fi
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}"
AGENT="${3:-all}"
mkdir -p "$OUTPUT_DIR"
# Capture état avant
pushd "$TARGET_DIR" >/dev/null || true
before_status_file="$OUTPUT_DIR/.before_status.txt"
after_status_file="$OUTPUT_DIR/.after_status.txt"
changes_report="$OUTPUT_DIR/changes_applied.md"
(git -C "$TARGET_DIR" status --porcelain || true) > "$before_status_file" 2>/dev/null || true
popd >/dev/null || true
usage() {
cat <<USAGE
Usage: $0 [target_dir] [output_dir] [agent]
Agents:
Fondamentaux: fondation, structure
Documentation: documentation, donnees-csv, documents-bureautiques
Tests: tests, performance
Techniques: qualite-technique, quality-tech, dependances, compilation, resolution, ssh-scripts
Frontend: frontend
Open source et CI: open-source, gitea, versionnage, securite, deploiement
Synchronisation: sync-template, derogations-locales
all
Par défaut: all
Agents: fondation, structure, documentation, donnees-csv, documents-bureautiques,
tests, performance, qualite-technique/quality-tech, dependances, compilation,
resolution, ssh-scripts, frontend, open-source, gitea, versionnage,
securite, deploiement, sync-template, derogations-locales, runner, all
USAGE
}
AGENT="${3:-all}"
run_agent() {
local script_name="$1"
"$DIR/${script_name}" "$TARGET_DIR" "$OUTPUT_DIR" || true
}
case "$AGENT" in
quality-tech|qualite-technique)
"$DIR/quality_tech.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
qualite-formelle|fondation)
"$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR" || "$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
structure)
"$DIR/structure_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
tests)
"$DIR/tests_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
performance)
"$DIR/performance_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
documentation)
"$DIR/documentation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
donnees-csv)
"$DIR/donnees_csv_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
documents-bureautiques)
"$DIR/documents_bureautiques_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
securite)
"$DIR/security_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
deploiement)
"$DIR/deployment_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
dependances)
"$DIR/dependances_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
compilation)
"$DIR/compilation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
resolution)
"$DIR/resolution_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
ssh-scripts)
"$DIR/ssh_scripts_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
frontend)
"$DIR/frontend_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
open-source)
"$DIR/open_source_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
gitea)
"$DIR/gitea_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
versionnage)
"$DIR/versionnage_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
sync-template)
"$DIR/sync_template_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
derogations-locales)
"$DIR/derogations_locales_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;;
runner) run_agent "runner_agent.sh" ;;
quality-tech|qualite-technique) run_agent "quality_tech.sh" ;;
qualite-formelle|fondation) "$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true; "$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true ;;
structure) run_agent "structure_agent.sh" ;;
tests) run_agent "tests_agent.sh" ;;
performance) run_agent "performance_agent.sh" ;;
documentation) run_agent "documentation_agent.sh" ;;
donnees-csv) run_agent "donnees_csv_agent.sh" ;;
documents-bureautiques)run_agent "documents_bureautiques_agent.sh" ;;
securite) run_agent "security_agent.sh" ;;
deploiement) run_agent "deployment_agent.sh" ;;
dependances) run_agent "dependances_agent.sh" ;;
compilation) run_agent "compilation_agent.sh" ;;
resolution) run_agent "resolution_agent.sh" ;;
ssh-scripts) run_agent "ssh_scripts_agent.sh" ;;
frontend) run_agent "frontend_agent.sh" ;;
open-source) run_agent "open_source_agent.sh" ;;
gitea) run_agent "gitea_agent.sh" ;;
versionnage) run_agent "versionnage_agent.sh" ;;
sync-template) run_agent "sync_template_agent.sh" ;;
derogations-locales) run_agent "derogations_locales_agent.sh" ;;
all)
"$DIR/quality_tech.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/structure_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/tests_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/performance_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/documentation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/donnees_csv_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/documents_bureautiques_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/security_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/deployment_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR"
"$DIR/dependances_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/compilation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/resolution_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/ssh_scripts_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/frontend_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/open_source_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/gitea_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/versionnage_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/sync_template_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/derogations_locales_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true ;;
-h|--help)
usage; exit 0 ;;
*)
echo "Agent inconnu: $AGENT" >&2; usage; exit 2 ;;
for a in \
runner_agent.sh quality_tech.sh qualite_formelle.sh fondation_agent.sh structure_agent.sh \
tests_agent.sh performance_agent.sh documentation_agent.sh donnees_csv_agent.sh \
documents_bureautiques_agent.sh security_agent.sh deployment_agent.sh dependances_agent.sh \
compilation_agent.sh resolution_agent.sh ssh_scripts_agent.sh frontend_agent.sh \
open_source_agent.sh gitea_agent.sh versionnage_agent.sh sync_template_agent.sh derogations_locales_agent.sh; do
"$DIR/$a" "$TARGET_DIR" "$OUTPUT_DIR" || true
done ;;
-h|--help) usage; exit 0 ;;
*) echo "Agent inconnu: $AGENT" >&2; usage; exit 2 ;;
esac
# Capture état après et rapport
pushd "$TARGET_DIR" >/dev/null || true
(git -C "$TARGET_DIR" status --porcelain || true) > "$after_status_file" 2>/dev/null || true
{
echo "# Modifications appliquées par les agents"
echo
echo "## Fichiers modifiés/non suivis (avant)"
if [[ -s "$before_status_file" ]]; then sed "s/^/ /" "$before_status_file"; else echo " (aucun)"; fi
echo
echo "## Fichiers modifiés/non suivis (après)"
if [[ -s "$after_status_file" ]]; then sed "s/^/ /" "$after_status_file"; else echo " (aucun)"; fi
echo
echo "## Diff par rapport au dernier commit"
if git -C "$TARGET_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
git -C "$TARGET_DIR" diff --name-status || true
else
echo "(pas un dépôt git, diff ignoré)"
fi
} > "$changes_report"
popd >/dev/null || true
echo "Agents terminés → $OUTPUT_DIR"
# Affichage des rapports générés
echo
echo "=== RAPPORTS GÉNÉRÉS ==="
if [[ -d "$OUTPUT_DIR" ]]; then
for report in "$OUTPUT_DIR"/*.md; do
if [[ -f "$report" ]]; then
echo
echo "📄 $(basename "$report"):"
echo "----------------------------------------"
cat "$report"
echo "----------------------------------------"
fi
done
else
echo "Aucun rapport généré dans $OUTPUT_DIR"
fi
echo "=== FIN DES RAPPORTS ==="

31
scripts/agents/runner_agent.sh Executable file
View File

@ -0,0 +1,31 @@
#!/usr/bin/env bash
set -euo pipefail
TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "${OUTPUT_DIR}"
report="${OUTPUT_DIR}/runner_agent.md"
echo "# Agent Runner" >"${report}"
echo >>"${report}"
if ! command -v docker >/dev/null 2>&1; then
echo "- Docker non détecté sur l'hôte. Impossible de gérer le runner." >>"${report}"
exit 0
fi
if [[ -f "runner/docker-compose.yml" ]]; then
(
cd runne
# Démarre (ou met à jour) le runne
docker compose up -d || true
)
echo "- Runner démarré/présent via docker compose (runner/docker-compose.yml)." >>"${report}"
else
echo "- Fichier runner/docker-compose.yml introuvable; aucun démarrage effectué." >>"${report}"
fi
echo "- Rapports: ${report}" >>"${report}"
exit 0

12
scripts/agents/security_agent.sh Normal file → Executable file
View File

@ -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
@ -21,11 +27,11 @@ else
echo "- scripts/security/audit.sh introuvable ou non exécutable." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
À partir dun dépôt template, propose 5 contrôles sécurité CI/CD additionnels (secrets, permissions, dépendances, scans) et un ordre de priorité.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/ssh_scripts_agent.sh Normal file → Executable file
View File

@ -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
@ -27,11 +33,11 @@ if [[ $found -eq 0 ]]; then echo "- Scripts SSH standard introuvables (vérifier
if [[ -f docs/SSH_UPDATE.md ]]; then echo "- docs/SSH_UPDATE.md présent." >> "$SUMMARY_FILE"; fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Propose une checklist de conformité SSH (permissions, secrets CI, idempotence, journalisation non sensible) et intégration de contrôles CI.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/structure_agent.sh Normal file → Executable file
View File

@ -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
@ -21,11 +27,11 @@ else
for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Vérifie lalignement avec larborescence 4NK_node et propose 5 corrections prioritaires (créations/archives/métadonnées) si des écarts sont détectés.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

6
scripts/agents/sync_template_agent.sh Normal file → Executable file
View File

@ -22,11 +22,11 @@ else
echo "- Manifeste .4nk-sync.yml manquant." >> "$SUMMARY_FILE"
fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Propose une procédure de synchronisation contrôlée (PR dédiée, vérif checksums/manifest_checksum, mise à jour TEMPLATE_VERSION, mise à jour CHANGELOG/INDEX).
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

23
scripts/agents/tests_agent.sh Normal file → Executable file
View File

@ -1,10 +1,19 @@
#!/usr/bin/env bash
set -euo pipefail
# Chargement env utilisateur (~/.4nk_template/.env)
"$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/env/ensure_env.sh" || true
if [[ -f "${HOME}/.4nk_template/.env" ]]; then
set -a
. "${HOME}/.4nk_template/.env"
set +a
fi
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"
@ -21,13 +30,21 @@ 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 "## Autocorrections" >> "$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 <<'P'
PROMPT=$(cat <<'EOF'
Propose un plan court pour renforcer la pyramide de tests (unit, integration, connectivity, external, performance) pour ce template, avec 5 actions.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

12
scripts/agents/versionnage_agent.sh Normal file → Executable file
View File

@ -5,22 +5,28 @@ 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
done
if [[ $ok -eq 1 ]]; then echo "- CHANGELOG et TEMPLATE_VERSION présents." >> "$SUMMARY_FILE"; fi
PROMPT=$(cat <<'P'
PROMPT=$(cat <<'EOF'
Décris la procédure dalignement version ↔ changelog ↔ tag git (latest vs wip) et conditions de blocage release.
P
EOF
)
"scripts/agents/ai_prompt.sh" "$PROMPT" >> "$SUMMARY_FILE" || true
scripts/agents/ai_prompt.sh "$PROMPT" >> "$SUMMARY_FILE" || true
echo "Rapport: $SUMMARY_FILE"
popd >/dev/null

1
scripts/checks/version_alignment.sh Normal file → Executable file
View File

@ -19,3 +19,4 @@ fi
echo "Version alignment OK"

0
scripts/deploy/setup.sh Normal file → Executable file
View File

15
scripts/dev/run_container.sh Executable file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -euo pipefail
IMAGE_NAME="4nk-template-dev:debian"
DOCKERFILE="docker/Dockerfile.debian"
echo "[build] ${IMAGE_NAME}"
docker build -t "${IMAGE_NAME}" -f "${DOCKERFILE}" .
echo "[run] launching container and executing agents"
docker run --rm -it \
-v "${PWD}:/work" -w /work \
"${IMAGE_NAME}" \
"scripts/agents/run.sh; ls -la tests/reports/agents || true"

14
scripts/dev/run_project_ci.sh Executable file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env bash
set -euo pipefail
# Build et lance le conteneur unifié (runner+agents) sur ce projet
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$ROOT_DIR"
# Build image
docker compose -f docker-compose.ci.yml build
# Exécuter agents par défaut
RUNNER_MODE="${RUNNER_MODE:-agents}" BASE_URL="${BASE_URL:-}" REGISTRATION_TOKEN="${REGISTRATION_TOKEN:-}" \
docker compose -f docker-compose.ci.yml up --remove-orphans --abort-on-container-exit

0
scripts/env/ensure_env.sh vendored Normal file → Executable file
View File

19
scripts/local/install_hooks.sh Executable file
View File

@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"/..
HOOKS_DIR="$REPO_ROOT/.git/hooks"
mkdir -p "$HOOKS_DIR"
install_hook() {
local name="$1" src="$2"
cp -f "$src" "$HOOKS_DIR/$name"
chmod +x "$HOOKS_DIR/$name"
echo "Installed hook: $name"
}
# Hooks qui délèguent aux agents via l'image Docker du template sur le projet courant
install_hook pre-commit "$REPO_ROOT/scripts/local/precommit.sh"
install_hook pre-push "$REPO_ROOT/scripts/local/prepush.sh"
echo "Hooks installés (mode agents via 4NK_template)."

View File

@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -euo pipefail
# Installation des dépendances hôte nécessaires aux projets 4NK
# Usage: sudo ./scripts/local/install_host_deps.sh
if [[ $EUID -ne 0 ]]; then
echo "Veuillez exécuter ce script avec sudo." >&2
exit 1
fi
# Base outils CLI utiles
apt update -y
apt install -y dos2unix rsync direnv git curl vim tree sed net-tools iproute2 procps \
lsof psmisc tree htop dstat iotop strace ltrace tcpdump nmap curl wget jq sed gawk \
grep coreutils dnsutils traceroute whois sysstat iputils-ping iputils-tracepath
# Docker (requires docker repository préconfiguré)
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "Dépendances hôte installées."

25
scripts/local/merge_branch.sh Executable file
View File

@ -0,0 +1,25 @@
#!/usr/bin/env bash
set -euo pipefail
TARGET_BRANCH="${1:-main}"
SOURCE_BRANCH="${2:-}"
if [[ -z "$SOURCE_BRANCH" ]]; then
SOURCE_BRANCH="$(git rev-parse --abbrev-ref HEAD)"
fi
if [[ "$SOURCE_BRANCH" == "$TARGET_BRANCH" ]]; then
echo "Déjà sur $TARGET_BRANCH"; exit 0
fi
# Valider localement avant merge
AUTO_FIX="${AUTO_FIX:-1}" SCOPE="${SCOPE:-all}" scripts/agents/run.sh || true
if [ -f scripts/security/audit.sh ]; then bash scripts/security/audit.sh || true; fi
git fetch origin --prune
git checkout "$TARGET_BRANCH"
git pull --ff-only origin "$TARGET_BRANCH" || true
git merge --no-ff "$SOURCE_BRANCH" -m "[skip ci] merge: $SOURCE_BRANCH -> $TARGET_BRANCH"
git push origin "$TARGET_BRANCH"
echo "Merge effectué: $SOURCE_BRANCH$TARGET_BRANCH"

11
scripts/local/precommit.sh Executable file
View File

@ -0,0 +1,11 @@
#!/usr/bin/env bash
set -euo pipefail
# Exécuter les agents depuis l'image Docker de 4NK_template sur le projet courant
PROJECT_DIR="$(git rev-parse --show-toplevel)"
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
echo "[pre-commit] OK (agents via 4NK_template)"

21
scripts/local/prepush.sh Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -euo pipefail
# Exécuter les agents depuis l'image Docker de 4NK_template sur le projet courant
PROJECT_DIR="$(git rev-parse --show-toplevel)"
TEMPLATE_DIR="$(cd "${PROJECT_DIR}/../4NK_template" && pwd)"
mkdir -p "${PROJECT_DIR}/tests/reports/agents"
"${TEMPLATE_DIR}/scripts/local/run_agents_for_project.sh" "${PROJECT_DIR}" "tests/reports/agents"
# Audit sécurité (best effort) dans le contexte du projet
if [ -f "${PROJECT_DIR}/scripts/security/audit.sh" ]; then
(cd "${PROJECT_DIR}" && bash scripts/security/audit.sh) || true
fi
# Release guard (dry-run logique) dans le contexte du projet
if [ -f "${PROJECT_DIR}/scripts/release/guard.sh" ]; then
(cd "${PROJECT_DIR}" && bash scripts/release/guard.sh) || true
fi
echo "[pre-push] OK (agents via 4NK_template)"

20
scripts/local/release_local.sh Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail
VERSION="${1:-}"
if [[ -z "$VERSION" ]]; then
echo "Usage: $0 vYYYY.MM.P" >&2
exit 2
fi
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR/.."
echo "$VERSION" > TEMPLATE_VERSION
git add TEMPLATE_VERSION CHANGELOG.md 2>/dev/null || true
git commit -m "[skip ci] chore(release): $VERSION" || true
git tag -a "$VERSION" -m "release: $VERSION (latest)"
git push || true
git push origin "$VERSION"
echo "Release locale préparée: $VERSION"

View File

@ -0,0 +1,51 @@
#!/usr/bin/env bash
set -euo pipefail
# Script pour lancer les agents de 4NK_template sur un projet externe
# Usage: ./run_agents_for_project.sh [project_path] [output_dir]
PROJECT_PATH="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}"
TEMPLATE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MODULE_LAST_IMAGE_FILE="$(cd "$TEMPLATE_DIR/.." && pwd)/modules/4NK_template/.last_image"
if [[ ! -d "$PROJECT_PATH" ]]; then
echo "Erreur: Le projet '$PROJECT_PATH' n'existe pas" >&2
exit 1
fi
mkdir -p "$PROJECT_PATH/$OUTPUT_DIR"
echo "=== Lancement des agents 4NK_template sur: $PROJECT_PATH ==="
if ! command -v docker >/dev/null 2>&1; then
echo "Docker requis pour exécuter les agents via conteneur." >&2
exit 2
fi
# Si une image du module existe, l'utiliser en priorité
if [[ -f "$MODULE_LAST_IMAGE_FILE" ]]; then
IMAGE_NAME="$(cat "$MODULE_LAST_IMAGE_FILE" | tr -d '\r\n')"
echo "Utilisation de l'image du module: $IMAGE_NAME"
# Préparer montage du fichier d'env si présent
ENV_MOUNT=""
if [[ -f "$HOME/.4nk_template/.env" ]]; then
ENV_MOUNT="-v $HOME/.4nk_template/.env:/root/.4nk_template/.env:ro"
fi
# Lancer le conteneur en utilisant l'ENTRYPOINT qui configure safe.directory
docker run --rm \
-e RUNNER_MODE=agents \
-e TARGET_DIR=/work \
-e OUTPUT_DIR=/work/$OUTPUT_DIR \
-v "$(realpath "$PROJECT_PATH"):/work" \
$ENV_MOUNT \
"$IMAGE_NAME" || true
else
echo "Aucune image de module détectée, fallback docker compose dans 4NK_template"
cd "$TEMPLATE_DIR"
docker compose -f docker-compose.ci.yml build
RUNNER_MODE="agents" TARGET_DIR="/work" OUTPUT_DIR="/work/$OUTPUT_DIR" \
docker compose -f docker-compose.ci.yml run --rm project-ci || true
fi
echo "=== Agents terminés → $PROJECT_PATH/$OUTPUT_DIR ==="

1
scripts/release/guard.sh Normal file → Executable file
View File

@ -64,3 +64,4 @@ esac
echo "[release-guard] OK"

25
scripts/scripts/auto-ssh-push.sh Normal file → Executable file
View File

@ -26,8 +26,23 @@ fi
echo "✅ Authentification SSH réussie"
# Fonction pour push automatique
get_current_branch() {
# Détecte la branche courante, compatible anciennes versions de git
local br
br="$(git rev-parse --abbrev-ref HEAD 2>/dev/null || true)"
if [ -z "$br" ] || [ "$br" = "HEAD" ]; then
br="$(git symbolic-ref --short -q HEAD 2>/dev/null || true)"
fi
if [ -z "$br" ]; then
# dernier recours: parser la sortie de "git branch"
br="$(git branch 2>/dev/null | sed -n 's/^* //p' | head -n1)"
fi
echo "$br"
}
auto_push() {
local branch=${1:-$(git branch --show-current)}
local branch
branch=${1:-$(get_current_branch)}
local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"}
echo "🚀 Push automatique sur la branche: $branch"
@ -35,7 +50,7 @@ auto_push() {
# Ajouter tous les changements
git add .
# Ne pas commiter si rien à commiter
# Ne pas commiter si rien à commite
if [[ -z "$(git diff --cached --name-only)" ]]; then
echo " Aucun changement indexé. Skip commit/push."
return 0
@ -54,7 +69,7 @@ auto_push() {
# Fonction pour push avec message personnalisé
push_with_message() {
local message="$1"
local branch=${2:-$(git branch --show-current)}
local branch=${2:-$(get_current_branch)}
echo "💬 Push avec message: $message"
auto_push "$branch" "$message"
@ -62,7 +77,7 @@ push_with_message() {
# Fonction pour push rapide (sans message)
quick_push() {
local branch=${1:-$(git branch --show-current)}
local branch=${1:-$(get_current_branch)}
auto_push "$branch"
}
@ -77,7 +92,7 @@ push_branch() {
# Fonction pour push et merge vers main
push_and_merge() {
local source_branch=${1:-$(git branch --show-current)}
local source_branch=${1:-$(get_current_branch)}
local target_branch=${2:-main}
echo "🔄 Push et merge $source_branch -> $target_branch"

4
scripts/scripts/init-ssh-env.sh Normal file → Executable file
View File

@ -44,8 +44,8 @@ fi
# 4. Alias Git
print_status "Configuration des alias Git..."
git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git branch --show-current); }; f'
git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git branch --show-current); }; f'
git config --global alias.ssh-push '!f() { git add . && git commit -m "${1:-Auto-commit $(date)}" && git push origin $(git rev-parse --abbrev-ref HEAD); }; f'
git config --global alias.quick-push '!f() { git add . && git commit -m "Update $(date)" && git push origin $(git rev-parse --abbrev-ref HEAD); }; f'
print_success "Alias Git configurés"
# 5. Rendu exécutable des scripts si chemin standard

0
scripts/scripts/setup-ssh-ci.sh Normal file → Executable file
View File

1
scripts/security/audit.sh Normal file → Executable file
View File

@ -34,3 +34,4 @@ fi
echo "[security-audit] terminé rc=$rc"
exit $rc