Compare commits

...

39 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
97c093724e chore(release): v2025.08.2 (BASE_URL rename; agents no-args; CI/docs update) 2025-08-28 00:11:01 +02:00
7d481a7c5e refactor(config): rename GITEA_BASE_URL to BASE_URL across CI, scripts, docs 2025-08-28 00:09:19 +02:00
c96b09a308 chore(ci): trigger workflows 2025-08-28 00:01:48 +02:00
54772d1151 ci/docs(agents): default to no-args run; update CI and AGENTS_RUNTIME 2025-08-28 00:00:16 +02:00
be5a5200d0 pre merge 2025-08-27 23:41:25 +02:00
c29e061c34 merge: chore/docs-agents-ci-2025-08-27 → main 2025-08-27 23:22:00 +02:00
88 changed files with 1339 additions and 550 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 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 un path requis nexiste pas après sync.
- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles. - 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] [artefacts concernés]
- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md. - .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md.
# Synchronisation de template (4NK) # 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 un path requis nexiste pas après sync.
- Erreur bloquante si tests/CI signalent des scripts non exécutables ou des fichiers sensibles. - 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] [artefacts concernés]
- .4nk-sync.yml, TEMPLATE_VERSION, .cursor/**, .gitea/**, AGENTS.md, scripts/**, docs/SSH_UPDATE.md, CHANGELOG.md. - .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 !/.cursor
!/AGENTS.md !/AGENTS.md

View File

@ -11,12 +11,14 @@ on:
env: env:
RUST_VERSION: '1.70' RUST_VERSION: '1.70'
DOCKER_COMPOSE_VERSION: '2.20.0' DOCKER_COMPOSE_VERSION: '2.20.0'
CI_SKIP: 'true'
jobs: jobs:
# Job de vérification du code # Job de vérification du code
code-quality: code-quality:
name: Code Quality name: Code Quality
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
@ -64,7 +66,8 @@ jobs:
# Job de tests unitaires # Job de tests unitaires
unit-tests: unit-tests:
name: Unit Tests name: Unit Tests
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
@ -100,7 +103,8 @@ jobs:
# Job de tests d'intégration # Job de tests d'intégration
integration-tests: integration-tests:
name: Integration Tests name: Integration Tests
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
services: services:
docker: docker:
@ -147,7 +151,8 @@ jobs:
# Job de tests de sécurité # Job de tests de sécurité
security-tests: security-tests:
name: Security Tests name: Security Tests
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
@ -184,7 +189,8 @@ jobs:
# Job de build et test Docker # Job de build et test Docker
docker-build: docker-build:
name: Docker Build & Test name: Docker Build & Test
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
services: services:
docker: docker:
@ -227,7 +233,8 @@ jobs:
# Job de tests de documentation # Job de tests de documentation
documentation-tests: documentation-tests:
name: Documentation Tests name: Documentation Tests
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
@ -242,7 +249,8 @@ jobs:
markdownlint: markdownlint:
name: Markdown Lint name: Markdown Lint
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -272,7 +280,8 @@ jobs:
bash-required: bash-required:
name: Bash Requirement name: Bash Requirement
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -289,7 +298,8 @@ jobs:
agents-smoke: agents-smoke:
name: Agents Smoke (no AI) name: Agents Smoke (no AI)
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -300,8 +310,7 @@ jobs:
env: env:
OPENAI_API_KEY: "" OPENAI_API_KEY: ""
run: | run: |
mkdir -p tests/reports/agents scripts/agents/run.sh
scripts/agents/run.sh . tests/reports/agents all
- name: Upload agents reports - name: Upload agents reports
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
@ -310,8 +319,8 @@ jobs:
openia-agents: openia-agents:
name: Agents with OpenIA name: Agents with OpenIA
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ secrets.OPENAI_API_KEY != '' }} if: ${{ env.CI_SKIP != 'true' && secrets.OPENAI_API_KEY != '' }}
env: env:
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
OPENAI_MODEL: ${{ vars.OPENAI_MODEL }} OPENAI_MODEL: ${{ vars.OPENAI_MODEL }}
@ -325,8 +334,7 @@ jobs:
chmod +x scripts/agents/*.sh || true chmod +x scripts/agents/*.sh || true
- name: Run agents with AI - name: Run agents with AI
run: | run: |
mkdir -p tests/reports/agents scripts/agents/run.sh
scripts/agents/run.sh . tests/reports/agents all
- name: Upload agents reports - name: Upload agents reports
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3
with: with:
@ -335,7 +343,8 @@ jobs:
deployment-checks: deployment-checks:
name: Deployment Checks name: Deployment Checks
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -352,7 +361,8 @@ jobs:
security-audit: security-audit:
name: Security Audit name: Security Audit
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -370,8 +380,9 @@ jobs:
# Job de release guard (cohérence release) # Job de release guard (cohérence release)
release-guard: release-guard:
name: 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] needs: [code-quality, unit-tests, documentation-tests, markdownlint, security-audit, deployment-checks, bash-required]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -403,10 +414,10 @@ jobs:
name: Create Release (Gitea API) name: Create Release (Gitea API)
runs-on: ubuntu-latest runs-on: ubuntu-latest
needs: [release-guard] needs: [release-guard]
if: startsWith(github.ref, 'refs/tags/') if: ${{ env.CI_SKIP != 'true' && startsWith(github.ref, 'refs/tags/') }}
env: env:
RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }}
GITEA_BASE_URL: ${{ vars.GITEA_BASE_URL }} BASE_URL: ${{ vars.BASE_URL }}
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v3 uses: actions/checkout@v3
@ -415,24 +426,25 @@ jobs:
set -e set -e
if [ -z "${RELEASE_TOKEN}" ]; then if [ -z "${RELEASE_TOKEN}" ]; then
echo "RELEASE_TOKEN secret is missing" >&2; exit 1; fi echo "RELEASE_TOKEN secret is missing" >&2; exit 1; fi
if [ -z "${GITEA_BASE_URL}" ]; then if [ -z "${BASE_URL}" ]; then
GITEA_BASE_URL="https://git.4nkweb.com"; fi BASE_URL="https://git.4nkweb.com"; fi
TAG="${GITHUB_REF##*/}" TAG="${GITHUB_REF##*/}"
REPO="${GITHUB_REPOSITORY}" REPO="${GITHUB_REPOSITORY}"
OWNER="${REPO%%/*}" OWNER="${REPO%%/*}"
NAME="${REPO##*/}" NAME="${REPO##*/}"
echo "Publishing release ${TAG} to ${GITEA_BASE_URL}/${OWNER}/${NAME}" echo "Publishing release ${TAG} to ${BASE_URL}/${OWNER}/${NAME}"
curl -sSf -X POST \ curl -sSf -X POST \
-H "Authorization: token ${RELEASE_TOKEN}" \ -H "Authorization: token ${RELEASE_TOKEN}" \
-H "Content-Type: application/json" \ -H "Content-Type: application/json" \
-d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"draft\":false,\"prerelease\":false}" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\",\"draft\":false,\"prerelease\":false}" \
"${GITEA_BASE_URL}/api/v1/repos/${OWNER}/${NAME}/releases" >/dev/null "${BASE_URL}/api/v1/repos/${OWNER}/${NAME}/releases" >/dev/null
echo "Release created" echo "Release created"
# Job de tests de performance # Job de tests de performance
performance-tests: performance-tests:
name: Performance Tests name: Performance Tests
runs-on: ubuntu-latest runs-on: [self-hosted, linux]
if: ${{ env.CI_SKIP != 'true' }}
steps: steps:
- name: Checkout code - name: Checkout code
@ -457,9 +469,9 @@ jobs:
# Job de notification # Job de notification
notify: notify:
name: 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] needs: [code-quality, unit-tests, integration-tests, security-tests, docker-build, documentation-tests]
if: always() if: ${{ env.CI_SKIP != 'true' && always() }}
steps: steps:
- name: Notify success - name: Notify success

View File

@ -7,7 +7,7 @@ on:
jobs: jobs:
check-and-sync: check-and-sync:
runs-on: linux runs-on: [self-hosted, linux]
steps: steps:
- name: Lire TEMPLATE_VERSION et .4nk-sync.yml - name: Lire TEMPLATE_VERSION et .4nk-sync.yml
# Doit charger ref courant, source_repo et périmètre paths # 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 # Ne pas ignorer .cursor ni AGENTS.md

View File

@ -5,13 +5,13 @@
- [Introduction](#introduction) - [Introduction](#introduction)
- [Principes communs](#principes-communs) - [Principes communs](#principes-communs)
- [Agents fondamentaux](#agents-fondamentaux) - [Agents fondamentaux](#agents-fondamentaux)
- [Agents spécialisés documentation](#agents-specialises-documentation) - [Agents spécialisés documentation] (#agents-specialises-documentation)
- [Agents spécialisés tests](#agents-specialises-tests) - [Agents spécialisés tests] (#agents-specialises-tests)
- [Agents techniques](#agents-techniques) - [Agents techniques](#agents-techniques)
- [Agents frontend](#agents-frontend) - [Agents frontend](#agents-frontend)
- [Agents open source et CI](#agents-open-source-et-ci) - [Agents open source et CI](#agents-open-source-et-ci)
- [Agents de synchronisation et dérogations](#agents-de-synchronisation-et-derogations) - [Agents de synchronisation et dérogations] (#agents-de-synchronisation-et-derogations)
- [Matrice de coordination](#matrice-de-coordination) - [Matrice de coordination] (#matrice-de-coordination)
- [Conclusion](#conclusion) - [Conclusion](#conclusion)
--- ---
@ -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é. 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`. 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

@ -27,6 +27,21 @@ et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
### Changed ### 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 ## [2025.08.1] - 2025-08-27
### Added ### Added
@ -40,7 +55,6 @@ et ce projet adhère au [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Normalisation MD005/MD007/MD051 dans la documentation - Normalisation MD005/MD007/MD051 dans la documentation
- Ancrages ASCII dans `AGENTS.md`, correction des titres emphase (MD036) - Ancrages ASCII dans `AGENTS.md`, correction des titres emphase (MD036)
- Documentation projet réécrite à partir des modèles `docs/templates/**` (générique, non applicative) - Documentation projet réécrite à partir des modèles `docs/templates/**` (générique, non applicative)
- `docs/INDEX.md` mis à jour (liens Déploiement et SSH) - `docs/INDEX.md` mis à jour (liens Déploiement et SSH)
- Alignement documentaire sur 4NK_template (titres, liens Gitea, wording) dans docs/** - Alignement documentaire sur 4NK_template (titres, liens Gitea, wording) dans docs/**

View File

@ -4,16 +4,16 @@ Merci de votre intérêt pour contribuer au projet 4NK Node ! Ce guide vous aide
## 📋 Table des Matières ## 📋 Table des Matières
- [🎯 Comment Contribuer](#comment-contribuer) - [🎯 Comment Contribuer] (#comment-contribuer)
- [🚀 Premiers Pas](#premiers-pas) - [🚀 Premiers Pas] (#premiers-pas)
- [🔧 Environnement de Développement](#environnement-de-developpement) - [🔧 Environnement de Développement] (#environnement-de-developpement)
- [📝 Processus de Contribution](#processus-de-contribution) - [📝 Processus de Contribution] (#processus-de-contribution)
- [🧪 Tests](#tests) - [🧪 Tests] (#tests)
- [📚 Documentation](#documentation) - [📚 Documentation] (#documentation)
- [🐛 Signaler un Bug](#signaler-un-bug) - [🐛 Signaler un Bug] (#signaler-un-bug)
- [💡 Proposer une Fonctionnalité](#proposer-une-fonctionnalite) - [💡 Proposer une Fonctionnalité] (#proposer-une-fonctionnalite)
- [🔍 Code Review](#code-review) - [🔍 Code Review] (#code-review)
- [📦 Release](#release) - [📦 Release] (#release)
## 🎯 Comment Contribuer ## 🎯 Comment Contribuer

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 ## 📚 Documentation
### 📖 Guides Principaux - Projet (ce dépôt): `docs/project/`
- Modèles à réutiliser: `docs/templates/`
- docs/TEMPLATE_ADAPTATION.md — Comment adapter ce template à votre projet - Standards de qualité: `docs/project/QUALITY_STANDARDS.md`
- 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
## 🤝 Contribution ## 🤝 Contribution
1. Fork le repository - Fork → branche → PR (CI verte, docs/changelog à jour)
2. Créer une branche feature (`git checkout -b feature/nouvelle-fonctionnalite`) - Respect des règles éditoriales (français, pas de secrets, pas dexemples applicatifs)
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 ».
## 📄 Licence ## 📄 Licence
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails. MIT — voir `LICENSE`.
## 🆘 Support ## 🆘 Support
Pour obtenir de l'aide : - Lire `docs/project/INDEX.md`
- Ouvrir une issue si besoin
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
---

View File

@ -9,6 +9,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
**NE PAS** créer d'issue publique pour les vulnérabilités de sécurité. **NE PAS** créer d'issue publique pour les vulnérabilités de sécurité.
#### À la place #### À la place
1. Envoyez un email à [security@4nkweb.com](mailto:security@4nkweb.com) 1. Envoyez un email à [security@4nkweb.com](mailto:security@4nkweb.com)
2. Incluez "SECURITY VULNERABILITY" dans l'objet 2. Incluez "SECURITY VULNERABILITY" dans l'objet
3. Décrivez la vulnérabilité de manière détaillée 3. Décrivez la vulnérabilité de manière détaillée
@ -34,6 +35,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
### Pour les Contributeurs ### Pour les Contributeurs
#### Code #### Code
- Validez toutes les entrées utilisateur - Validez toutes les entrées utilisateur
- Utilisez des requêtes préparées pour les bases de données - Utilisez des requêtes préparées pour les bases de données
- Évitez les injections de code - Évitez les injections de code
@ -41,12 +43,14 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
- Utilisez HTTPS pour toutes les communications - Utilisez HTTPS pour toutes les communications
#### Configuration #### Configuration
- Ne committez jamais de secrets - Ne committez jamais de secrets
- Utilisez des variables d'environnement pour les données sensibles - Utilisez des variables d'environnement pour les données sensibles
- Vérifiez les permissions des fichiers - Vérifiez les permissions des fichiers
- Maintenez les dépendances à jour - Maintenez les dépendances à jour
#### Tests #### Tests
- Incluez des tests de sécurité - Incluez des tests de sécurité
- Testez les cas limites - Testez les cas limites
- Validez les entrées malveillantes - Validez les entrées malveillantes
@ -55,18 +59,21 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
### Pour les Utilisateurs ### Pour les Utilisateurs
#### Installation #### Installation
- Utilisez des sources officielles - Utilisez des sources officielles
- Vérifiez les checksums - Vérifiez les checksums
- Maintenez le système à jour - Maintenez le système à jour
- Utilisez un pare-feu - Utilisez un pare-feu
#### Configuration #### Configuration
- Changez les mots de passe par défaut - Changez les mots de passe par défaut
- Utilisez des clés SSH fortes - Utilisez des clés SSH fortes
- Limitez l'accès réseau - Limitez l'accès réseau
- Surveillez les logs - Surveillez les logs
#### Opération #### Opération
- Surveillez les connexions - Surveillez les connexions
- Sauvegardez régulièrement - Sauvegardez régulièrement
- Testez les sauvegardes - Testez les sauvegardes
@ -77,24 +84,28 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
### Composants Principaux ### Composants Principaux
#### Bitcoin Core #### Bitcoin Core
- **RPC Interface** : Authentification requise - **RPC Interface** : Authentification requise
- **ZMQ** : Communication locale uniquement - **ZMQ** : Communication locale uniquement
- **P2P** : Validation des blocs - **P2P** : Validation des blocs
- **Wallet** : Chiffrement des clés - **Wallet** : Chiffrement des clés
#### Blindbit #### Blindbit
- **API HTTP** : Validation des entrées - **API HTTP** : Validation des entrées
- **Filtres** : Vérification des signatures - **Filtres** : Vérification des signatures
- **Cache** : Protection contre les attaques DoS - **Cache** : Protection contre les attaques DoS
- **Logs** : Pas d'informations sensibles - **Logs** : Pas d'informations sensibles
#### SDK Relay #### SDK Relay
- **WebSocket** : Validation des messages - **WebSocket** : Validation des messages
- **Synchronisation** : Authentification des pairs - **Synchronisation** : Authentification des pairs
- **Cache** : Protection contre les attaques - **Cache** : Protection contre les attaques
- **Configuration** : Validation des paramètres - **Configuration** : Validation des paramètres
#### Tor #### Tor
- **Proxy** : Configuration sécurisée - **Proxy** : Configuration sécurisée
- **Contrôle** : Accès restreint - **Contrôle** : Accès restreint
- **Logs** : Anonymisation - **Logs** : Anonymisation
@ -103,6 +114,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
### Tests de Sécurité ### Tests de Sécurité
#### Tests Automatisés #### Tests Automatisés
```bash ```bash
# Tests de sécurité # Tests de sécurité
./tests/run_security_tests.sh ./tests/run_security_tests.sh
@ -115,6 +127,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
``` ```
#### Tests Manuels #### Tests Manuels
- Tests de pénétration - Tests de pénétration
- Audit de code - Audit de code
- Tests de configuration - Tests de configuration
@ -147,6 +160,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
## 📋 Checklist de Sécurité ## 📋 Checklist de Sécurité
### Avant le Déploiement ### Avant le Déploiement
- [ ] Audit de code de sécurité - [ ] Audit de code de sécurité
- [ ] Tests de vulnérabilités - [ ] Tests de vulnérabilités
- [ ] Vérification des dépendances - [ ] Vérification des dépendances
@ -154,6 +168,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
- [ ] Tests de charge - [ ] Tests de charge
### Pendant l'Opération ### Pendant l'Opération
- [ ] Monitoring de sécurité - [ ] Monitoring de sécurité
- [ ] Surveillance des logs - [ ] Surveillance des logs
- [ ] Mise à jour des composants - [ ] Mise à jour des composants
@ -161,6 +176,7 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
- [ ] Tests de récupération - [ ] Tests de récupération
### Après un Incident ### Après un Incident
- [ ] Analyse post-mortem - [ ] Analyse post-mortem
- [ ] Mise à jour des procédures - [ ] Mise à jour des procédures
- [ ] Formation de l'équipe - [ ] Formation de l'équipe
@ -170,18 +186,21 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
## 🔧 Outils de Sécurité ## 🔧 Outils de Sécurité
### Monitoring ### Monitoring
- **Logs** : Centralisation et analyse - **Logs** : Centralisation et analyse
- **Métriques** : Surveillance en temps réel - **Métriques** : Surveillance en temps réel
- **Alertes** : Notification automatique - **Alertes** : Notification automatique
- **Tableaux de bord** : Vue d'ensemble - **Tableaux de bord** : Vue d'ensemble
### Tests ### Tests
- **SAST** : Analyse statique - **SAST** : Analyse statique
- **DAST** : Tests dynamiques - **DAST** : Tests dynamiques
- **IAST** : Tests interactifs - **IAST** : Tests interactifs
- **Fuzzing** : Tests de robustesse - **Fuzzing** : Tests de robustesse
### Protection ### Protection
- **WAF** : Pare-feu applicatif - **WAF** : Pare-feu applicatif
- **IDS/IPS** : Détection d'intrusion - **IDS/IPS** : Détection d'intrusion
- **Antivirus** : Protection des endpoints - **Antivirus** : Protection des endpoints
@ -190,18 +209,21 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
## 📚 Ressources ## 📚 Ressources
### Documentation ### Documentation
- [Guide de Sécurité Bitcoin](https://bitcoin.org/en/security) - [Guide de Sécurité Bitcoin](https://bitcoin.org/en/security)
- [OWASP Top 10](https://owasp.org/www-project-top-ten/) - [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [CWE/SANS Top 25](https://cwe.mitre.org/top25/) - [CWE/SANS Top 25](https://cwe.mitre.org/top25/)
- [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework) - [NIST Cybersecurity Framework](https://www.nist.gov/cyberframework)
### Outils ### Outils
- [Bandit](https://bandit.readthedocs.io/) - Analyse Python - [Bandit](https://bandit.readthedocs.io/) - Analyse Python
- [Clang Static Analyzer](https://clang-analyzer.llvm.org/) - Analyse C/C++ - [Clang Static Analyzer](https://clang-analyzer.llvm.org/) - Analyse C/C++
- [SonarQube](https://www.sonarqube.org/) - Qualité du code - [SonarQube](https://www.sonarqube.org/) - Qualité du code
- [OpenVAS](https://www.openvas.org/) - Scan de vulnérabilités - [OpenVAS](https://www.openvas.org/) - Scan de vulnérabilités
### Formation ### Formation
- Cours de sécurité applicative - Cours de sécurité applicative
- Formation aux tests de pénétration - Formation aux tests de pénétration
- Certification en cybersécurité - Certification en cybersécurité
@ -210,18 +232,21 @@ Nous prenons la sécurité très au sérieux. Si vous découvrez une vulnérabil
## 🤝 Collaboration ## 🤝 Collaboration
### Bug Bounty ### Bug Bounty
- Programme de récompenses pour les vulnérabilités - Programme de récompenses pour les vulnérabilités
- Critères d'éligibilité - Critères d'éligibilité
- Montants des récompenses - Montants des récompenses
- Processus de validation - Processus de validation
### Responsible Disclosure ### Responsible Disclosure
- Timeline de divulgation - Timeline de divulgation
- Coordination avec les chercheurs - Coordination avec les chercheurs
- Communication publique - Communication publique
- Remerciements - Remerciements
### Communauté ### Communauté
- Groupe de sécurité - Groupe de sécurité
- Discussions techniques - Discussions techniques
- Partage d'informations - Partage d'informations

View File

@ -1,2 +1 @@
v2025.08.1 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,14 +12,29 @@ 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 - bash disponible (Git Bash/WSL/Linux/macOS) pour les contrôles complets
- (Optionnel) `OPENAI_API_KEY` pour activer lanalyse IA - (Optionnel) `OPENAI_API_KEY` pour activer lanalyse IA
- (Option) conteneur unifié runner+agents: `docker-compose.ci.yml`
## 3. Commandes ## 3. Commandes
- Bash (recommandé): - Bash (recommandé):
- `scripts/agents/run.sh [target_dir] [output_dir] [agent]` - `scripts/agents/run.sh`
- Par défaut: `target_dir=.` `output_dir=tests/reports/agents` `agent=all` - Options (facultatives): `scripts/agents/run.sh [target_dir] [output_dir] [agent]`
- Par défaut: `target_dir=.` `output_dir=tests/reports/agents` `agent=all`
- PowerShell (fallback Windows): - PowerShell (fallback Windows):
- `scripts/agents/run.ps1 -TargetDir . -OutputDir tests/reports/agents -Agent <nom>` - `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 ## 4. Agents disponibles
@ -51,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 - `openia-agents`: agents avec IA si `OPENAI_API_KEY` fourni
- `bash-required`: bloque si bash/runner absent - `bash-required`: bloque si bash/runner absent
- `release-guard`: dépend des checks en amont - `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) ## 7. Paramètres IA (optionnels)
- `OPENAI_API_KEY`, `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE` - `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 - Exécuter les agents avant chaque PR
- Archiver les rapports significatifs - Archiver les rapports significatifs
- Documenter les décisions dans le changelog et la doc - 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) ## Variables denvironnement (CI)
- Secrets CI uniquement (pas de secrets en clair) - Secrets CI uniquement (pas de secrets en clair)
- Variables agents : OPENAI_API_KEY, OPENAI_MODEL, OPENAI_API_BASE, OPENAI_TEMPERATURE - **Agents IA**: `OPENAI_API_KEY`, `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE`
- Secret release: RELEASE_TOKEN (publication des releases via lAPI Gitea) - **Release**: `RELEASE_TOKEN` (publication des releases via lAPI Gitea)
- Variable optionnelle: GITEA_BASE_URL (ex: `https://git.4nkweb.com`) - **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 ## Conventions
@ -17,6 +33,21 @@
- bash requis (job CI `bash-required`) - bash requis (job CI `bash-required`)
- Fallback PowerShell utilisable localement - 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) ## Gestion locale des secrets (~/.4nk_template/.env)
- Modèle fourni: `scripts/env/.env.template` (clés sans valeurs) - Modèle fourni: `scripts/env/.env.template` (clés sans valeurs)

View File

@ -20,7 +20,7 @@
- Script dinstallation: `scripts/deploy/setup.sh` - Script dinstallation: `scripts/deploy/setup.sh`
- Crée `~/.4nk_template/` (chmod 700) et `~/.4nk_template/.env` (chmod 600) - Crée `~/.4nk_template/` (chmod 700) et `~/.4nk_template/.env` (chmod 600)
- Copie depuis `scripts/env/.env.template` si présent, sinon génère un modèle - Copie depuis `scripts/env/.env.template` si présent, sinon génère un modèle
- À compléter: `OPENAI_API_KEY`, `OPENAI_MODEL`, `RELEASE_TOKEN`, `GITEA_BASE_URL` (si custom) - À compléter: `OPENAI_API_KEY`, `OPENAI_MODEL`, `RELEASE_TOKEN`, `BASE_URL` (si custom)
- Applique la structure 4NK_template au projet cible (sans écraser par défaut): - Applique la structure 4NK_template au projet cible (sans écraser par défaut):
- `.gitea/**`, `.cursor/**`, `.cursorignore`, `.gitignore`, `.markdownlint.json` - `.gitea/**`, `.cursor/**`, `.cursorignore`, `.gitignore`, `.markdownlint.json`
- `AGENTS.md`, `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`, `TEMPLATE_VERSION` - `AGENTS.md`, `LICENSE`, `CONTRIBUTING.md`, `CODE_OF_CONDUCT.md`, `SECURITY.md`, `TEMPLATE_VERSION`
@ -47,3 +47,25 @@ bash scripts/deploy/setup.sh git@host:org/mon-projet.git --dest ~/work --force
- Vérification santé/logs/dashboards - Vérification santé/logs/dashboards
- Suivi des erreurs et retours - 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

@ -1,29 +1,44 @@
# Configuration Gitea — 4NK_template (projet) # Configuration Gitea — 4NK_template (projet)
## 1. Repository ## 1. Repository
- Activer les Actions (workflows `.gitea/workflows/*.yml`) - Activer les Actions (workflows `.gitea/workflows/*.yml`)
- Vérifier les templates dissues/PR - Vérifier les templates dissues/PR
## 2. Protections de branches ## 2. Protections de branches
- Reviews requises avant merge - Reviews requises avant merge
- Status checks requis (CI verte) - Status checks requis (CI verte)
- Mise à jour obligatoire de la branche avant merge - Mise à jour obligatoire de la branche avant merge
## 3. Secrets et variables ## 3. Secrets et variables
- Secrets: `OPENAI_API_KEY` (optionnel), `RELEASE_TOKEN` (obligatoire pour publier les releases via API Gitea) - Secrets: `OPENAI_API_KEY` (optionnel), `RELEASE_TOKEN` (obligatoire pour publier les releases via API Gitea)
- Variables: paramètres de CI non sensibles, ex: `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE`, `GITEA_BASE_URL` - Variables: paramètres de CI non sensibles, ex: `OPENAI_MODEL`, `OPENAI_API_BASE`, `OPENAI_TEMPERATURE`, `BASE_URL`
### Ajouter `RELEASE_TOKEN` ### Ajouter `RELEASE_TOKEN`
- Aller dans Repository Settings → Secrets → New Repository Secret - Aller dans Repository Settings → Secrets → New Repository Secret
- Nom: `RELEASE_TOKEN` ; Valeur: un token personnel avec portée API sur le dépôt - 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*` - 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 ## 4. Workflows requis
- `code-quality`, `unit-tests`, `documentation-tests`, `security-audit` - `code-quality`, `unit-tests`, `documentation-tests`, `security-audit`
- `deployment-checks`, `bash-required`, `markdownlint`, `release-guard`, `release-create` - `deployment-checks`, `bash-required`, `markdownlint`, `release-guard`, `release-create`
- (Optionnels) `agents-smoke`, `openia-agents` - (Optionnels) `agents-smoke`, `openia-agents`
- (Conteneur unifié) job custom pour builder et lancer `docker-compose.ci.yml` si nécessaire
## 5. Processus PR ## 5. Processus PR
- Branche dédiée, PR petite et ciblée - Branche dédiée, PR petite et ciblée
- CI verte, review approuvée - CI verte, review approuvée
- Doc et changelog à jour - Doc et changelog à jour

View File

@ -1,15 +1,18 @@
# Guide open source — 4NK_template (projet) # Guide open source — 4NK_template (projet)
## Pré-requis ## Pré-requis
- LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md - LICENSE, CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md
## CI ## CI
- tests, lint, security-audit, release-guard, bash-required - tests, lint, security-audit, release-guard, bash-required
## Publication ## Publication
- Alignement version/changelog/tag, notes de release - Alignement version/changelog/tag, notes de release
## Communauté ## Communauté
- Templates issues/PR, labels, milestones - Templates issues/PR, labels, milestones
- Divulgation responsable des vulnérabilités - Divulgation responsable des vulnérabilités

View File

@ -6,4 +6,3 @@
- Tests verts (catégories pertinentes) et rapports conservés - Tests verts (catégories pertinentes) et rapports conservés
- Documentation à jour (INDEX, guides impactés) - Documentation à jour (INDEX, guides impactés)
- Sécurité de base: secrets, permissions, audit CI - Sécurité de base: secrets, permissions, audit CI

View File

@ -1,20 +1,40 @@
# Plan de release — 4NK_template (projet) # Plan de release — 4NK_template (projet)
## Objectifs ## Objectifs
- Version documentée, testée, sécurisée - Version documentée, testée, sécurisée
- Processus reproductible et traçable - Processus reproductible et traçable
## Préparation ## Préparation
- CI verte: lint/tests/doc/securityaudit/releaseguard - CI verte: lint/tests/doc/securityaudit/releaseguard
- Docs à jour (INDEX, guides impactés) - Docs à jour (INDEX, guides impactés)
- Version/Changelog/Tag alignés - Version/Changelog/Tag alignés
## Lancement ## Lancement
- Tagging: `vX.Y.Z` ou `vX.Y.Z-wip.N` - Tagging: `vX.Y.Z` ou `vX.Y.Z-wip.N`
- Notes de release (résumé, changements majeurs, impacts) - 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 ## Postlancement
- Suivi issues/retours - Suivi issues/retours
- Corrections critiques - Corrections critiques
- Mise à jour de la roadmap - Mise à jour de la roadmap

View File

@ -1,22 +1,25 @@
# Roadmap — 4NK_template (projet) # Roadmap — 4NK_template (projet)
## Vision ## Vision
Maintenir un template robuste (docs, CI, sécurité) pour accélérer les projets. Maintenir un template robuste (docs, CI, sécurité) pour accélérer les projets.
## Objectifs (12 mois) ## Objectifs (12 mois)
- Qualité: standards renforcés, automatisations CI supplémentaires - Qualité: standards renforcés, automatisations CI supplémentaires
- Documentation: squelettes enrichis, index cohérents - Documentation: squelettes enrichis, index cohérents
- Sécurité: contrôles CI étendus, guides pratiques - Sécurité: contrôles CI étendus, guides pratiques
- Outillage: agents élargis, rapports synthétiques - Outillage: agents élargis, rapports synthétiques
## Jalons ## Jalons
- T1: Mise à jour squelettes docs et agents - T1: Mise à jour squelettes docs et agents
- T2: Extensions CI (lint multilangages, déploiement dryrun) - T2: Extensions CI (lint multilangages, déploiement dryrun)
- T3: Guides open source/qualité consolidés - T3: Guides open source/qualité consolidés
- T4: Synchronisation de template outillée - T4: Synchronisation de template outillée
## Mesure du progrès ## Mesure du progrès
- CI verte en continu - CI verte en continu
- Adoption des squelettes par projets - Adoption des squelettes par projets
- Diminution des écarts de conformité - Diminution des écarts de conformité

View File

@ -1,24 +1,28 @@
# Audit de sécurité — 4NK_template (projet) # Audit de sécurité — 4NK_template (projet)
## Menaces ## Menaces
- Secrets, permissions, endpoints sensibles, dépendances, supply chain - Secrets, permissions, endpoints sensibles, dépendances, supply chain
## Contrôles ## Contrôles
- Scan secrets/permissions - Scan secrets/permissions
- Audit dépendances (outil selon la pile des projets) - Audit dépendances (outil selon la pile des projets)
- Vérifs de configuration (auth/TLS/CORS/ratelimit) - Vérifs de configuration (auth/TLS/CORS/ratelimit)
- Journalisation sécurité, traçabilité - Journalisation sécurité, traçabilité
## CI ## CI
- Job `security-audit` échoue si alerte critique - Job `security-audit` échoue si alerte critique
- Rapports archivés en artefacts - Rapports archivés en artefacts
## Politique des secrets ## Politique des secrets
- Exclusivement secrets CI/variables denvironnement - Exclusivement secrets CI/variables denvironnement
- Rotation régulière, révocation sur incident - Rotation régulière, révocation sur incident
- Aucun secret en clair dans le dépôt - Aucun secret en clair dans le dépôt
## Remédiation ## Remédiation
- Prioriser, corriger, documenter dans `CHANGELOG.md` - Prioriser, corriger, documenter dans `CHANGELOG.md`
- Ajouter des tests de nonrégression sécurité si pertinent - Ajouter des tests de nonrégression sécurité si pertinent

View File

@ -1,56 +1,164 @@
### 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) # 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. 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.
## 1. Prérequis ## 1. Prérequis
- Git opérationnel et accès à votre forge (Gitea recommandé) - Git opérationnel et accès à votre forge (Gitea recommandé)
- CI activée sur le repository - CI activée sur le repository
- bash disponible pour les agents (recommandé). À défaut, fallback PowerShell local - bash disponible pour les agents (recommandé). À défaut, fallback PowerShell local
## 2. Démarrer un projet dérivé ## 2. Démarrer un projet dérivé
1) Créer un repository à partir de 4NK_template 1) Créer un repository à partir de 4NK_template
2) Copier/adapter la documentation depuis `docs/templates/**` vers votre `docs/**` 2) Copier/adapter la documentation depuis `docs/templates/**` vers votre `docs/**`
3) Tenir `docs/INDEX.md` et `CHANGELOG.md` à jour 3) Tenir `docs/INDEX.md` et `CHANGELOG.md` à jour
4) Activer les workflows CI et vérifier `release-guard`/`security-audit` 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 ## 3. Documentation
- Utiliser les squelettes de `docs/templates/**` comme base - Utiliser les squelettes de `docs/templates/**` comme base
- Documenter uniquement votre domaine applicatif (le template reste générique) - Documenter uniquement votre domaine applicatif (le template reste générique)
- À chaque changement de code/dépendance/CI, synchroniser la doc correspondante - À chaque changement de code/dépendance/CI, synchroniser la doc correspondante
## 4. Agents (contrôles) ## 4. Agents (contrôles)
- Recommandé (bash): `scripts/agents/run.sh [target_dir] [output_dir] [agent]` - Recommandé (bash): `scripts/agents/run.sh [target_dir] [output_dir] [agent]`
- Windows fallback: `scripts/agents/run.ps1 -TargetDir . -OutputDir tests/reports/agents -Agent <nom>` - 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` - 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 ## 5. Qualité et CI
- Jobs attendus: qualité, tests (catégories pertinentes), documentation, securityaudit, bashrequired, releaseguard - Jobs attendus: qualité, tests (catégories pertinentes), documentation, securityaudit, bashrequired, releaseguard
- `bash-required` garantit la présence de bash et du runner des agents - `bash-required` garantit la présence de bash et du runner des agents
- `release-guard` bloque les publications si tests/doc/build/sécurité/version/changelog/tag ne sont pas cohérents - `release-guard` bloque les publications si tests/doc/build/sécurité/version/changelog/tag ne sont pas cohérents
## 6. Sécurité ## 6. Sécurité
- Secrets uniquement via la CI (variables denvironnement), jamais en clair dans le dépôt - Secrets uniquement via la CI (variables denvironnement), jamais en clair dans le dépôt
- Audit sécurité automatisé (job `security-audit`) et remédiations tracées dans `CHANGELOG.md` - Audit sécurité automatisé (job `security-audit`) et remédiations tracées dans `CHANGELOG.md`
## 7. Workflow quotidien ## 7. Workflow quotidien
- Éditer: code et documentation (toujours en parallèle) - Éditer: code et documentation (toujours en parallèle)
- Exécuter: tests locaux, agents (diagnostics) - Exécuter: tests locaux, agents (diagnostics)
- Vérifier: sorties CI, rapports `tests/reports/` - Vérifier: sorties CI, rapports `tests/reports/`
- Commiter: messages clairs, PR petites et ciblées - Commiter: messages clairs, PR petites et ciblées
## 8. Publication ## 8. Publication
- Choisir `latest` (tag `vX.Y.Z`) ou `wip` (ex: `vX.Y.Z-wip.N`) - Choisir `latest` (tag `vX.Y.Z`) ou `wip` (ex: `vX.Y.Z-wip.N`)
- Aligner: fichier de version, `CHANGELOG.md`, tag git - Aligner: fichier de version, `CHANGELOG.md`, tag git
- Déployer si pipeline défini; sinon documenter la procédure - Déployer si pipeline défini; sinon documenter la procédure
## 9. Dépannage ## 9. Dépannage
- Agents fallback PowerShell si bash indisponible localement - Agents fallback PowerShell si bash indisponible localement
- Consulter `tests/reports/agents/*.md` pour les écarts à corriger - Consulter `tests/reports/agents/*.md` pour les écarts à corriger
- Vérifier les logs de la CI et le job `release-guard` - Vérifier les logs de la CI et le job `release-guard`
## 10. Bonnes pratiques ## 10. Bonnes pratiques
- Pas dexemples applicatifs dans le template - Pas dexemples applicatifs dans le template
- Toujours mettre à jour la documentation et le changelog - Toujours mettre à jour la documentation et le changelog
- Réduire la dérive: synchroniser régulièrement vos projets avec les squelettes et standards - Réduire la dérive: synchroniser régulièrement vos projets avec les squelettes et standards

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,24 +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. # Utilitaire générique pour appeler l'API OpenAI Chat Completions.
# Prérequis: variable d'environnement OPENAI_API_KEY et curl. # 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 for bin in curl jq; do
if ! command -v "$bin" >/dev/null 2>&1; then if ! command -v "$bin" >/dev/null 2>&1; then
echo "$bin manquant. Installez $bin." >&2 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/compilation_agent.md" SUMMARY_FILE="$OUTPUT_DIR/compilation_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Compilation" > "$SUMMARY_FILE" echo "# Agent Compilation" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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 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" echo "- Étapes de build/format/clippy Rust détectées dans la CI." >> "$SUMMARY_FILE"
else else
echo "- Étapes de compilation non détectées dans la CI (à ajouter si nécessaire)." >> "$SUMMARY_FILE" echo "- Étapes de compilation non détectées dans la CI (à ajouter si nécessaire)." >> "$SUMMARY_FILE"
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/dependances_agent.md" SUMMARY_FILE="$OUTPUT_DIR/dependances_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Dépendances" > "$SUMMARY_FILE" echo "# Agent Dépendances" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
echo "- Vérifier régulièrement les dépendances (audit sécurité, mises à jour stables)." >> "$SUMMARY_FILE" echo "- Vérifier régulièrement les dépendances (audit sécurité, mises à jour stables)." >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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 if grep -q "security-audit" .gitea/workflows/ci.yml 2>/dev/null; then
echo "- Job CI security-audit détecté." >> "$SUMMARY_FILE" echo "- Job CI security-audit détecté." >> "$SUMMARY_FILE"
fi 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. É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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/deployment_agent.md" SUMMARY_FILE="$OUTPUT_DIR/deployment_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Déploiement" > "$SUMMARY_FILE" echo "# Agent Déploiement" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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" echo "## Résultats locaux" >> "$SUMMARY_FILE"
ok=1 ok=1
for f in docs/DEPLOYMENT.md docs/RELEASE_PLAN.md .gitea/workflows/ci.yml; do 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 done
if [[ $ok -eq 1 ]]; then echo "- Prérequis documentaires présents." >> "$SUMMARY_FILE"; fi 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. É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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo "- Aucun fichier de dérogations locales détecté." >> "$SUMMARY_FILE"
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/documentation_agent.md" SUMMARY_FILE="$OUTPUT_DIR/documentation_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Documentation" > "$SUMMARY_FILE" echo "# Agent Documentation" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
@ -20,13 +21,32 @@ if ((${#missing[@]}==0)); then
else else
echo "- Fichiers manquants:" >> "$SUMMARY_FILE" echo "- Fichiers manquants:" >> "$SUMMARY_FILE"
for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done 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 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). É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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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 if [[ -z "$docsx" ]]; then
echo "- Aucun fichier .docx détecté." >> "$SUMMARY_FILE" echo "- Aucun fichier .docx détecté." >> "$SUMMARY_FILE"
else else
@ -19,11 +19,11 @@ else
echo "- Utiliser docx2txt pour extraction et documenter dans docs/INDEX.md" >> "$SUMMARY_FILE" echo "- Utiliser docx2txt pour extraction et documenter dans docs/INDEX.md" >> "$SUMMARY_FILE"
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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 if [[ -z "$csvs" ]]; then
echo "- Aucun CSV détecté dans le dépôt." >> "$SUMMARY_FILE" echo "- Aucun CSV détecté dans le dépôt." >> "$SUMMARY_FILE"
else else
@ -18,11 +18,11 @@ else
echo "$csvs" | sed 's/^/ - /' >> "$SUMMARY_FILE" echo "$csvs" | sed 's/^/ - /' >> "$SUMMARY_FILE"
fi 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). À 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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 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. É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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/frontend_agent.md" SUMMARY_FILE="$OUTPUT_DIR/frontend_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Frontend" > "$SUMMARY_FILE" echo "# Agent Frontend" > "$SUMMARY_FILE"
echo >> "$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. 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 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/gitea_agent.md" SUMMARY_FILE="$OUTPUT_DIR/gitea_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Gitea" > "$SUMMARY_FILE" echo "# Agent Gitea" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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) need=(.gitea/ISSUE_TEMPLATE/bug_report.md .gitea/ISSUE_TEMPLATE/feature_request.md .gitea/PULL_REQUEST_TEMPLATE.md .gitea/workflows/ci.yml)
missing=() missing=()
for f in "${need[@]}"; do [[ -f "$f" ]] || missing+=("$f"); done 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 echo "- Manquants:" >> "$SUMMARY_FILE"; for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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 # Node / TypeScript
if has_file package.json; then HAS_NODE=1; fi 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 # Go
if has_file go.mod || has_file go.work; then HAS_GO=1; fi 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 if has_file Cargo.toml; then HAS_RUST=1; fi
# Python # 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) # 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) # 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 # 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 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/open_source_agent.md" 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 "# Agent Open Source" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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) need=(LICENSE CONTRIBUTING.md CODE_OF_CONDUCT.md docs/OPEN_SOURCE_CHECKLIST.md)
missing=() missing=()
for f in "${need[@]}"; do [[ -f "$f" ]] || missing+=("$f"); done 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 echo "- Manquants:" >> "$SUMMARY_FILE"; for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi fi
PROMPT=$(cat <<'P' PROMPT=$(cat <<'EOF'
Propose une checklist pour préparer louverture open source (gouvernance, CI, sécurité, documentation) compatible avec Gitea. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo "- Dossier tests/performance manquant." >> "$SUMMARY_FILE"
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null popd >/dev/null

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

@ -1,6 +1,14 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail 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:-.}" TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
@ -21,11 +29,11 @@ if [[ $issues -eq 0 ]]; then
echo "- Aucun problème formel bloquant détecté." >> "$SUMMARY_FILE" echo "- Aucun problème formel bloquant détecté." >> "$SUMMARY_FILE"
fi 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. É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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null popd >/dev/null

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

@ -1,6 +1,17 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail 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:-.}" TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
@ -64,7 +75,7 @@ if [[ "$HAS_PYTHON" -eq 1 ]]; then
fi fi
if [[ "$HAS_SHELL_BASH" -eq 1 ]]; then if [[ "$HAS_SHELL_BASH" -eq 1 ]]; then
if [[ "$HAS_SHELLCHECK" -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 else
echo "- Shell: shellcheck non disponible" >> "$SUMMARY_FILE" echo "- Shell: shellcheck non disponible" >> "$SUMMARY_FILE"
fi fi
@ -74,11 +85,11 @@ if [[ "$HAS_SHELL_PWSH" -eq 1 && "$HAS_PWSH" -eq 1 ]]; then
fi fi
# IA (optionnelle) # 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo "- Dossier archive/ manquant (recommandé pour REX)." >> "$SUMMARY_FILE"
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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)" DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
TARGET_DIR="${1:-.}" TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}" OUTPUT_DIR="${2:-tests/reports/agents}"
AGENT="${3:-all}"
mkdir -p "$OUTPUT_DIR" 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() { usage() {
cat <<USAGE cat <<USAGE
Usage: $0 [target_dir] [output_dir] [agent] Usage: $0 [target_dir] [output_dir] [agent]
Agents: Agents: fondation, structure, documentation, donnees-csv, documents-bureautiques,
Fondamentaux: fondation, structure tests, performance, qualite-technique/quality-tech, dependances, compilation,
Documentation: documentation, donnees-csv, documents-bureautiques resolution, ssh-scripts, frontend, open-source, gitea, versionnage,
Tests: tests, performance securite, deploiement, sync-template, derogations-locales, runner, all
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
USAGE USAGE
} }
AGENT="${3:-all}" run_agent() {
local script_name="$1"
"$DIR/${script_name}" "$TARGET_DIR" "$OUTPUT_DIR" || true
}
case "$AGENT" in case "$AGENT" in
quality-tech|qualite-technique) runner) run_agent "runner_agent.sh" ;;
"$DIR/quality_tech.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; quality-tech|qualite-technique) run_agent "quality_tech.sh" ;;
qualite-formelle|fondation) qualite-formelle|fondation) "$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true; "$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true ;;
"$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR" || "$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; structure) run_agent "structure_agent.sh" ;;
structure) tests) run_agent "tests_agent.sh" ;;
"$DIR/structure_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; performance) run_agent "performance_agent.sh" ;;
tests) documentation) run_agent "documentation_agent.sh" ;;
"$DIR/tests_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; donnees-csv) run_agent "donnees_csv_agent.sh" ;;
performance) documents-bureautiques)run_agent "documents_bureautiques_agent.sh" ;;
"$DIR/performance_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; securite) run_agent "security_agent.sh" ;;
documentation) deploiement) run_agent "deployment_agent.sh" ;;
"$DIR/documentation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; dependances) run_agent "dependances_agent.sh" ;;
donnees-csv) compilation) run_agent "compilation_agent.sh" ;;
"$DIR/donnees_csv_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; resolution) run_agent "resolution_agent.sh" ;;
documents-bureautiques) ssh-scripts) run_agent "ssh_scripts_agent.sh" ;;
"$DIR/documents_bureautiques_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; frontend) run_agent "frontend_agent.sh" ;;
securite) open-source) run_agent "open_source_agent.sh" ;;
"$DIR/security_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; gitea) run_agent "gitea_agent.sh" ;;
deploiement) versionnage) run_agent "versionnage_agent.sh" ;;
"$DIR/deployment_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" ;; sync-template) run_agent "sync_template_agent.sh" ;;
dependances) derogations-locales) run_agent "derogations_locales_agent.sh" ;;
"$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" ;;
all) all)
"$DIR/quality_tech.sh" "$TARGET_DIR" "$OUTPUT_DIR" for a in \
"$DIR/qualite_formelle.sh" "$TARGET_DIR" "$OUTPUT_DIR" runner_agent.sh quality_tech.sh qualite_formelle.sh fondation_agent.sh structure_agent.sh \
"$DIR/fondation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true tests_agent.sh performance_agent.sh documentation_agent.sh donnees_csv_agent.sh \
"$DIR/structure_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true documents_bureautiques_agent.sh security_agent.sh deployment_agent.sh dependances_agent.sh \
"$DIR/tests_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" compilation_agent.sh resolution_agent.sh ssh_scripts_agent.sh frontend_agent.sh \
"$DIR/performance_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true open_source_agent.sh gitea_agent.sh versionnage_agent.sh sync_template_agent.sh derogations_locales_agent.sh; do
"$DIR/documentation_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" "$DIR/$a" "$TARGET_DIR" "$OUTPUT_DIR" || true
"$DIR/donnees_csv_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true done ;;
"$DIR/documents_bureautiques_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" || true -h|--help) usage; exit 0 ;;
"$DIR/security_agent.sh" "$TARGET_DIR" "$OUTPUT_DIR" *) echo "Agent inconnu: $AGENT" >&2; usage; exit 2 ;;
"$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 ;;
esac 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" 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/security_agent.md" SUMMARY_FILE="$OUTPUT_DIR/security_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Sécurité" > "$SUMMARY_FILE" echo "# Agent Sécurité" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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" echo "## Résultats locaux" >> "$SUMMARY_FILE"
if [[ -x scripts/security/audit.sh ]]; then if [[ -x scripts/security/audit.sh ]]; then
if scripts/security/audit.sh >> "$SUMMARY_FILE" 2>&1; 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" echo "- scripts/security/audit.sh introuvable ou non exécutable." >> "$SUMMARY_FILE"
fi 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é. À 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/ssh_scripts_agent.md" 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 "# Agent SSH & scripts" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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=( paths=(
scripts/auto-ssh-push.sh scripts/auto-ssh-push.sh
scripts/init-ssh-env.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 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/structure_agent.md" SUMMARY_FILE="$OUTPUT_DIR/structure_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Structure" > "$SUMMARY_FILE" echo "# Agent Structure" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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) need=(docs .gitea scripts CHANGELOG.md AGENTS.md)
missing=() missing=()
for p in "${need[@]}"; do [[ -e "$p" ]] || missing+=("$p"); done 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 for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done
fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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" echo "- Manifeste .4nk-sync.yml manquant." >> "$SUMMARY_FILE"
fi 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). 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null popd >/dev/null

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

@ -1,10 +1,19 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail 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:-.}" TARGET_DIR="${1:-.}"
OUTPUT_DIR="${2:-tests/reports/agents}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/tests_agent.md" SUMMARY_FILE="$OUTPUT_DIR/tests_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Tests" > "$SUMMARY_FILE" echo "# Agent Tests" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
@ -21,13 +30,21 @@ if ((${#missing[@]}==0)); then
else else
echo "- Dossiers manquants:" >> "$SUMMARY_FILE" echo "- Dossiers manquants:" >> "$SUMMARY_FILE"
for m in "${missing[@]}"; do echo " - $m" >> "$SUMMARY_FILE"; done 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 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null 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}" OUTPUT_DIR="${2:-tests/reports/agents}"
mkdir -p "$OUTPUT_DIR" mkdir -p "$OUTPUT_DIR"
SUMMARY_FILE="$OUTPUT_DIR/versionnage_agent.md" SUMMARY_FILE="$OUTPUT_DIR/versionnage_agent.md"
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/common.sh" || true
echo "# Agent Versionnage" > "$SUMMARY_FILE" echo "# Agent Versionnage" > "$SUMMARY_FILE"
echo >> "$SUMMARY_FILE" echo >> "$SUMMARY_FILE"
pushd "$TARGET_DIR" >/dev/null 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 ok=1
for f in CHANGELOG.md TEMPLATE_VERSION; do for f in CHANGELOG.md TEMPLATE_VERSION; do
if [[ ! -f "$f" ]]; then echo "- Manquant: $f" >> "$SUMMARY_FILE"; ok=0; fi if [[ ! -f "$f" ]]; then echo "- Manquant: $f" >> "$SUMMARY_FILE"; ok=0; fi
done done
if [[ $ok -eq 1 ]]; then echo "- CHANGELOG et TEMPLATE_VERSION présents." >> "$SUMMARY_FILE"; fi 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. 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" echo "Rapport: $SUMMARY_FILE"
popd >/dev/null popd >/dev/null

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

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

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

@ -67,7 +67,7 @@ OPENAI_API_BASE=https://api.openai.com/v1
OPENAI_TEMPERATURE=0.2 OPENAI_TEMPERATURE=0.2
# Gitea (release via API) # Gitea (release via API)
GITEA_BASE_URL=https://git.4nkweb.com BASE_URL=https://git.4nkweb.com
RELEASE_TOKEN= RELEASE_TOKEN=
EOF EOF
fi fi

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" 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" echo "✅ Authentification SSH réussie"
# Fonction pour push automatique # 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() { 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')"} local commit_message=${2:-"Auto-commit $(date '+%Y-%m-%d %H:%M:%S')"}
echo "🚀 Push automatique sur la branche: $branch" echo "🚀 Push automatique sur la branche: $branch"
@ -35,7 +50,7 @@ auto_push() {
# Ajouter tous les changements # Ajouter tous les changements
git add . git add .
# Ne pas commiter si rien à commiter # Ne pas commiter si rien à commite
if [[ -z "$(git diff --cached --name-only)" ]]; then if [[ -z "$(git diff --cached --name-only)" ]]; then
echo " Aucun changement indexé. Skip commit/push." echo " Aucun changement indexé. Skip commit/push."
return 0 return 0
@ -54,7 +69,7 @@ auto_push() {
# Fonction pour push avec message personnalisé # Fonction pour push avec message personnalisé
push_with_message() { push_with_message() {
local message="$1" local message="$1"
local branch=${2:-$(git branch --show-current)} local branch=${2:-$(get_current_branch)}
echo "💬 Push avec message: $message" echo "💬 Push avec message: $message"
auto_push "$branch" "$message" auto_push "$branch" "$message"
@ -62,7 +77,7 @@ push_with_message() {
# Fonction pour push rapide (sans message) # Fonction pour push rapide (sans message)
quick_push() { quick_push() {
local branch=${1:-$(git branch --show-current)} local branch=${1:-$(get_current_branch)}
auto_push "$branch" auto_push "$branch"
} }
@ -77,7 +92,7 @@ push_branch() {
# Fonction pour push et merge vers main # Fonction pour push et merge vers main
push_and_merge() { push_and_merge() {
local source_branch=${1:-$(git branch --show-current)} local source_branch=${1:-$(get_current_branch)}
local target_branch=${2:-main} local target_branch=${2:-main}
echo "🔄 Push et merge $source_branch -> $target_branch" 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 # 4. Alias Git
print_status "Configuration des 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.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 branch --show-current); }; 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" print_success "Alias Git configurés"
# 5. Rendu exécutable des scripts si chemin standard # 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" echo "[security-audit] terminé rc=$rc"
exit $rc exit $rc

View File

@ -3,6 +3,7 @@
Ce répertoire décrit la stratégie et lorganisation des tests exigées par le template 4NK. Ce répertoire décrit la stratégie et lorganisation des tests exigées par le template 4NK.
## Pyramide de tests ## Pyramide de tests
- Unit: validation des unités logicielles - Unit: validation des unités logicielles
- Integration: interactions multi-composants - Integration: interactions multi-composants
- Connectivity: réseau et endpoints - Connectivity: réseau et endpoints
@ -10,16 +11,20 @@ Ce répertoire décrit la stratégie et lorganisation des tests exigées par
- Performance: charge et temps de réponse - Performance: charge et temps de réponse
## Exécution ## Exécution
- Local: exécuter les suites pertinentes et déposer les résultats dans `tests/reports` - Local: exécuter les suites pertinentes et déposer les résultats dans `tests/reports`
- CI: orchestrée par `.gitea/workflows/ci.yml` - CI: orchestrée par `.gitea/workflows/ci.yml`
## Journaux et rapports ## Journaux et rapports
- `tests/logs`: journaux dexécution - `tests/logs`: journaux dexécution
- `tests/reports`: rapports synthétiques - `tests/reports`: rapports synthétiques
## Nettoyage ## Nettoyage
Utiliser `tests/cleanup.sh` après exécution. Utiliser `tests/cleanup.sh` après exécution.
## Critères dacceptation ## Critères dacceptation
- Zéro échec avant commit - Zéro échec avant commit
- Documentation associée à jour dans `docs/TESTING.md` - Documentation associée à jour dans `docs/TESTING.md`