Compare commits
39 Commits
v2025.08.1
...
main
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6ced5d2923 | ||
![]() |
7f8dc0a926 | ||
![]() |
4c47efc9b4 | ||
![]() |
e43abef18f | ||
![]() |
043434bfe8 | ||
![]() |
57c047e76d | ||
![]() |
46d5d20c7d | ||
![]() |
99e1e0bda7 | ||
![]() |
948b11793a | ||
![]() |
25453b045e | ||
![]() |
21e4f76445 | ||
![]() |
5674437bc4 | ||
![]() |
1add88bcbb | ||
27297dbb77 | |||
01926eb9c0 | |||
5bf8bd280c | |||
a9f4ce0485 | |||
ee48b95f54 | |||
86b01563fc | |||
0783d30c10 | |||
dc92b4082a | |||
a624d091a0 | |||
86ad8eb62a | |||
68ce80c2cf | |||
270ad3488c | |||
8713c7f971 | |||
7f8e36f69e | |||
5210126c82 | |||
d02901689c | |||
7aee843d9d | |||
fb1968f610 | |||
dfa25324e1 | |||
e1b89fa6ed | |||
97c093724e | |||
7d481a7c5e | |||
c96b09a308 | |||
54772d1151 | |||
be5a5200d0 | |||
c29e061c34 |
@ -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
|
||||||
---
|
---
|
||||||
|
@ -25,6 +25,9 @@ Tous les projets issus de 4NK_project_template. Contrôle de l’alignement sur
|
|||||||
- Erreur bloquante si un path requis n’existe pas après sync.
|
- Erreur bloquante si un path requis n’existe 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 l’exé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 l’alignement sur
|
|||||||
- Erreur bloquante si un path requis n’existe pas après sync.
|
- Erreur bloquante si un path requis n’existe 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 l’exé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.
|
||||||
|
@ -21,3 +21,4 @@ tests/reports/
|
|||||||
!/.cursor
|
!/.cursor
|
||||||
!/AGENTS.md
|
!/AGENTS.md
|
||||||
|
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
1
.gitignore
vendored
@ -34,3 +34,4 @@ git-installer.exe
|
|||||||
|
|
||||||
# Ne pas ignorer .cursor ni AGENTS.md
|
# Ne pas ignorer .cursor ni AGENTS.md
|
||||||
|
|
||||||
|
|
||||||
|
19
AGENTS.md
19
AGENTS.md
@ -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 l’exé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`.
|
||||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@ -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 l’exé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/**
|
||||||
|
@ -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
177
README.md
@ -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 d’open source applicable à tous les projets 4NK et fournit des supports initiaux (modèles CI/CD, règles Cursor, scripts, guides). Chaque projet doit l’adapter à 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 d’agents et une documentation prête à adapter.
|
||||||
|
|
||||||
## 📋 Table des Matières
|
## 📦 Ce que vous obtenez
|
||||||
|
|
||||||
|
- Standards de qualité et sécurité (lint, audit, release‑guard)
|
||||||
|
- Agents automatisés (qualité, docs, tests, sécurité, déploiement)
|
||||||
|
- CI Gitea prête à l’emploi (self‑hosted, 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 d’infos: `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 d’exemples 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 lui‑même (règles, CI, scripts), se référer à `docs/TEMPLATE_FEEDBACK.md` et utiliser le type d’issue « 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
|
|
||||||
|
|
||||||
---
|
|
||||||
|
25
SECURITY.md
25
SECURITY.md
@ -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
|
||||||
|
@ -1,2 +1 @@
|
|||||||
v2025.08.1
|
v2025.08.6
|
||||||
|
|
||||||
|
19
docker-compose.ci.yml
Normal file
19
docker-compose.ci.yml
Normal 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
26
docker/Dockerfile.ci
Normal 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
10
docker/Dockerfile.debian
Normal 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
55
docker/entrypoint.ci.sh
Normal 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
2
docs/ARCHITECTURE.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Architecture
|
||||||
|
|
2
docs/DEPLOYMENT.md
Normal file
2
docs/DEPLOYMENT.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Déploiement
|
||||||
|
|
156
docs/INDEX.md
Normal file
156
docs/INDEX.md
Normal 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
2
docs/SECURITY_AUDIT.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Security Audit
|
||||||
|
|
2
docs/TESTING.md
Normal file
2
docs/TESTING.md
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# Tests
|
||||||
|
|
@ -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 l’analyse IA
|
- (Optionnel) `OPENAI_API_KEY` pour activer l’analyse 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. Auto‑corrections (optionnelles)
|
||||||
|
|
||||||
|
- `AUTO_FIX=1` permet aux agents d’appliquer des corrections minimales:
|
||||||
|
- création des dossiers `tests/**` manquants
|
||||||
|
- génération de squelettes Markdown basiques pour quelques fichiers de `docs/`
|
||||||
|
- Traçabilité: les actions sont listées dans les rapports `tests/reports/agents/*.md`
|
||||||
|
|
||||||
|
## 9. Bonnes pratiques
|
||||||
|
|
||||||
- Exécuter les agents avant chaque PR
|
- 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
|
||||||
|
@ -3,9 +3,25 @@
|
|||||||
## Variables d’environnement (CI)
|
## Variables d’environnement (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 l’API Gitea)
|
- **Release**: `RELEASE_TOKEN` (publication des releases via l’API 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 court‑circuités
|
||||||
|
- Définir à `false` pour réactiver la CI côté dépôt
|
||||||
|
- Alternative ponctuelle: commit message `[skip ci]`
|
||||||
|
|
||||||
|
## Variables d’environnement (agents)
|
||||||
|
|
||||||
|
- `AUTO_FIX` (0/1, défaut 0): active les corrections automatiques côté agents
|
||||||
|
- Création de la structure `tests/**` manquante
|
||||||
|
- Génération de squelettes minimalistes pour certains fichiers de `docs/`
|
||||||
|
- `SCOPE` (`all`|`changed`, défaut `all`):
|
||||||
|
- `all`: passe sur l’ensemble du dépôt
|
||||||
|
- `changed`: focalise les contrôles/corrections sur les fichiers modifiés du dernier commit
|
||||||
|
|
||||||
## Conventions
|
## 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 l’entrypoint `docker/entrypoint.ci.sh`:
|
||||||
|
|
||||||
|
- `RUNNER_MODE` détermine le mode d’exécution
|
||||||
|
- `BASE_URL` et `REGISTRATION_TOKEN` servent à l’enregistrement du runner (act_runner)
|
||||||
|
|
||||||
|
## 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)
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
- Script d’installation: `scripts/deploy/setup.sh`
|
- Script d’installation: `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
|
||||||
|
```
|
||||||
|
@ -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 d’issues/PR
|
- Vérifier les templates d’issues/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 d’un push de tag `v*`
|
- Le job `release-create` utilisera ce secret lors d’un 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
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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/security‑audit/release‑guard
|
- CI verte: lint/tests/doc/security‑audit/release‑guard
|
||||||
- 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 l’alignement version/changelog correspondant au tag
|
||||||
|
- Appliquer les agents (localement si CI neutre) puis merger
|
||||||
|
|
||||||
## Post‑lancement
|
## Post‑lancement
|
||||||
|
|
||||||
- Suivi issues/retours
|
- Suivi issues/retours
|
||||||
- Corrections critiques
|
- Corrections critiques
|
||||||
- Mise à jour de la roadmap
|
- Mise à jour de la roadmap
|
||||||
|
|
||||||
|
@ -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 multi‑langages, déploiement dry‑run)
|
- T2: Extensions CI (lint multi‑langages, déploiement dry‑run)
|
||||||
- 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é
|
||||||
|
|
||||||
|
@ -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/rate‑limit)
|
- Vérifs de configuration (auth/TLS/CORS/rate‑limit)
|
||||||
- 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 d’environnement
|
- Exclusivement secrets CI/variables d’environnement
|
||||||
- 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 non‑régression sécurité si pertinent
|
- Ajouter des tests de non‑régression sécurité si pertinent
|
||||||
|
|
||||||
|
@ -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 d’usage — 4NK_template (projet)
|
# Guide d’usage — 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 l’image 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`
|
||||||
|
- Auto‑corrections: `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, security‑audit, bash‑required, release‑guard
|
- Jobs attendus: qualité, tests (catégories pertinentes), documentation, security‑audit, bash‑required, release‑guard
|
||||||
- `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 d’environnement), jamais en clair dans le dépôt
|
- Secrets uniquement via la CI (variables d’environnement), 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 d’exemples applicatifs dans le template
|
- Pas d’exemples 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
|
||||||
|
|
||||||
|
8
docs/templates/API.md
vendored
8
docs/templates/API.md
vendored
@ -1,8 +0,0 @@
|
|||||||
# Référence API — Template
|
|
||||||
|
|
||||||
- Vue d’ensemble
|
|
||||||
- Authentification/permissions
|
|
||||||
- Endpoints par domaine (schémas, invariants)
|
|
||||||
- Codes d’erreur
|
|
||||||
- Limites et quotas
|
|
||||||
- Sécurité et conformité
|
|
8
docs/templates/ARCHITECTURE.md
vendored
8
docs/templates/ARCHITECTURE.md
vendored
@ -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
|
|
6
docs/templates/CONFIGURATION.md
vendored
6
docs/templates/CONFIGURATION.md
vendored
@ -1,6 +0,0 @@
|
|||||||
# Configuration — Template
|
|
||||||
|
|
||||||
- Variables d’environnement (nom, type, défaut, portée)
|
|
||||||
- Fichiers de configuration (format, validation)
|
|
||||||
- Réseau et sécurité (ports, TLS, auth)
|
|
||||||
- Observabilité (logs, métriques, traces)
|
|
12
docs/templates/INDEX.md
vendored
12
docs/templates/INDEX.md
vendored
@ -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 d’architecture
|
|
||||||
- CONFIGURATION.md — squelette de configuration
|
|
||||||
- USAGE.md — squelette d’usage
|
|
||||||
- TESTING.md — squelette de stratégie de tests
|
|
||||||
- SECURITY_AUDIT.md — squelette d’audit sécurité
|
|
||||||
- RELEASE_PLAN.md — squelette de plan de release
|
|
||||||
- OPEN_SOURCE_CHECKLIST.md — squelette de checklist open source
|
|
7
docs/templates/OPEN_SOURCE_CHECKLIST.md
vendored
7
docs/templates/OPEN_SOURCE_CHECKLIST.md
vendored
@ -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
|
|
24
docs/templates/README.md
vendored
24
docs/templates/README.md
vendored
@ -1,24 +0,0 @@
|
|||||||
# README — Template de projet
|
|
||||||
|
|
||||||
## Présentation
|
|
||||||
Décrivez brièvement l’objectif du projet, son périmètre et ses utilisateurs cibles.
|
|
||||||
|
|
||||||
## Démarrage rapide
|
|
||||||
- Prérequis (langages/outils)
|
|
||||||
- Étapes d’installation
|
|
||||||
- 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)
|
|
7
docs/templates/RELEASE_PLAN.md
vendored
7
docs/templates/RELEASE_PLAN.md
vendored
@ -1,7 +0,0 @@
|
|||||||
# Plan de release — Template
|
|
||||||
|
|
||||||
- Vue d’ensemble, objectifs, date cible
|
|
||||||
- Préparation (docs/CI/tests/sécurité)
|
|
||||||
- Communication (annonces, canaux)
|
|
||||||
- Lancement (checklist, tagging)
|
|
||||||
- Post‑lancement (support, retours)
|
|
7
docs/templates/SECURITY_AUDIT.md
vendored
7
docs/templates/SECURITY_AUDIT.md
vendored
@ -1,7 +0,0 @@
|
|||||||
# Audit de sécurité — Template
|
|
||||||
|
|
||||||
- Menaces et surfaces d’attaque
|
|
||||||
- Contrôles préventifs et détectifs
|
|
||||||
- Gestion des secrets
|
|
||||||
- Politique de dépendances
|
|
||||||
- Vérifications CI (security-audit)
|
|
6
docs/templates/TESTING.md
vendored
6
docs/templates/TESTING.md
vendored
@ -1,6 +0,0 @@
|
|||||||
# Tests — Template
|
|
||||||
|
|
||||||
- Pyramide: unit, integration, connectivity, external, performance
|
|
||||||
- Structure des répertoires
|
|
||||||
- Exécution et rapports
|
|
||||||
- Intégration CI
|
|
7
docs/templates/USAGE.md
vendored
7
docs/templates/USAGE.md
vendored
@ -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
49
runner/README.md
Normal 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/` n’est 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
18
runner/docker-compose.yml
Normal 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
8
scripts/agents/ai_prompt.sh
Normal file → Executable 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
19
scripts/agents/common.sh
Executable 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
12
scripts/agents/compilation_agent.sh
Normal file → Executable 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
12
scripts/agents/dependances_agent.sh
Normal file → Executable 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
12
scripts/agents/deployment_agent.sh
Normal file → Executable 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, post‑deploy) adaptée à un template CI Gitea.
|
Établis une checklist de déploiement minimale (pré‑checks, variables, smoke tests, rollback, post‑deploy) 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
6
scripts/agents/derogations_locales_agent.sh
Normal file → Executable 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
26
scripts/agents/documentation_agent.sh
Normal file → Executable 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 "## Auto‑corrections" >> "$SUMMARY_FILE"
|
||||||
|
for m in "${missing[@]}"; do
|
||||||
|
case "$m" in
|
||||||
|
docs/INDEX.md)
|
||||||
|
mkdir -p docs && printf "# Index\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;;
|
||||||
|
docs/ARCHITECTURE.md)
|
||||||
|
mkdir -p docs && printf "# Architecture\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;;
|
||||||
|
docs/TESTING.md)
|
||||||
|
mkdir -p docs && printf "# Tests\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;;
|
||||||
|
docs/SECURITY_AUDIT.md)
|
||||||
|
mkdir -p docs && printf "# Security Audit\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;;
|
||||||
|
docs/DEPLOYMENT.md)
|
||||||
|
mkdir -p docs && printf "# Déploiement\n\n" > "$m" && echo "- Créé squelette: $m" >> "$SUMMARY_FILE" ;;
|
||||||
|
*) : ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
PROMPT=$(cat <<'P'
|
PROMPT=$(cat <<'EOF'
|
||||||
Élabore une liste courte d’améliorations documentation (INDEX à jour, traçabilité changes ↔ CHANGELOG, sections sécurité/tests/déploiement).
|
Élabore une liste courte d’amé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
8
scripts/agents/documents_bureautiques_agent.sh
Normal file → Executable 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
8
scripts/agents/donnees_csv_agent.sh
Normal file → Executable 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 (en‑têtes multi‑lignes 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 (en‑têtes multi‑lignes 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
6
scripts/agents/fondation_agent.sh
Normal file → Executable 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 d’exemples applicatifs, intro/conclusion) et liste 5 actions d’amélioration priorisées.
|
Évalue la conformité éditoriale (français, pas d’exemples applicatifs, intro/conclusion) et liste 5 actions d’amé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
12
scripts/agents/frontend_agent.sh
Normal file → Executable 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
12
scripts/agents/gitea_agent.sh
Normal file → Executable 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
8
scripts/agents/lang_detect.sh
Normal file → Executable 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 lorsqu’ils existent
|
# Exposer aussi l'état des outils lorsqu’ils 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
12
scripts/agents/open_source_agent.sh
Normal file → Executable 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 l’ouverture open source (gouvernance, CI, sécurité, documentation) compatible avec Gitea.
|
Propose une checklist pour préparer l’ouverture 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
6
scripts/agents/performance_agent.sh
Normal file → Executable 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
14
scripts/agents/qualite_formelle.sh
Normal file → Executable 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 d’exemples applicatifs, intro/conclusion) et propose 5 recommandations priorisées.
|
Évalue la qualité formelle (français uniquement, typographie, absence d’exemples 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
19
scripts/agents/quality_tech.sh
Normal file → Executable 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
6
scripts/agents/resolution_agent.sh
Normal file → Executable 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, non‑régression) et quand produire un REX.
|
Décris la boucle de triage complète (repro minimale, logs, bissection, hypothèses, tests ciblés, correctif, non‑ré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
|
||||||
|
@ -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
163
scripts/agents/run.sh
Normal file → Executable 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
31
scripts/agents/runner_agent.sh
Executable 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
12
scripts/agents/security_agent.sh
Normal file → Executable 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 d’un dépôt template, propose 5 contrôles sécurité CI/CD additionnels (secrets, permissions, dépendances, scans) et un ordre de priorité.
|
À partir d’un 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
12
scripts/agents/ssh_scripts_agent.sh
Normal file → Executable 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
12
scripts/agents/structure_agent.sh
Normal file → Executable 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 l’alignement avec l’arborescence 4NK_node et propose 5 corrections prioritaires (créations/archives/métadonnées) si des écarts sont détectés.
|
Vérifie l’alignement avec l’arborescence 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
6
scripts/agents/sync_template_agent.sh
Normal file → Executable 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
23
scripts/agents/tests_agent.sh
Normal file → Executable 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 "## Auto‑corrections" >> "$SUMMARY_FILE"
|
||||||
|
for m in "${missing[@]}"; do
|
||||||
|
mkdir -p "$m" && echo "- Créé: $m" >> "$SUMMARY_FILE"
|
||||||
|
done
|
||||||
|
mkdir -p tests/reports/agents tests/logs || true
|
||||||
|
fi
|
||||||
fi
|
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
12
scripts/agents/versionnage_agent.sh
Normal file → Executable 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 d’alignement version ↔ changelog ↔ tag git (latest vs wip) et conditions de blocage release.
|
Décris la procédure d’alignement 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
1
scripts/checks/version_alignment.sh
Normal file → Executable file
@ -19,3 +19,4 @@ fi
|
|||||||
|
|
||||||
echo "Version alignment OK"
|
echo "Version alignment OK"
|
||||||
|
|
||||||
|
|
||||||
|
2
scripts/deploy/setup.sh
Normal file → Executable file
2
scripts/deploy/setup.sh
Normal file → Executable 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
15
scripts/dev/run_container.sh
Executable 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
14
scripts/dev/run_project_ci.sh
Executable 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
0
scripts/env/ensure_env.sh
vendored
Normal file → Executable file
19
scripts/local/install_hooks.sh
Executable file
19
scripts/local/install_hooks.sh
Executable 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)."
|
22
scripts/local/install_host_deps.sh
Executable file
22
scripts/local/install_host_deps.sh
Executable 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
25
scripts/local/merge_branch.sh
Executable 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
11
scripts/local/precommit.sh
Executable 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
21
scripts/local/prepush.sh
Executable 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
20
scripts/local/release_local.sh
Executable 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"
|
51
scripts/local/run_agents_for_project.sh
Executable file
51
scripts/local/run_agents_for_project.sh
Executable 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
1
scripts/release/guard.sh
Normal file → Executable 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
25
scripts/scripts/auto-ssh-push.sh
Normal file → Executable 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
4
scripts/scripts/init-ssh-env.sh
Normal file → Executable 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
0
scripts/scripts/setup-ssh-ci.sh
Normal file → Executable file
1
scripts/security/audit.sh
Normal file → Executable file
1
scripts/security/audit.sh
Normal file → Executable file
@ -34,3 +34,4 @@ fi
|
|||||||
echo "[security-audit] terminé rc=$rc"
|
echo "[security-audit] terminé rc=$rc"
|
||||||
exit $rc
|
exit $rc
|
||||||
|
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
Ce répertoire décrit la stratégie et l’organisation des tests exigées par le template 4NK.
|
Ce répertoire décrit la stratégie et l’organisation 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 l’organisation 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 d’exécution
|
- `tests/logs`: journaux d’exé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 d’acceptation
|
## Critères d’acceptation
|
||||||
|
|
||||||
- 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`
|
||||||
|
Loading…
x
Reference in New Issue
Block a user