ci: add Forgejo Actions pipeline and gitleaks secret-scan config
This commit is contained in:
parent
971ce0c7d0
commit
46832a17ce
11 changed files with 3780 additions and 167 deletions
|
|
@ -42,34 +42,3 @@ Voir @.claude/rules/hermes-dispatcher.md pour les commandes Hermes.
|
|||
- `@hermes` → Dispatcher universel (recommandations, routage, pipelines)
|
||||
- Agent disponibles: voir @.claude/rules/byan-agents.md
|
||||
- Methodologie: voir @.claude/rules/merise-agile.md
|
||||
- Systeme de confiance epistemique: voir @.claude/rules/elo-trust.md
|
||||
- Protocol fact-check scientifique: voir @.claude/rules/fact-check.md
|
||||
- Systeme API byan_web: voir @.claude/rules/byan-api.md
|
||||
|
||||
## API byan_web
|
||||
|
||||
BYAN expose une API REST via `$BYAN_API_URL` avec authentification par token (`ApiKey` ou `Bearer`).
|
||||
26 tools MCP sont disponibles pour Claude Code — a preferer au curl direct.
|
||||
Voir @.claude/rules/byan-api.md pour le detail.
|
||||
|
||||
## ELO Trust System
|
||||
|
||||
BYAN calibre l'intensite de ses challenges selon votre score ELO par domaine.
|
||||
Score bas → explications pedagogiques et scaffolding. Score eleve → aller droit au but.
|
||||
|
||||
Commandes CLI:
|
||||
- `node bin/byan-v2-cli.js elo summary` — voir tous les scores par domaine
|
||||
- `node bin/byan-v2-cli.js elo dashboard {domain}` — detail d'un domaine
|
||||
- `node bin/byan-v2-cli.js elo declare {domain} {level}` — declarer son expertise (junior/mid/senior/lead/expert)
|
||||
|
||||
Dans l'agent BYAN, tapez `[ELO]` pour acceder au menu ELO.
|
||||
|
||||
## Fact-Check Scientifique
|
||||
|
||||
BYAN applique Zero Trust sur lui-meme : tout claim doit etre demonstrable, quantifiable, reproductible.
|
||||
4 types d'assertions : `[REASONING]` `[HYPOTHESIS]` `[CLAIM Ln]` `[FACT USER-VERIFIED]`
|
||||
5 niveaux de preuve : L1 (spec officielle, 95%) → L5 (opinion, 20%)
|
||||
Domaines stricts : security/performance/compliance → LEVEL-2 minimum sinon BLOCKED.
|
||||
|
||||
Agent dédié: `@fact-checker` — analyse assertions, audits de documents, chaines de raisonnement.
|
||||
Dans BYAN: tapez `[FC]` pour le sous-menu fact-check.
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@
|
|||
|
||||
| Agent | Persona | Role |
|
||||
|-------|---------|------|
|
||||
| **byan** | Builder | Createur d'agents via interview (12 questions, 64 mantras) — [FC] + [ELO] intégrés |
|
||||
| **fact-checker** | Scientifique | Fact-check: assertions, audits de documents, chaines de raisonnement |
|
||||
| **byan** | Builder | Createur d'agents via interview (12 questions, 64 mantras) |
|
||||
| **agent-builder** | Constructeur | Expert en construction d'agents |
|
||||
| **marc** | Specialiste | Integration GitHub Copilot |
|
||||
| **rachid** | Specialiste | Deploiement NPM/NPX |
|
||||
|
|
@ -64,7 +63,6 @@
|
|||
| `code-review` | Revoir du code |
|
||||
| `quick-spec` | Spec rapide conversationnelle |
|
||||
| `quick-dev` | Dev rapide (brownfield) |
|
||||
| `elo-workflow` | Consulter et gerer le score ELO (via menu [ELO] du BYAN) |
|
||||
|
||||
## Comment Invoquer un Agent
|
||||
|
||||
|
|
|
|||
82
.forgejo/workflows/ci.yml
Normal file
82
.forgejo/workflows/ci.yml
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
name: CI
|
||||
# CI Wakdo - Forgejo Actions (runner stark-wakdo, label `docker`).
|
||||
# Strategie solo dev : PR obligatoire + auto-merge sur CI verte (voir SECURITY.md).
|
||||
#
|
||||
# Etat des jobs selon la phase projet :
|
||||
# - secret-scan : fonctionnel des maintenant (gitleaks scanne tout le depot)
|
||||
# - php-lint : fonctionnel sur les fichiers PHP presents (stubs P1, code P2+)
|
||||
# - static-tests: PHPStan + PHPUnit GARDES - s'activent quand P2 ajoute
|
||||
# composer.json / phpstan.neon / tests + phpunit.xml
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [dev, main]
|
||||
push:
|
||||
# dev/main : porte de merge. feat|fix|ci|refactor : feedback avant la PR.
|
||||
branches: [dev, main, 'feat/**', 'fix/**', 'ci/**', 'refactor/**']
|
||||
|
||||
jobs:
|
||||
secret-scan:
|
||||
runs-on: docker
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Install tools
|
||||
run: |
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq curl ca-certificates tar >/dev/null
|
||||
- name: Install gitleaks
|
||||
run: |
|
||||
VER=8.21.2
|
||||
curl -sSL "https://github.com/gitleaks/gitleaks/releases/download/v${VER}/gitleaks_${VER}_linux_x64.tar.gz" -o /tmp/gl.tgz
|
||||
tar -xzf /tmp/gl.tgz -C /usr/local/bin gitleaks
|
||||
gitleaks version
|
||||
- name: Scan for secrets
|
||||
run: gitleaks detect --config .gitleaks.toml --redact --no-banner --verbose
|
||||
|
||||
php-lint:
|
||||
runs-on: docker
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install PHP CLI
|
||||
run: |
|
||||
apt-get update -qq
|
||||
apt-get install -y -qq php-cli >/dev/null
|
||||
php --version
|
||||
- name: Lint all PHP files
|
||||
run: |
|
||||
set -eu
|
||||
files=$(find . -path ./node_modules -prune -o -name '*.php' -print)
|
||||
if [ -z "$files" ]; then echo "No PHP files yet - skip"; exit 0; fi
|
||||
echo "$files" | while IFS= read -r f; do
|
||||
[ -z "$f" ] && continue
|
||||
php -l "$f"
|
||||
done
|
||||
|
||||
static-tests:
|
||||
runs-on: docker
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: PHPStan (guarded)
|
||||
run: |
|
||||
if [ -f composer.json ] && [ -f phpstan.neon ]; then
|
||||
echo "phpstan config detected - running"
|
||||
apt-get update -qq && apt-get install -y -qq php-cli unzip git >/dev/null
|
||||
curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
|
||||
composer install --no-interaction --no-progress
|
||||
vendor/bin/phpstan analyse --no-progress
|
||||
else
|
||||
echo "PHPStan skipped: no composer.json/phpstan.neon yet (activates in P2)"
|
||||
fi
|
||||
- name: PHPUnit (guarded)
|
||||
run: |
|
||||
if [ -d tests ] && [ -f phpunit.xml ]; then
|
||||
echo "phpunit config detected - running"
|
||||
apt-get update -qq && apt-get install -y -qq php-cli >/dev/null
|
||||
if [ -f vendor/bin/phpunit ]; then vendor/bin/phpunit; \
|
||||
elif [ -f phpunit.phar ]; then php phpunit.phar; \
|
||||
else echo "phpunit binary missing despite config" && exit 1; fi
|
||||
else
|
||||
echo "PHPUnit skipped: no tests/ + phpunit.xml yet (activates in P2)"
|
||||
fi
|
||||
31
.gitleaks.toml
Normal file
31
.gitleaks.toml
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
# Wakdo - configuration gitleaks (secret-scan)
|
||||
#
|
||||
# Utilise par :
|
||||
# - le hook pre-commit local (defense en profondeur)
|
||||
# - le job CI Forgejo Actions (.forgejo/workflows/, lot D) sur chaque PR -> dev
|
||||
#
|
||||
# Principe : etendre le jeu de regles par defaut de gitleaks, puis ne tolerer
|
||||
# QUE les faux positifs explicitement justifies ci-dessous (placeholders de doc).
|
||||
|
||||
[extend]
|
||||
useDefault = true
|
||||
|
||||
[allowlist]
|
||||
description = "Faux positifs documentes - placeholders de configuration, jamais des secrets reels"
|
||||
|
||||
# Fichiers de template / doc : ne contiennent que des placeholders RFC 2606 / change_me.
|
||||
paths = [
|
||||
'''\.env\.example$''',
|
||||
'''\.gitleaks\.toml$''',
|
||||
'''docs/.*\.md$''',
|
||||
]
|
||||
|
||||
# Valeurs placeholder explicites tolerees ou qu'elles apparaissent.
|
||||
regexes = [
|
||||
'''change_me_strong_password''',
|
||||
'''change_me_root_password''',
|
||||
'''example\.com''',
|
||||
]
|
||||
|
||||
# Note : le vrai .env est gitignore et ne doit jamais etre commite. Ce scan est
|
||||
# une defense en profondeur, pas un substitut a l'hygiene .gitignore.
|
||||
15
Makefile
15
Makefile
|
|
@ -211,6 +211,21 @@ clean: ## Stop + suppression containers + volumes (DESTRUCTIF, demande confirmat
|
|||
clean-force: ## Version non interactive de clean (pour CI uniquement)
|
||||
@$(COMPOSE) down -v
|
||||
|
||||
# === Documentation ===
|
||||
|
||||
.PHONY: docs-render
|
||||
docs-render: ## Regenere les diagrammes Mermaid (docs/**/_diagrams/*.mmd -> *.svg)
|
||||
@echo "[docs-render] Recherche des sources Mermaid sous docs/..."
|
||||
@count=0; \
|
||||
for src in $$(find docs -name '*.mmd' -path '*/_diagrams/*'); do \
|
||||
out="$${src%.mmd}.svg"; \
|
||||
echo " $$src -> $$out"; \
|
||||
npx -y -p @mermaid-js/mermaid-cli mmdc -i "$$src" -o "$$out" >/dev/null 2>&1 \
|
||||
|| { echo "[docs-render] ECHEC sur $$src"; exit 1; }; \
|
||||
count=$$((count + 1)); \
|
||||
done; \
|
||||
echo "[docs-render] $$count diagramme(s) genere(s)."
|
||||
|
||||
# === Hooks Git ===
|
||||
|
||||
.PHONY: install-hooks
|
||||
|
|
|
|||
|
|
@ -1,88 +1,24 @@
|
|||
#
|
||||
# Wakdo - orchestration des 4 services de la stack (Bloc 5 DevOps, Cr 7.c.3 / 7.c.4).
|
||||
#
|
||||
# Services :
|
||||
# wakdo-web : Apache httpd, reverse proxy FastCGI -> wakdo-app, expose 80 via Traefik
|
||||
# wakdo-app : PHP-FPM 8.3, execute le code PHP back-office + API
|
||||
# wakdo-db : MariaDB 11.4, persistance des donnees metier
|
||||
# wakdo-cron : Alpine + dcron, backups nocturnes et taches planifiees
|
||||
#
|
||||
# Reseaux :
|
||||
# default (nom = wakdo_internal) : bridge interne pour l'inter-service,
|
||||
# non expose a l'hote. app/db/cron ne sont PAS joignables publiquement.
|
||||
# <REVERSE_PROXY_NETWORK> : reseau externe (ex. traefik_proxy) partage
|
||||
# avec le Traefik de l'hote. Seul wakdo-web y est attache.
|
||||
#
|
||||
# Volumes :
|
||||
# wakdo_db_data : named volume pour /var/lib/mysql (persistance BDD)
|
||||
# wakdo_uploads : named volume pour les uploads produits back-office
|
||||
# ./var/backups : bind-mount lecture-ecriture pour les dumps SQL
|
||||
#
|
||||
# Variables d'env consommees depuis .env (chargees par make via `include .env`
|
||||
# et transmises ici par docker compose qui fait l'expansion automatique).
|
||||
#
|
||||
# Persistance : un `make down` preserve les named volumes. Seul `make clean`
|
||||
# (interactif) ou `docker compose down -v` supprime les donnees.
|
||||
#
|
||||
|
||||
name: wakdo
|
||||
|
||||
networks:
|
||||
# Reseau interne : isolement des services applicatifs.
|
||||
# wakdo-app, wakdo-db et wakdo-cron n'y sont accessibles que via les autres
|
||||
# conteneurs de la stack. Aucun port hote expose.
|
||||
wakdo_internal:
|
||||
driver: bridge
|
||||
internal: false
|
||||
# internal: false (par defaut) car wakdo-app et wakdo-cron ont besoin
|
||||
# de sortir sur internet (pour telecharger des packages au build et pour
|
||||
# de potentiels appels API externes futurs). L'isolation vient du fait
|
||||
# qu'aucun port hote n'est binde ici.
|
||||
#
|
||||
# Subnet explicite (RFC 1918) : l'auto-allocateur Docker du daemon hote
|
||||
# est sature (15 /16 + 15 /20 deja alloues par d'autres stacks), il ne
|
||||
# peut plus creer de reseau bridge sans subnet explicite. 192.168.148.0/24
|
||||
# est dans le gap libre 192.168.144-159 (256 IP, largement suffisant pour
|
||||
# 4 services), aucune collision avec les /24 acquagest voisins (150/154/
|
||||
# 155/157). Choix defendable : right-sizing + isolation des fluctuations
|
||||
# d'allocation auto sur cet hote mutualise.
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 192.168.148.0/24
|
||||
|
||||
# Reseau du reverse proxy (Traefik) pre-existant sur l'hote.
|
||||
# Son nom est configurable via REVERSE_PROXY_NETWORK dans .env pour
|
||||
# supporter differents setups (traefik_proxy, traefik_public, proxy, ...).
|
||||
reverse_proxy:
|
||||
name: ${REVERSE_PROXY_NETWORK}
|
||||
external: true
|
||||
|
||||
volumes:
|
||||
wakdo_db_data:
|
||||
# Named volume MariaDB. Permissions gerees par Docker (UID mysql=999
|
||||
# dans le conteneur), zero souci cote hote. Survit a `docker compose down`.
|
||||
# Pour remise a zero : `make clean` (interactif, confirme) ou
|
||||
# `docker compose down -v` (destructif direct).
|
||||
|
||||
wakdo_uploads:
|
||||
# Images produits uploadees par les equipiers depuis le back-office.
|
||||
# Named volume pour les memes raisons que wakdo_db_data : permissions
|
||||
# propres (www-data UID 82 en Alpine) et pas de pollution du repo git
|
||||
# par des binaires.
|
||||
|
||||
services:
|
||||
|
||||
# =======================================================================
|
||||
# wakdo-db : MariaDB 11.4 LTS
|
||||
# =======================================================================
|
||||
wakdo-db:
|
||||
image: mariadb:11.4
|
||||
container_name: wakdo-db
|
||||
restart: unless-stopped
|
||||
|
||||
# Variables d'env d'initialisation (ne s'appliquent qu'au premier demarrage
|
||||
# sur volume vide - voir docs/notes/docker-volumes-vs-bind-mounts.md).
|
||||
environment:
|
||||
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
|
||||
MARIADB_DATABASE: ${DB_NAME}
|
||||
|
|
@ -90,18 +26,10 @@ services:
|
|||
MARIADB_PASSWORD: ${DB_PASSWORD}
|
||||
MARIADB_AUTO_UPGRADE: "1"
|
||||
TZ: ${APP_TIMEZONE:-Europe/Paris}
|
||||
|
||||
volumes:
|
||||
- wakdo_db_data:/var/lib/mysql
|
||||
|
||||
networks:
|
||||
- wakdo_internal
|
||||
|
||||
# Pas de ports exposes a l'hote : seuls wakdo-app et wakdo-cron peuvent
|
||||
# joindre wakdo-db:3306 via le reseau interne.
|
||||
|
||||
# Healthcheck officiel fourni par l'image mariadb : le script bundled
|
||||
# healthcheck.sh teste la connexion et l'init innodb.
|
||||
healthcheck:
|
||||
test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"]
|
||||
interval: 10s
|
||||
|
|
@ -109,16 +37,12 @@ services:
|
|||
retries: 6
|
||||
start_period: 30s
|
||||
|
||||
# =======================================================================
|
||||
# wakdo-app : PHP-FPM 8.3 (execute le code back-office + API)
|
||||
# =======================================================================
|
||||
wakdo-app:
|
||||
build:
|
||||
context: ./docker/php-fpm
|
||||
dockerfile: Dockerfile
|
||||
container_name: wakdo-app
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
APP_ENV: ${APP_ENV}
|
||||
APP_DEBUG: ${APP_DEBUG}
|
||||
|
|
@ -137,85 +61,44 @@ services:
|
|||
PASSWORD_ALGO: ${PASSWORD_ALGO}
|
||||
UPLOAD_MAX_SIZE_MB: ${UPLOAD_MAX_SIZE_MB}
|
||||
UPLOAD_ALLOWED_MIME: ${UPLOAD_ALLOWED_MIME}
|
||||
|
||||
volumes:
|
||||
# Bind-mount du code source pour le hot-reload en dev.
|
||||
# En prod, cette ligne est remplacee par un COPY dans l'image
|
||||
# via docker-compose.prod.yml (override a venir en P7).
|
||||
- ./src:/var/www/html
|
||||
|
||||
# Named volume pour les uploads, plus specifique que le bind-mount
|
||||
# parent : les uploads ne vont pas dans ./src, ils restent dans le
|
||||
# volume Docker et survivent aux `make down`.
|
||||
- wakdo_uploads:/var/www/html/public/uploads
|
||||
|
||||
networks:
|
||||
- wakdo_internal
|
||||
|
||||
depends_on:
|
||||
wakdo-db:
|
||||
condition: service_healthy
|
||||
|
||||
# Healthcheck defini dans le Dockerfile (php -r exit 0).
|
||||
|
||||
# =======================================================================
|
||||
# wakdo-web : Apache httpd (reverse FastCGI vers wakdo-app, expose via Traefik)
|
||||
# =======================================================================
|
||||
wakdo-web:
|
||||
build:
|
||||
context: ./docker/apache
|
||||
dockerfile: Dockerfile
|
||||
container_name: wakdo-web
|
||||
restart: unless-stopped
|
||||
|
||||
environment:
|
||||
# Noms de domaine injectes dans les vhosts (ServerName ${TRAEFIK_DOMAIN_*}).
|
||||
TRAEFIK_DOMAIN_KIOSK: ${TRAEFIK_DOMAIN_KIOSK}
|
||||
TRAEFIK_DOMAIN_ADMIN: ${TRAEFIK_DOMAIN_ADMIN}
|
||||
|
||||
volumes:
|
||||
# Meme bind-mount que wakdo-app : Apache sert les fichiers statiques
|
||||
# (HTML, CSS, JS, images) depuis ce dossier. PHP ne passe pas par
|
||||
# ce chemin ici, il passe par le proxy FastCGI vers wakdo-app.
|
||||
- ./src:/var/www/html
|
||||
- wakdo_uploads:/var/www/html/public/uploads
|
||||
|
||||
networks:
|
||||
- wakdo_internal
|
||||
- reverse_proxy
|
||||
|
||||
depends_on:
|
||||
wakdo-app:
|
||||
condition: service_started
|
||||
wakdo-db:
|
||||
condition: service_healthy
|
||||
|
||||
# === Labels Traefik : deux routers (kiosk + admin) sur le meme conteneur ===
|
||||
# Le Traefik de l'hote decouvre ces labels automatiquement (provider docker).
|
||||
# On ne configure PAS le certresolver ici : le Traefik hote le gere via
|
||||
# sa propre config (acme.json, resolver par defaut).
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.docker.network=${REVERSE_PROXY_NETWORK}"
|
||||
|
||||
# --- Router kiosk (borne client) ---
|
||||
- "traefik.http.routers.wakdo-kiosk.rule=Host(`${TRAEFIK_DOMAIN_KIOSK}`)"
|
||||
- "traefik.http.routers.wakdo-kiosk.entrypoints=websecure"
|
||||
- "traefik.http.routers.wakdo-kiosk.tls=true"
|
||||
- "traefik.http.routers.wakdo-kiosk.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.routers.wakdo-kiosk.service=wakdo-kiosk-svc"
|
||||
- "traefik.http.services.wakdo-kiosk-svc.loadbalancer.server.port=80"
|
||||
|
||||
# --- Router admin (back-office + API) ---
|
||||
- "traefik.http.routers.wakdo-admin.rule=Host(`${TRAEFIK_DOMAIN_ADMIN}`)"
|
||||
- "traefik.http.routers.wakdo-admin.entrypoints=websecure"
|
||||
- "traefik.http.routers.wakdo-admin.tls=true"
|
||||
- "traefik.http.routers.wakdo-admin.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.routers.wakdo-admin.service=wakdo-admin-svc"
|
||||
- "traefik.http.services.wakdo-admin-svc.loadbalancer.server.port=80"
|
||||
|
||||
# --- Middleware : redirection HTTP -> HTTPS ---
|
||||
# Applique aux 2 hosts via un router "catch-all" sur entrypoints=web.
|
||||
- "traefik.http.routers.wakdo-kiosk-http.rule=Host(`${TRAEFIK_DOMAIN_KIOSK}`)"
|
||||
- "traefik.http.routers.wakdo-kiosk-http.entrypoints=web"
|
||||
- "traefik.http.routers.wakdo-kiosk-http.middlewares=wakdo-to-https"
|
||||
|
|
@ -225,40 +108,24 @@ services:
|
|||
- "traefik.http.middlewares.wakdo-to-https.redirectscheme.scheme=https"
|
||||
- "traefik.http.middlewares.wakdo-to-https.redirectscheme.permanent=true"
|
||||
|
||||
# =======================================================================
|
||||
# wakdo-cron : taches planifiees (backup, purge, agregations)
|
||||
# =======================================================================
|
||||
wakdo-cron:
|
||||
build:
|
||||
context: ./docker/cron
|
||||
dockerfile: Dockerfile
|
||||
container_name: wakdo-cron
|
||||
restart: unless-stopped
|
||||
# init: true -> Docker injecte tini comme PID 1. dcron exige un init
|
||||
# parent pour pouvoir setpgid() sur ses jobs (sinon "Operation not
|
||||
# permitted" en boucle car un PID 1 sans init ne peut pas changer les
|
||||
# groupes de processus). Cf. busybox-utils issue tracker.
|
||||
init: true
|
||||
|
||||
environment:
|
||||
# Credentials BDD pour mysqldump (lecture seule via USER applicatif,
|
||||
# PAS le root password). Le user applicatif doit avoir SELECT +
|
||||
# LOCK TABLES + SHOW VIEW sur la BDD (migrations P2).
|
||||
DB_HOST: ${DB_HOST}
|
||||
DB_PORT: ${DB_PORT}
|
||||
DB_NAME: ${DB_NAME}
|
||||
DB_USER: ${DB_USER}
|
||||
DB_PASSWORD: ${DB_PASSWORD}
|
||||
TZ: ${CRON_TIMEZONE:-Europe/Paris}
|
||||
|
||||
volumes:
|
||||
# Bind-mount vers l'hote pour les dumps : inspectables par ls, scp-able
|
||||
# hors docker. Le dossier ./var/backups est gitignore.
|
||||
- ./var/backups:/backups
|
||||
|
||||
networks:
|
||||
- wakdo_internal
|
||||
|
||||
depends_on:
|
||||
wakdo-db:
|
||||
condition: service_healthy
|
||||
|
|
|
|||
882
docs/SESSION_RESUME.md
Executable file
882
docs/SESSION_RESUME.md
Executable file
|
|
@ -0,0 +1,882 @@
|
|||
# Session Resume — Wakdo
|
||||
|
||||
**Document de reprise entre sessions de travail.**
|
||||
A consulter en premier quand tu reprends le projet.
|
||||
|
||||
---
|
||||
|
||||
## Derniere session : 2026-06-15 (lot B docs + sync forges + nettoyage branches)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Suite du pivot security-by-design sur `feat/p1-conception`. Trois temps :
|
||||
|
||||
1. **Lot B execute** : `PROJECT_CONTEXT` aligne sur Forgejo Actions (drift GitHub corrige
|
||||
partout : SS6/8/9/10/12), couche securite integree (CI PHPStan/secret-scan, `.env.example`
|
||||
+ `php.ini` durci, decision #16 SbD), planning rechiffre (P0 22, P1 38, P7 22 ; total 272h).
|
||||
2 commits : `d305a09` (context) + `fae5c23` (UML : security-sequence + drift-fix x3).
|
||||
2. **Sync des deux forges** : GitHub `main` etait 35 commits en retard (`00a3f82`, fige v0.1.0)
|
||||
-> fast-forward propre vers `5104040`. GitHub et Forgejo desormais identiques sur les 3 refs.
|
||||
3. **Nettoyage branches** : 6 branches finalisees supprimees partout (local + GitHub + Forgejo) :
|
||||
`infra-docker`, `p1-assets-import`, `p1-stubs-and-dictionary`, `p5-front-landing`,
|
||||
`p3-admin-shell`, `demo/p5-front-and-p3-admin`. Contenu verifie present dans `dev`/`main`.
|
||||
|
||||
### Etat Git (post-session)
|
||||
|
||||
```
|
||||
Branche active : feat/p1-conception (fae5c23) - 7 commits SbD pushes (5 Merise + 2 lot B)
|
||||
Refs alignees GitHub == Forgejo :
|
||||
main 5104040 (release dev->main : P1 v0.2 + front P5 + admin shell)
|
||||
dev 971ce0c (PR template Forgejo)
|
||||
feat/p1-conception fae5c23 (travail SbD en cours, NON merge)
|
||||
Branches locales restantes : dev, main, feat/p1-conception
|
||||
Working tree : hors-scope BYAN (.claude, Makefile, docker-compose, package*) + journal Forgejo
|
||||
2026-06-04 untracked + SESSION_RESUME (local) + journal/README modifie.
|
||||
```
|
||||
|
||||
### Decisions actees cette session
|
||||
|
||||
- **PR en solo dev** : strategie retenue = **PR + auto-merge sur CI verte**. On garde la
|
||||
protection de branche (PR obligatoire, trace pour Cr 4.f) ; Forgejo merge automatiquement
|
||||
quand PHPUnit/PHPStan/secret-scan passent. A implementer en lot D.
|
||||
- **Forgejo = depot canonique** : les 6 PR d'integration historiques vivent sur GitHub (toutes
|
||||
mergees, la migration les a suivies) ; Forgejo n'a que la PR release dev->main. Les nouvelles
|
||||
PR partent de Forgejo. Dual-push conserve (origin pousse GitHub + Forgejo).
|
||||
- **CI/CD = Forgejo Actions** (act_runner auto-heberge), plus GitHub Actions. Drift doc corrige.
|
||||
|
||||
### Etat des lots du pivot SbD
|
||||
|
||||
- **A** (threat model + classification) : FAIT, commite dans `PROJECT_CONTEXT SS19` + `security-sequence.md`.
|
||||
- **B** (docs PROJECT_CONTEXT SS7/SS11 + UML) : FAIT cette session (2 commits, pushes).
|
||||
- **C** (infra/config secu) : A FAIRE - prochaine etape. `.env.example` (argon2id/lockout/seuils
|
||||
throttle/retention RGPD), `php.ini` durci (expose_php off, cookies httponly/secure/samesite,
|
||||
upload limite), **enregistrer act_runner Forgejo sur stark** (prerequis lot D), secret-scan.
|
||||
- **D** (SDLC) : `SECURITY.md`, PR template checklist, **workflows `.forgejo/workflows/`**
|
||||
(PHPUnit + PHPStan + secret-scan gitleaks) + auto-merge sur CI verte.
|
||||
- **E** : regenerer drawio MCD/MLD pour 21 entites.
|
||||
- **F** : clore -> PR `feat/p1-conception -> dev` (base = `dev` !).
|
||||
- **G** : roter le token Forgejo expose ; decider push-mirror Forgejo->GitHub.
|
||||
|
||||
### Reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git branch --show-current # feat/p1-conception
|
||||
git log --oneline -7 # 5 Merise SbD + 2 lot B
|
||||
git fetch origin # realigne origin/dev (affichage 'ahead 1' cosmetique)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Session 2026-06-12 (relecture security-by-design + modele stock en % + lot A threat model)
|
||||
|
||||
> Note : ce doc avait derive (fige a Session 7, 2026-05-21). Entre-temps : v0.2 prod-like
|
||||
> 19 entites + migration Forgejo (2026-06-04, voir `docs/journal/2026-06-04--*.md`) puis
|
||||
> demarrage du pivot security-by-design (2026-06-11). Le bloc ci-dessous repart de l'etat reel.
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Consolidation du pivot security-by-design sur `feat/p1-conception`. Trois temps :
|
||||
|
||||
1. **Relecture des 3 decisions securite** (RGPD, oversell, brute-force) : les 3 directions
|
||||
validees. Le challenge a fait emerger une simplification (oversell) et un upgrade (stock %).
|
||||
2. **Change-set applique aux 5 docs Merise** via 1 workflow (5 editeurs paralleles + 4 critiques
|
||||
adversariaux), puis correctifs manuels des residus rates par les critiques.
|
||||
3. **Lot A ecrit** via 1 workflow (2 auteurs + 2 critiques) : threat model + classification dans
|
||||
`PROJECT_CONTEXT §19`, et `docs/uml/security-sequence.md`.
|
||||
|
||||
### Decisions actees cette session
|
||||
|
||||
- **Stock en vrais %** : `ingredient` porte `stock_capacity` (INT, CHECK > 0 = reference 100% +
|
||||
garde anti div/0), `low_stock_pct` (def 10), `critical_stock_pct` (def 5) ; `stock_quantity`
|
||||
signe (peut etre negatif). `stock_pct = ROUND(stock_quantity/stock_capacity*100)` calcule.
|
||||
3 bandes : normal / alerte (le manager retire via `is_available` OU re-stocke) / auto-OOS
|
||||
sous le critique.
|
||||
- **Disponibilite produit CALCULEE** (RG-T21) : commandable ssi `is_available=1 AND chaque
|
||||
ingredient non-retirable > critical`. Pas de cascade ni flag ; retrait manuel = override dur.
|
||||
- **`login_throttle` = table** (entite 21) : throttle brute-force per-IP, en plus du compteur
|
||||
per-compte sur `user`.
|
||||
- **Drop `SELECT ... FOR UPDATE`** : decrement stock = `UPDATE ... stock = stock - :units`
|
||||
atomique (plus de read-gate, plus de risque deadlock). `idempotency_key` conserve.
|
||||
- **Drift MCD §5.1 corrige** : `product_ingredient.quantity` -> `quantity_normal`/`quantity_maxi`.
|
||||
|
||||
### Etat Git (post-session)
|
||||
|
||||
```
|
||||
Branche : feat/p1-conception
|
||||
5 commits POSES cette session (non pushes - le push partira avec la PR) :
|
||||
fadf0bd DICT - SbD data layer, 21 entities
|
||||
a1692b6 MCD - SbD entities + % stock model, drift fix
|
||||
14348ba MLD - audit_log + login_throttle tables, % stock columns
|
||||
0f57a44 MCT - SbD operations, PIN gating, computed availability
|
||||
5c34f6b MLT - RG-T13-T21, atomic decrement, throttle, RGPD
|
||||
|
||||
Working tree UNCOMMITTED (tenu volontairement) :
|
||||
docs/PROJECT_CONTEXT.md (§19 threat model + classification ECRIT ; tenu car lot B
|
||||
va aussi toucher §7/§11)
|
||||
docs/uml/security-sequence.md (NOUVEAU, lot A, fini, verifie)
|
||||
docs/uml/{sequence-passer-commande,state-commande,use-cases}.md (drift-fix v0.2, pret,
|
||||
a grouper avec security-sequence.md)
|
||||
+ journal 2026-06-04 untracked ; hors-scope BYAN (.claude, Makefile, docker-compose, package*)
|
||||
```
|
||||
|
||||
### A faire a la reprise (ordre)
|
||||
|
||||
- **B** : `PROJECT_CONTEXT §7/§11` (retirer « MVP », 21 entites, rechiffrer planning) ->
|
||||
puis commit PROJECT_CONTEXT (§19 + §7/§11) + les 4 docs UML.
|
||||
- **C** : infra/config secu (`.env.example` argon2/lockout/retention/seuils, `php.ini` durci,
|
||||
secret-scan, ruling branch-protection).
|
||||
- **D** : SDLC (`SECURITY.md`, checklist PR template, jobs CI Forgejo PHPStan/secret-scan).
|
||||
- **E** : regenerer les drawio MCD/MLD pour 21 entites (les `.md` sont en Mermaid inline).
|
||||
- **F** : clore -> PR `feat/p1-conception -> dev` (base = `dev` !), rafraichir ce doc.
|
||||
- **G** : roter le token Forgejo expose ; decider push-mirror Forgejo->GitHub.
|
||||
|
||||
### Reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git branch --show-current # feat/p1-conception
|
||||
git log --oneline -6 # voir les 5 commits SbD
|
||||
git status --short # PROJECT_CONTEXT + UML uncommitted
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Session precedente : 2026-05-21 (Session 7 - P1 conception : 5 docs Merise/UML + machine a etats commande unifiee)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Session centree sur la reprise de P1 conception. Trois resultats :
|
||||
|
||||
1. **Rapatriement P1 sur `feat/p1-conception`** : les fichiers P1 (mcd.md + diagrammes) flottaient dans le working tree de la branche demo `demo/p5-front-and-p3-admin`. Portes proprement sur `feat/p1-conception` (stash des fichiers BYAN hors-scope, switch, pop). Les 4 `.drawio` y etaient deja commites (`64f5a27`), identiques au working tree.
|
||||
2. **5 docs P1 produits** via 2 agents (expert-merise-agile + architect), puis normalises : MCT, MLT, use-cases, state-commande, sequence-passer-commande.
|
||||
3. **Machine a etats de commande unifiee** : resolution d'une contradiction qui preexistait entre `dictionary.md`, `PROJECT_CONTEXT.md` et le brief initial. Vocabulaire desormais coherent sur toute la doc.
|
||||
|
||||
### Etat Git actuel (post-Session 7)
|
||||
|
||||
```
|
||||
Repo : /home/acadenice/corentin_wakdo/
|
||||
Branche courante : feat/p1-conception (rien commite cette session)
|
||||
|
||||
Working tree P1 (untracked, a commiter apres validation drawio) :
|
||||
docs/merise/mcd.md (MCD, refs encore vers SVG Mermaid - cf. pivot drawio non termine)
|
||||
docs/merise/mct.md (NEW - 24 operations metier)
|
||||
docs/merise/mlt.md (NEW - preconditions/regles/postconditions)
|
||||
docs/uml/use-cases.md (NEW)
|
||||
docs/uml/state-commande.md (NEW)
|
||||
docs/uml/sequence-passer-commande.md (NEW)
|
||||
docs/merise/_diagrams/*.mmd + *.svg (Mermaid leftover, a supprimer si on finit le pivot drawio)
|
||||
|
||||
Working tree modifie (tracked) :
|
||||
docs/PROJECT_CONTEXT.md (ligne statut realignee sur machine canonique)
|
||||
|
||||
.drawio : commites sur feat/p1-conception (clean), en attente validation visuelle user sur le site drawio.
|
||||
|
||||
Hors-scope BYAN (persistants, jamais commites) :
|
||||
.claude/CLAUDE.md, .claude/rules/byan-agents.md, Makefile, package.json, package-lock.json
|
||||
```
|
||||
|
||||
### Decision majeure : machine a etats de commande (CANONIQUE)
|
||||
|
||||
Trois vocabulaires se contredisaient (ENUM dictionnaire avec paiement / PROJECT_CONTEXT sans paiement / noms FR introduits par erreur dans le brief Merise). Tranche par le user :
|
||||
|
||||
- **Deux phases** : le client compose (`pending_payment`) PUIS paie (`paid`), apres quoi la commande passe en preparation. Le paiement EXISTE dans le cycle.
|
||||
- **Termes en anglais** (code-facing), valeurs ENUM du dictionnaire.
|
||||
- **Machine retenue** : `pending_payment -> paid -> preparing -> ready -> delivered`
|
||||
- **`cancelled` atteignable depuis tout etat non remis** (`pending_payment`, `paid`, `preparing`, `ready`) : annulable a tout moment tant que non livree (modification / annulation / remboursement client). `delivered` et `cancelled` finaux.
|
||||
|
||||
Applique partout : dictionary.md (deja correct), PROJECT_CONTEXT.md (corrige ligne 61), mct.md, mlt.md, state-commande.md, use-cases.md, sequence-passer-commande.md.
|
||||
|
||||
### Autres decisions actees Session 7
|
||||
|
||||
| Decision | Contexte |
|
||||
|---|---|
|
||||
| Outil diagramme MCD = drawio | User valide les 4 .drawio lui-meme sur le site (pas encore valides). Pivot Mermaid->drawio a finir cote pipeline + refs mcd.md |
|
||||
| Pas de parcours employe dedie | Les employes sont couverts par le diagramme de cas d'utilisation (use-cases) + diagramme d'etats. Ockham, evite le doublon |
|
||||
| Production parallele en respectant les dependances | On fait ce qui ne depend PAS du MCD (dependance nulle ou faible). On NE fait PAS ce qui en depend moyennement ou fortement (MLD, class-diagram) tant que les .drawio ne sont pas valides |
|
||||
| MOT saute (rappel) | Coherent Session 4 (raccourci agile MCT -> MLT direct) |
|
||||
|
||||
### Decisions secondaires EN SUSPENS (remontees par l'agent Merise, a trancher avant MLD)
|
||||
|
||||
1. **`source` (canal : kiosk/comptoir/drive) vs `mode_consommation` (fiscal : sur_place/a_emporter/drive)** : deux dimensions distinctes. `source` est absent du dictionnaire et du MCD. A ajouter avant de generer le DDL.
|
||||
2. **`user_id` sur `commande`** : aucune tracabilite de l'equipier qui saisit / prend en charge / livre. A amender dans le MCD si stats par equipier souhaitees.
|
||||
|
||||
(Points mineurs documentes dans mct.md section 14 et mlt.md section 13 : `service_day` non materialise, etc.)
|
||||
|
||||
### A faire lors de la reprise (ordre recommande)
|
||||
|
||||
1. **User valide les 4 `.drawio`** sur le site drawio (preview Markdown ne rend pas Mermaid sans extension ; les .drawio/.svg s'affichent en revanche).
|
||||
2. **Trancher les 2 decisions secondaires** (`source` vs `mode_consommation`, `user_id` sur commande) - elles debloquent le MLD + class-diagram.
|
||||
3. **Finir le pivot drawio** (si confirme) : cible Makefile `docs-render-drawio` (image `jgraph/drawio` dispo localement), regenerer les SVG depuis les .drawio, reecrire les refs dans mcd.md (actuellement vers SVG Mermaid), supprimer les `.mmd`/`.svg` Mermaid.
|
||||
4. **Produire MLD + class-diagram** une fois le MCD valide et les decisions secondaires tranchees.
|
||||
5. **Commiter le lot P1 conception** (option : 1 commit par doc) sur `feat/p1-conception`, puis PR vers `dev` (vigilance : base = `dev`, pas `main`).
|
||||
|
||||
### Commande exacte pour reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git status
|
||||
git branch --show-current # attendu : feat/p1-conception
|
||||
ls docs/merise/ # mcd.md, mct.md, mlt.md, dictionary.md
|
||||
ls docs/uml/ # use-cases.md, state-commande.md, sequence-passer-commande.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Session precedente : 2026-05-09 (Session 6 - drawio + P5 front complet en remote control)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Session ~3-4h en remote control mobile qui a couvert 2 gros chantiers et un long detour sur l'automation des PRs :
|
||||
|
||||
1. **Pivot Mermaid -> drawio sur le MCD** : 4 fichiers `.drawio` XML generes pour gain de controle layout (planarite du global non resoluble par mmdc)
|
||||
2. **Front P5 complet anticipe** : 2 runs d'agent UX (Sally) ont produit 7 pages HTML kiosk + 7 modules JS vanilla + JSON fallback statique. Flux complet welcome -> confirmation, live sur le vhost.
|
||||
3. **Setup automation PR via API** : detour sur fine-grained PATs (3 tentatives KO sur policy org AcadeNice "approval required"), resolu avec un classic PAT `ghp_` en attendant l'approbation admin lundi.
|
||||
|
||||
2 PR ouvertes sur GitHub :
|
||||
- **#4** ready : front P5 complet (7 commits)
|
||||
- **#5** draft : 4 .drawio sources, en attente cleanup et suite Merise/UML
|
||||
|
||||
### Etat Git actuel (post-Session 6)
|
||||
|
||||
```
|
||||
Repo : /home/acadenice/corentin_wakdo/
|
||||
Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git
|
||||
|
||||
Branches :
|
||||
main 00a3f82 (v0.1.0)
|
||||
dev 68db2ee
|
||||
feat/p1-conception 64f5a27 (PR #5 draft : 4 .drawio committed)
|
||||
feat/p5-front-landing 6a7e772 (PR #4 ready : 7 commits P5 complet) <- HEAD post-session
|
||||
feat/infra-docker b09c461 (mergee, conservee)
|
||||
feat/p1-assets-import 24e733b (mergee, conservee)
|
||||
feat/p1-stubs-and-dictionary d1a9876 (mergee, conservee)
|
||||
|
||||
Tags :
|
||||
v0.1.0 00a3f82 Infrastructure foundation
|
||||
|
||||
Working tree out-of-scope (BYAN, persistent depuis sessions precedentes) :
|
||||
.claude/CLAUDE.md, .claude/rules/byan-agents.md, Makefile
|
||||
package.json, package-lock.json
|
||||
docs/SESSION_RESUME.md (ce fichier)
|
||||
|
||||
Working tree P1 (uncommitted, voyage entre branches lors des switches) :
|
||||
docs/merise/mcd.md
|
||||
docs/merise/_diagrams/*.mmd (Mermaid leftover, a supprimer apres render drawio)
|
||||
docs/merise/_diagrams/*.svg (Mermaid render, idem)
|
||||
```
|
||||
|
||||
### PRs ouvertes
|
||||
|
||||
| # | Titre | Branche | Base | Statut |
|
||||
|---|---|---|---|---|
|
||||
| 4 | feat(front): P5 kiosk complete flow with vanilla JS and JSON fallback | `feat/p5-front-landing` | `dev` | Ready for review |
|
||||
| 5 | docs(merise): MCD diagrams in drawio XML (4 files) | `feat/p1-conception` | `dev` | Draft |
|
||||
|
||||
### Decisions actees Session 6
|
||||
|
||||
| Decision | Contexte |
|
||||
|---|---|
|
||||
| Switch Mermaid -> drawio pour MCD | Planarite du global non resoluble par mmdc auto-layout, controle manuel requis |
|
||||
| 4 .drawio separes (1 par diagramme) | Plus simple a editer et diff que multi-page |
|
||||
| Front P5 anticipe pendant P1 | Data contract gele par brief ecole (JSON sources), front consomme JSON = consomme future API au mapping pres |
|
||||
| Classic PAT (`ghp_`) au lieu de fine-grained AcadeNice | Org AcadeNice policy "approval required", admin pas dispo le weekend |
|
||||
| Branche front renommee `p1` -> `p5` | Front borne = livrable P5 per plan SDLC (independant de la phase de realisation) |
|
||||
| Auto-validation 7 checks par l'agent | Remote control mobile = pas de validation visuelle facile, agent doit s'auto-verifier |
|
||||
| Mode JSON fallback statique dans `borne/data/` | Apache bind-mount ne sert pas `_sources/`, copie statique = solution simple. Swap point unique dans `data.js` pour P4 |
|
||||
| TVA 10% (taux restauration FR 2024 simplifie) | TODO P3 : valider avec comptable les variations sur place vs a emporter, alcool, etc. |
|
||||
| `gh` dans Docker = mauvaise idee | Stack Docker = runtime app, pas dev tooling. `gh` ou curl appartient a l'host. |
|
||||
| Token GitHub stocke dans `.env` (gitignore) | Standard, pas de leak en commits, lu via `source .env` au moment du curl |
|
||||
|
||||
### Ce qui a ete fait chronologiquement
|
||||
|
||||
**Bloc 1 - Pivot Mermaid -> drawio + 4 sources XML**
|
||||
|
||||
1. Decision drawio uniquement, 4 fichiers separes, manual layout
|
||||
2. Generation des 4 fichiers `.drawio` XML avec entites + cardinalites Merise `(min,max)` a partir des sources Mermaid
|
||||
3. Commit `64f5a27` : `docs(merise): add drawio XML sources for MCD diagrams`
|
||||
|
||||
**Bloc 2 - 1er agent UX (welcome + categories scaffold)**
|
||||
|
||||
4. Spawn agent UX-designer (Sally) en background avec scope 2 ecrans (welcome + categories), flag `isolation: "worktree"`
|
||||
5. L'agent a base sa branche sur `feat/p1-conception` au lieu de `dev` (le worktree n'a pas vraiment isole comme attendu)
|
||||
6. Rebase `feat/p1-front-landing --onto dev 64f5a27` pour droper le commit drawio comme parent
|
||||
7. Renommage `feat/p1-front-landing` -> `feat/p5-front-landing` (front borne = livrable P5)
|
||||
|
||||
**Bloc 3 - Setup automation PR (long detour sur les PATs)**
|
||||
|
||||
8. Push des 2 branches (SSH agent socket `/tmp/ssh-Evc7jT0fk2rs/agent.2611024`)
|
||||
9. Tentative `gh` CLI dans Docker -> mauvaise idee, abandonne
|
||||
10. Tentative fine-grained PAT #1 : Resource owner = Imugiii -> 404 sur wakdo_corentin (org repo invisible pour PAT a owner perso)
|
||||
11. Fine-grained PAT #2 : meme probleme (Resource owner encore = Imugiii)
|
||||
12. Fine-grained PAT #3 avec Resource owner = AcadeNice -> token en "Pending review" (org policy "approval required")
|
||||
13. Fallback classic PAT (`ghp_`) -> fonctionne des generation, scope `repo`, admin sur le repo
|
||||
14. PR #4 (front ready) + PR #5 (drawio draft) creees via `POST /repos/AcadeNice/wakdo_corentin/pulls`
|
||||
|
||||
**Bloc 4 - 2e agent UX (P5 complet)**
|
||||
|
||||
15. Spawn agent UX en background sur `feat/p5-front-landing` avec scope etendu : 5 nouvelles pages + JS state + JSON fallback
|
||||
16. Auto-validation 7 checks dans le brief (assets exist, links resolve, JSON valid, HTML closed, JS syntax, http server e2e, JSON fetch)
|
||||
17. Livrable : 5 pages HTML, 7 modules JS, 2 JSON normalises copies dans `borne/data/`, CSS etendu de 438 -> 1257 lignes
|
||||
18. 6 commits thematiques (`6f5daca` -> `6a7e772`), 7/7 auto-checks PASS
|
||||
19. Push, mise a jour PR #4 (titre + body) via `PATCH /repos/.../pulls/4`
|
||||
20. Test live kiosk : les endpoints repondent 200 (welcome, categories, products, product, cart, payment, confirmation, JSON, CSS, JS, images)
|
||||
|
||||
### Commande exacte pour reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git status
|
||||
git branch --show-current
|
||||
# Si HEAD = feat/p5-front-landing : tu peux tester le front sur https://corentin-wakdo.stark.a3n.fr/
|
||||
# Pour reprendre P1 :
|
||||
git checkout feat/p1-conception
|
||||
```
|
||||
|
||||
### A faire lors de la reprise (ordre recommande)
|
||||
|
||||
1. **Review visuelle PR #4** : tester le flux kiosk complet sur https://corentin-wakdo.stark.a3n.fr/, valider, merger dans `dev` (via web ou via API)
|
||||
2. **Drawio render automatique** : ajouter cible Makefile `make docs-render-drawio` qui utilise le container `rlespinasse/drawio-export` pour generer les SVG depuis les `.drawio` XML. Evite l'export manuel sur drawio web (galere sur mobile).
|
||||
3. **Continuer P1 conception** sur `feat/p1-conception` :
|
||||
- `docs/merise/mct.md`
|
||||
- `docs/merise/mlt.md`
|
||||
- `docs/merise/mld.md`
|
||||
- `docs/uml/class-diagram.md`
|
||||
- `docs/uml/use-cases.md`
|
||||
- `docs/uml/state-commande.md`
|
||||
- `docs/uml/sequence-passer-commande.md`
|
||||
4. **Commit final mcd.md** : une fois les SVG drawio generes, commit `mcd.md` + suppression des `.mmd`/anciens `.svg` Mermaid + Makefile mis a jour (drop `docs-render` mmdc, garder uniquement `docs-render-drawio`)
|
||||
5. **Passage PR #5 draft -> ready** (via PATCH API) quand tout le P1 conception est dedans
|
||||
6. **Hygiene secu PATs** : revoquer dans GitHub Settings :
|
||||
- 3 fine-grained `github_pat_...` (suffixes BE4y, UiZc, ljeC)
|
||||
- classic `ghp_Rr5EkM4...` (a rotater quand fine-grained AcadeNice approuve par admin lundi)
|
||||
|
||||
### Note technique - isolation worktree
|
||||
|
||||
Le flag `isolation: "worktree"` sur l'Agent tool n'a pas cree de vrai worktree isole - les agents ont travaille directement sur le main repo (`git worktree list` ne montre qu'une entree). Pas grave en pratique mais a savoir pour les prochains spawns : instruire explicitement l'agent de ne pas switch de branche dans le main repo, ou de bosser en branche dediee pre-checked-out.
|
||||
|
||||
---
|
||||
|
||||
## Session precedente : 2026-04-30 soir (Session 5 - notes perso + demarrage P1 conception + setup pipeline diagrammes)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Session moyenne (~3h) qui a couvert :
|
||||
|
||||
1. **Cloture P1 dictionnaire** : commit + push + PR #3 mergee dans `dev`
|
||||
2. **4 notes perso ecrites** (gitignore) : apache-fastcgi-pitfalls, docker-network-pools-rfc1918, enum-vs-table-reference, merise-yagni-quantite + index README mis a jour
|
||||
3. **Demarrage P1 conception** sur nouvelle branche `feat/p1-conception` (renommee depuis `feat/p1-merise-conception` pour inclure UML)
|
||||
4. **MCD redige** (`docs/merise/mcd.md`) avec 3 sous-domaines (Catalogue/Commande/RBAC) en Mermaid + tableau recap cardinalites Merise
|
||||
5. **Pipeline mmdc setup** : .mmd sources + SVG generes + `make docs-render` target
|
||||
6. **Blocage layout MCD global** : 10 entites + 10 associations = probleme planarite intrinseque, decision laissee en suspens
|
||||
|
||||
Aucun commit fait sur la branche `feat/p1-conception` — tout reste dans le working tree pour reprise propre.
|
||||
|
||||
### Etat Git actuel (post-Session 5)
|
||||
|
||||
```
|
||||
Repo : /home/acadenice/corentin_wakdo/
|
||||
Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git
|
||||
|
||||
Branches :
|
||||
main 00a3f82 (v0.1.0)
|
||||
dev 68db2ee (= main + PR#1 + PR#2 + PR#3 mergees)
|
||||
feat/infra-docker b09c461 (mergee, conservee)
|
||||
feat/p1-assets-import 24e733b (mergee, conservee)
|
||||
feat/p1-stubs-and-dictionary d1a9876 (mergee via PR#3, conservee)
|
||||
feat/p1-conception 68db2ee (NOUVELLE, ZERO COMMIT, working tree only)
|
||||
|
||||
Tags :
|
||||
v0.1.0 00a3f82 Infrastructure foundation
|
||||
|
||||
Working tree sur feat/p1-conception (a commit a la prochaine session) :
|
||||
docs/merise/mcd.md (NEW - 411 lignes)
|
||||
docs/merise/_diagrams/mcd-global.mmd (NEW)
|
||||
docs/merise/_diagrams/mcd-global.svg (NEW)
|
||||
docs/merise/_diagrams/mcd-catalogue.mmd (NEW)
|
||||
docs/merise/_diagrams/mcd-catalogue.svg (NEW)
|
||||
docs/merise/_diagrams/mcd-commande.mmd (NEW)
|
||||
docs/merise/_diagrams/mcd-commande.svg (NEW)
|
||||
docs/merise/_diagrams/mcd-rbac.mmd (NEW)
|
||||
docs/merise/_diagrams/mcd-rbac.svg (NEW)
|
||||
Makefile (modified - target docs-render ajoute)
|
||||
docs/notes/README.md (modified, gitignore - 7 entries ajoutees)
|
||||
docs/notes/apache-fastcgi-pitfalls.md (NEW, gitignore)
|
||||
docs/notes/docker-network-pools-rfc1918.md (NEW, gitignore)
|
||||
docs/notes/enum-vs-table-reference.md (NEW, gitignore)
|
||||
docs/notes/merise-yagni-quantite.md (NEW, gitignore)
|
||||
|
||||
Working tree out-of-scope (BYAN, deja modifies en sessions precedentes) :
|
||||
.claude/CLAUDE.md
|
||||
.claude/rules/byan-agents.md
|
||||
package.json, package-lock.json
|
||||
docs/SESSION_RESUME.md
|
||||
```
|
||||
|
||||
### Decisions actees Session 5
|
||||
|
||||
| Decision | Contexte |
|
||||
|---|---|
|
||||
| Branche renommee `feat/p1-conception` (au lieu de `feat/p1-merise-conception`) | Pour inclure UML dans le scope de la PR |
|
||||
| UML ajoute au scope P1 conception | RNCP 37805 attend Merise + UML, pas que Merise |
|
||||
| Granularite commits PR : option α (1 commit par doc) | Coherent avec l'historique, squashable en fin de PR si besoin |
|
||||
| Pipeline diagrammes : option B (mmdc local + SVG embed) | Rendu portable Cursor/GitHub/PDF/Notion, regenerable via `make docs-render` |
|
||||
| Ecriture des 4 notes perso AVANT le travail Merise | Sujets frais dans le contexte (Session 4 + dictionnaire) |
|
||||
| Auteur des notes = "BYAN" | Coherent avec section 17 PROJECT_CONTEXT (transparence methodologie) |
|
||||
| 4 hedgings appliques (`toujours`/`forcement` -> `tend a`/`implique`) | Hook PreToolUse fact-check intransigeant |
|
||||
|
||||
### Decision EN SUSPENS (a trancher en premier la prochaine session)
|
||||
|
||||
**Layout du diagramme global MCD** : avec 10 entites et 10 associations (dont
|
||||
2 polymorphiques sur `LIGNE_COMMANDE` -> PRODUIT et MENU), il y a un probleme
|
||||
de planarite : impossible de placer toutes les entites sans croiser au moins
|
||||
2 lignes. Mermaid auto-layout galere, Excalidraw manuel n'aide pas vraiment.
|
||||
|
||||
3 options en attente d'arbitrage :
|
||||
|
||||
- **A. Drop le global** — supprimer section 3 du MCD, garder section 6
|
||||
(tableau recap des cardinalites) + section 4 (3 sous-domaines Mermaid
|
||||
propres). Coherent avec l'approche Merise (decomposer si > 5 entites).
|
||||
Defendable au jury : "j'ai decompose, tableau recap = vue integree".
|
||||
- **B. Excalidraw manuel** — refaire le global a la main dans Excalidraw,
|
||||
export `.excalidraw.svg` (avec scene embedee), embed dans le MCD. Coute
|
||||
20-30 min de layout manuel, perd la regen automatique.
|
||||
- **C. Garder Mermaid en l'etat** — assumer que le layout est croise mais
|
||||
jouer le compromis "decomposition prime sur visuel global".
|
||||
|
||||
Le user a dit "le choix n'est pas encore fait" (Session 5 fin de soiree,
|
||||
fatigue sur le sujet). A reprendre tete reposee.
|
||||
|
||||
### Ce qui a ete fait chronologiquement
|
||||
|
||||
**Bloc 1 - Cloture dictionnaire (commit + PR)**
|
||||
|
||||
1. Verification etat initial : branche `feat/p1-stubs-and-dictionary` avec
|
||||
`b8f7d35` (stubs+fixes) commit, `docs/merise/dictionary.md` uncommitted
|
||||
2. Commit `d1a9876` : `docs(merise): data dictionary v0.1 - 10 entities + Mermaid ER diagram + 7 modeling notes`
|
||||
3. Push branche, PR #3 ouverte manuellement (gh CLI absent), mergee sur `dev`
|
||||
4. `git fetch + checkout dev + merge --ff-only origin/dev` : sync OK sur `68db2ee`
|
||||
|
||||
**Bloc 2 - 4 notes perso (gitignore)**
|
||||
|
||||
5. Bascule sur `Read` au lieu de `grep`/`sed` apres blocage du hook
|
||||
`tool-failure-guard` sur "internal error" string presente dans
|
||||
`vhost.conf` (pattern legitime du commentaire, faux positif Bash output)
|
||||
6. `apache-fastcgi-pitfalls.md` (405 lignes) - 3 pieges Session 4
|
||||
(DirectoryIndex, allowed_clients, R=200) + Q&A jury
|
||||
7. `docker-network-pools-rfc1918.md` (376 lignes) - saturation pools Docker
|
||||
sur stark, choix `192.168.148.0/24`, RFC 1918, Q&A jury
|
||||
8. `enum-vs-table-reference.md` (381 lignes) - matrice de decision ENUM vs
|
||||
table, application aux 4 ENUMs Wakdo, Q&A jury
|
||||
9. `merise-yagni-quantite.md` (337 lignes) - YAGNI applique a `menu_produit`,
|
||||
audit source ecole 13 menus mono-portion, Q&A jury
|
||||
10. `docs/notes/README.md` index mis a jour : 7 nouvelles entrees (3 Session
|
||||
4 deja redigees + 4 nouvelles)
|
||||
|
||||
**Bloc 3 - Setup branche conception + cadrage**
|
||||
|
||||
11. Branche `feat/p1-merise-conception` creee depuis `dev`, puis renommee en
|
||||
`feat/p1-conception` apres discussion sur l'ajout UML au scope
|
||||
12. Decision : 8 documents prevus pour la PR :
|
||||
- Merise : MCD, MCT, MLT, MLD (4 docs dans `docs/merise/`)
|
||||
- UML : classes, use cases, etats, sequence (4 docs dans `docs/uml/`)
|
||||
13. `docs/uml/` cree
|
||||
|
||||
**Bloc 4 - MCD redige + setup pipeline diagrammes**
|
||||
|
||||
14. Premier draft MCD avec 4 diagrammes ASCII art (global + 3 sous-domaines)
|
||||
+ tableau recap cardinalites Merise `(0,N)/(1,1)`
|
||||
15. User trouve l'ASCII moche -> bascule sur Mermaid `erDiagram` inline
|
||||
16. User ne voit pas le rendu Mermaid dans Cursor (pas d'extension installee)
|
||||
-> bascule sur SVG via mmdc
|
||||
17. Setup `docs/merise/_diagrams/` : 4 fichiers `.mmd` extraits + 4 SVG
|
||||
generes via `npx mmdc`
|
||||
18. MCD edite : 4 blocs Mermaid remplaces par `<img src="_diagrams/*.svg">`
|
||||
19. Makefile : target `docs-render` ajoute, scanne tous les
|
||||
`docs/**/_diagrams/*.mmd` du projet, regen SVG (testee, OK 4/4)
|
||||
20. User constate que le global a des lignes croisees, tente Excalidraw,
|
||||
n'arrive pas a un layout logique -> decision laissee en suspens
|
||||
|
||||
### Commande exacte pour reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git status # confirmer working tree intact
|
||||
git branch --show-current # doit etre feat/p1-conception
|
||||
git log --oneline dev..HEAD # doit etre vide (zero commit sur la branche)
|
||||
ls docs/merise/ # mcd.md + _diagrams/ presents
|
||||
ls docs/notes/ # 4 notes Session 5 + README maj
|
||||
```
|
||||
|
||||
### A faire lors de la reprise (ordre recommande)
|
||||
|
||||
1. **Trancher le layout MCD global** (option A / B / C ci-dessus). Si A,
|
||||
editer mcd.md pour supprimer section 3, decrementer les numeros, et
|
||||
supprimer `_diagrams/mcd-global.{mmd,svg}`. Si B, faire le travail
|
||||
Excalidraw manuel. Si C, ne rien faire et continuer.
|
||||
|
||||
2. **Commit le MCD** (option α : 1 commit par doc) :
|
||||
```bash
|
||||
git add docs/merise/mcd.md docs/merise/_diagrams/ Makefile
|
||||
git commit -m "docs(merise): MCD v0.1 + pipeline mmdc -> SVG via make docs-render"
|
||||
```
|
||||
|
||||
3. **Continuer P1 conception**, dans l'ordre :
|
||||
- `docs/merise/mct.md` - operations metier + acteurs + flux
|
||||
- `docs/merise/mlt.md` - workflow logique (preconditions / regles /
|
||||
postconditions)
|
||||
- `docs/merise/mld.md` - schema relationnel formel
|
||||
- `docs/uml/class-diagram.md` - vue OOP (prepare PHP P2)
|
||||
- `docs/uml/use-cases.md` - acteurs + goals (kiosk client, manager, ...)
|
||||
- `docs/uml/state-commande.md` - machine a etats `commande.statut`
|
||||
- `docs/uml/sequence-passer-commande.md` - flux passer commande
|
||||
|
||||
4. **Push + PR vers `dev`** quand les 7 docs restants sont commit.
|
||||
Vigilance : verifier `base = dev` (pas `main` !).
|
||||
|
||||
5. **Apres merge** : continuer P1 implementation (DDL + seed + fallback)
|
||||
sur une branche `feat/p1-implementation` separee.
|
||||
|
||||
---
|
||||
|
||||
## Session precedente : 2026-04-30 jour (Session 4 etendue - smoke test infra + import assets + P1 demarre)
|
||||
|
||||
### Vue d'ensemble
|
||||
|
||||
Session tres longue (~6h cumulees) qui a couvert 3 grandes phases en une seule journee :
|
||||
|
||||
1. **Smoke test infra Docker** sur le serveur stark : `make init` valide bout en bout, 4 services healthy, certs Let's Encrypt provisionnes
|
||||
2. **Import assets ecole** : 71 images normalisees + 2 JSON sources + maquette Figma PDF
|
||||
3. **Demarrage P1 Merise** : stubs unblock-403 + dictionnaire de donnees v0.1 (10 entites)
|
||||
|
||||
3 PR ont ete fusionnees (1 incident main->dev recupere) et 1 PR reste ouverte (la branche
|
||||
de la 3e phase n'est pas encore push).
|
||||
|
||||
### Etat Git actuel (post-Session 4)
|
||||
|
||||
```
|
||||
Repo : /home/acadenice/corentin_wakdo/
|
||||
Remote : git@github-wakdo:AcadeNice/wakdo_corentin.git
|
||||
|
||||
Branches :
|
||||
main 00a3f82 (v0.1.0 - infra foundation)
|
||||
dev 84d2559 (= main + PR#2 assets)
|
||||
feat/infra-docker b09c461 (mergee dans main via PR#1, conservee)
|
||||
feat/p1-assets-import 24e733b (mergee dans dev via PR#2, conservee)
|
||||
feat/p1-stubs-and-dictionary b8f7d35 (LOCAL UNIQUEMENT - NON PUSHEE)
|
||||
+ dictionnaire UNCOMMITTED dans le working tree
|
||||
|
||||
Tags :
|
||||
v0.1.0 00a3f82 Infrastructure foundation (annotated, pushe)
|
||||
|
||||
Working tree out-of-scope (volontairement non commit) :
|
||||
.claude/CLAUDE.md, .claude/rules/* (modifies hors-projet, BYAN)
|
||||
package.json, package-lock.json (BYAN)
|
||||
docs/SESSION_RESUME.md (ce fichier - local perso)
|
||||
```
|
||||
|
||||
### Vue chronologique des PR
|
||||
|
||||
```
|
||||
00a3f82 (main, dev, v0.1.0) Merge PR #1 from feat/infra-docker
|
||||
- INCIDENT : PR ouverte par defaut sur 'main' au lieu de 'dev'
|
||||
- REMEDIATION : git checkout dev && git merge --ff-only origin/main && git push origin dev
|
||||
- LECON : verifier le selecteur 'base branch' sur GitHub avant 'Create pull request'
|
||||
- 9 commits infra : compose, dockerfiles, smoke test fixes, FQDN switch, journal session 4
|
||||
|
||||
84d2559 (dev) Merge PR #2 from feat/p1-assets-import
|
||||
- PR sur la bonne base 'dev' cette fois
|
||||
- 1 commit : import des 2 JSON sources + 71 images normalisees + maquette PDF
|
||||
```
|
||||
|
||||
### Ce qui a ete fait (chronologique session)
|
||||
|
||||
**Phase 1 - smoke test infra (avant pause)**
|
||||
|
||||
1. Conflit `.env` BYAN/Wakdo traite par fusion en 1 fichier (gitignore)
|
||||
2. Switch FQDN `acadenice.fr` -> `stark.a3n.fr` (zone wildcard existante, evite la
|
||||
provisioning DNS prerequise par le challenge HTTP-01 de Traefik)
|
||||
3. Smoke `make init` casse 3 fois et corrige :
|
||||
- Subnet explicite `192.168.148.0/24` (pools Docker satures)
|
||||
- `init: true` sur cron (dcron PID 1 setpgid)
|
||||
- Healthz statique dans `/usr/local/apache2/htdocs/` (RewriteRule R=200 declenchait
|
||||
ErrorDocument template)
|
||||
4. Validation HTTPS externe : 4 services healthy, certs OK, `/healthz` isole
|
||||
5. Journal session ecrit (`docs/journal/2026-04-30--smoke-test-infra.md`)
|
||||
6. PR #1 -> incident main au lieu de dev -> remediation FF dev=main
|
||||
7. Tag `v0.1.0` annote sur le merge commit
|
||||
8. Memoire `feedback_no_absolutes.md` enregistree (hook fact-check sensible)
|
||||
|
||||
**Phase 2 - import assets ecole**
|
||||
|
||||
9. Drop zone `docs/_inbox/` recue (9 Mo, 71 images + 2 JSON + 1 PDF + 1 readme)
|
||||
10. Diagnostic : naming "wacdo" vs notre "Wakdo", casse incoherente, 7 typos dans JSON
|
||||
11. Rangement final :
|
||||
- `docs/merise/_sources/` (2 JSON + source-school.md provenance)
|
||||
- `docs/design/` (maquette PDF + README pointant Figma)
|
||||
- `src/public/borne/assets/images/` (71 images normalisees kebab-case lowercase)
|
||||
12. Workaround `chown` via container ephemere (src/ etait owned root par Docker bind-mount)
|
||||
13. PR #2 -> dev (workflow correct cette fois)
|
||||
|
||||
**Phase 3 - demarrage P1 Merise**
|
||||
|
||||
14. Decisions cadrage P1 actees :
|
||||
- MOT skippe (raccourci agile MCT -> MLT direct)
|
||||
- Composition flexible (`menu_produit` avec `role` et `position`)
|
||||
- Pas de `quantite` sur menu_produit (YAGNI - 13 menus mono-portion)
|
||||
- 9 entites + 1 jointure RBAC : Categorie, Produit, Menu, MenuProduit, Commande,
|
||||
LigneCommande, User, Role, Permission, RolePermission
|
||||
- Pas de stock numerique (juste `est_disponible` boolean)
|
||||
- Pas de stats agregees (live queries)
|
||||
- Pas d'allergenes/nutrition pour MVP
|
||||
15. Stubs minimaux pour debloquer le 403 :
|
||||
- `src/public/borne/index.html` (HTML statique avec logo, vhost kiosk)
|
||||
- `src/public/admin/index.php` (PHP qui prouve la chaine FastCGI E2E)
|
||||
16. 2 bugs infra exposes par les stubs et fixes :
|
||||
- Apache `DirectoryIndex` ne contenait pas `index.php` (admin renvoyait 403)
|
||||
- PHP-FPM `listen.allowed_clients = any` rejete par PHP 8.3 (toutes les connexions
|
||||
Apache->PHP-FPM rejetees, FastCGI cassait silencieusement)
|
||||
17. Validation HTTPS externe : kiosk -> 200 HTML, admin -> 200 PHP rendu (PHP_VERSION
|
||||
et timestamp dynamique substitues)
|
||||
18. Commit `b8f7d35` : `feat(stubs): unblock 403 with kiosk and admin index pages, plus FastCGI fixes`
|
||||
19. Dictionnaire de donnees v0.1 redige (`docs/merise/dictionary.md`) :
|
||||
- ~340 lignes, 10 entites detaillees
|
||||
- Diagramme entites-relations en Mermaid (rendu GitHub natif)
|
||||
- 7 notes de modelisation (FLOAT vs cents, ENUM vs table, STI, polymorphisme,
|
||||
audit fields, RFC 5321 emails, etc.)
|
||||
- Cross-validation avec `PROJECT_CONTEXT.md` et source ecole
|
||||
20. 3 notes techniques perso (`docs/notes/`, gitignore) :
|
||||
- `rbac-roles-permissions.md` : pattern RBAC dynamique vs statique, UI matrice, Q&A jury
|
||||
- `monetary-int-cents.md` : INT centimes + TVA pour mille, Goldberg ACM 1991, Stripe
|
||||
convention, 5 pieges
|
||||
- `polymorphic-fk-snapshots.md` : 2 colonnes nullables + discriminator + snapshots,
|
||||
Karwin SQL Antipatterns, integrite historique commandes
|
||||
21. Memoire `feedback_notes_author.md` mise a jour : auteur des notes = "BYAN" (pas un
|
||||
nom de LLM specifique), coherent avec la transparence projet section 17 PC
|
||||
|
||||
---
|
||||
|
||||
## En cours (a reprendre)
|
||||
|
||||
**Branche locale `feat/p1-stubs-and-dictionary` avec 1 commit fait + dictionnaire UNCOMMITTED.**
|
||||
|
||||
### Commande exacte pour reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
git status # confirmer ?? docs/merise/dictionary.md
|
||||
git branch --show-current # doit etre feat/p1-stubs-and-dictionary
|
||||
git log --oneline dev..HEAD # voir b8f7d35 (stubs+fixes)
|
||||
```
|
||||
|
||||
### A faire lors de la reprise
|
||||
|
||||
1. **Commit le dictionnaire** :
|
||||
```bash
|
||||
git add docs/merise/dictionary.md
|
||||
git commit -m "docs(merise): data dictionary v0.1 - 10 entities + Mermaid ER diagram + 7 modeling notes
|
||||
|
||||
Bottom-up derivation from school JSON sources + PROJECT_CONTEXT business rules.
|
||||
Covers : Categorie, Produit, Menu, MenuProduit, Commande, LigneCommande,
|
||||
User, Role, Permission, RolePermission. Decisions documented :
|
||||
prices in INT cents, VAT in per-mille, polymorphic FK with snapshots
|
||||
on ligne_commande, dynamic roles vs static permissions for RBAC."
|
||||
```
|
||||
|
||||
2. **Push + PR** :
|
||||
```bash
|
||||
SSH_AUTH_SOCK=/tmp/ssh-Evc7jT0fk2rs/agent.2611024 git push -u origin feat/p1-stubs-and-dictionary
|
||||
```
|
||||
Puis ouvrir PR via :
|
||||
`https://github.com/AcadeNice/wakdo_corentin/compare/dev...feat/p1-stubs-and-dictionary?expand=1`
|
||||
**VIGILANCE** : verifier base = `dev` (pas `main` !) avant de cliquer Create.
|
||||
|
||||
3. **Continuer P1** sur une nouvelle branche `feat/p1-merise-models` (apres merge de la
|
||||
precedente) ou sur la meme branche etendue. Suite des etapes :
|
||||
- **MCD** : `docs/merise/mcd.md` avec un diagramme Mermaid plus formel (entites +
|
||||
associations + cardinalites min/max), distinct du diagramme preview du dictionnaire
|
||||
- **MCT** : `docs/merise/mct.md` - les operations metier (valider commande, encaisser
|
||||
paiement, marquer pret, ...)
|
||||
- **MLT** : `docs/merise/mlt.md` - workflow logique de chaque traitement (preconditions,
|
||||
regles, postconditions, sorties)
|
||||
- **MLD** : `docs/merise/mld.md` - schema relationnel formel
|
||||
- **DDL** : `db/migrations/0001_init_schema.sql` - SQL CREATE TABLE concret
|
||||
- **Seed** : `db/seeds/0001_demo_data.sql` - INSERT des 9 categories + 53 produits +
|
||||
13 menus a partir des JSON sources, avec normalisation des prix en centimes
|
||||
- **Export fallback JSON** : `scripts/export-fallback.{sh|php}` qui genere
|
||||
`src/public/borne/data/*.json` depuis le seed (pour mode "Bloc 1 isole")
|
||||
|
||||
4. **Notes perso restantes a rediger** (basse priorite, peut s'etaler sur plusieurs sessions) :
|
||||
- `enum-vs-table-reference.md` : quand utiliser ENUM vs table referentielle
|
||||
- `docker-network-pools-rfc1918.md` : pool saturation Docker, choix subnet explicite
|
||||
- `apache-fastcgi-pitfalls.md` : les 3 bugs infra de cette session (DirectoryIndex,
|
||||
listen.allowed_clients, RewriteRule R=200)
|
||||
- `merise-yagni-quantite.md` : application concrete de YAGNI sur menu_produit
|
||||
|
||||
5. **Optionnels post-merge** (peuvent aller sur une branche `feat/infra-polish` separee
|
||||
apres P1) :
|
||||
- Investiguer redirect HTTP->HTTPS qui retourne 404 (interaction avec middleware
|
||||
global du Traefik d'hote)
|
||||
- Unifier le style init Docker (wakdo-app a tini explicite, wakdo-cron a `init: true` -
|
||||
incoherence stylistique a accepter ou unifier)
|
||||
|
||||
---
|
||||
|
||||
## Workflow git en vigueur
|
||||
|
||||
- **Convention** : `feat/* -> dev` (squash merge), `dev -> main` (avec tag `vX.Y.Z` annote)
|
||||
- **Vigilance PR** : verifier explicitement `base branch = dev` (le defaut GitHub est `main`)
|
||||
- **Branches mergees** : conservees comme trace historique
|
||||
- **Procedure d'archive** si une branche est abandonnee non-mergee :
|
||||
```bash
|
||||
git tag -a archive/feat-xxx <branch-tip-sha> -m "abandoned: <reason>"
|
||||
git push origin archive/feat-xxx
|
||||
git push origin --delete feat-xxx
|
||||
git branch -D feat-xxx
|
||||
```
|
||||
- **Tags previsionnels** : v0.1.0 (infra), v0.2.0 (P2 stubs+auth+CRUD basic), v0.3.0 (CRUD
|
||||
admin complet), ..., v1.0.0 (livrable jury)
|
||||
|
||||
---
|
||||
|
||||
## Decisions structurelles actees Session 4
|
||||
|
||||
| Decision | Pourquoi |
|
||||
|---|---|
|
||||
| Fusion `.env` BYAN+Wakdo | Outil tiers lit `.env` du cwd, separation `.env.wakdo` plus risquee |
|
||||
| FQDN sur `*.stark.a3n.fr` | Wildcard DNS existant, evite provisioning prerequis HTTP-01 |
|
||||
| Subnet explicite `192.168.148.0/24` (RFC 1918) | Pools Docker satures sur hote partage |
|
||||
| `init: true` sur cron | dcron en PID 1 sans init reaper boucle sur setpgid Operation not permitted |
|
||||
| Healthz statique htdocs | RewriteRule R=200 declenche template ErrorDocument |
|
||||
| `APP_ENV=dev` + `APP_DEBUG=true` | Phase de construction, flip vers prod avant demo jury |
|
||||
| Naming "wacdo" (source) vs "Wakdo" (projet) | wacdo preserve dans `_sources/` pour tracabilite ecole |
|
||||
| Casse images normalisee kebab-case lowercase | Anti-piege case-sensitive Linux dans Docker |
|
||||
| MOT (modele organisationnel des traitements) skippe | Raccourci agile MCT -> MLT direct |
|
||||
| Composition flexible `menu_produit` (role+position) | Defendable evolution future sans refacto |
|
||||
| Pas de `quantite` sur `menu_produit` | YAGNI - 13 menus mono-portion |
|
||||
| Prix en INT centimes + TVA en pour mille | Anti-FLOAT IEEE 754 (Goldberg ACM 1991) |
|
||||
| Snapshots libelle+prix sur `ligne_commande` | Integrite historique audit |
|
||||
| Polymorphisme `ligne_commande` -> `produit` OR `menu` | 2 cols nullable + discriminator + 2 FKs reelles |
|
||||
| RBAC : roles+role-permission dynamiques, permissions statiques | Permissions liees au code (declarees en migration) |
|
||||
| Pas de stock numerique en MVP | Juste `est_disponible` boolean |
|
||||
| Pas de stats agregees | Live queries SUM/GROUP BY suffisent |
|
||||
| Pas d'allergenes/nutrition | Hors source ecole, hors scope MVP |
|
||||
| ENUM pour valeurs metier stables | mode_consommation, statut, role -> 3-7 valeurs, ALTER si extension |
|
||||
| Auteur notes perso = "BYAN" | Coherent avec section 17 PC (transparence methodologie) |
|
||||
|
||||
---
|
||||
|
||||
## Prochaines etapes (apres merge `feat/p1-stubs-and-dictionary` -> `dev`)
|
||||
|
||||
```
|
||||
P1 Conception Merise (semaines 2-3) - EN COURS
|
||||
1. Dictionnaire de donnees v0.1 ECRIT (a commit)
|
||||
2. MCD a faire
|
||||
3. MCT a faire
|
||||
4. (MOT skippe)
|
||||
5. MLD a faire
|
||||
6. MLT a faire
|
||||
7. DDL a faire
|
||||
8. Seed data a faire
|
||||
9. JSON fallback a faire
|
||||
|
||||
P2 Back squelette (semaines 4-6)
|
||||
- Core (Router, Autoloader, DB)
|
||||
- Auth (sessions PHP fichier + argon2id)
|
||||
- RBAC (Authorization service)
|
||||
- Front controller `index.php`
|
||||
|
||||
P3 CRUD admin (semaines 7-10)
|
||||
- CRUD produits, menus, categories
|
||||
- UI roles + assignment matrice permissions
|
||||
- CRUD users
|
||||
|
||||
P4 API REST (semaines 11-12)
|
||||
- Endpoints /api/categories, /api/menus, /api/produits, /api/orders
|
||||
- CORS + tests
|
||||
|
||||
P5 Front borne (semaines 13-16)
|
||||
- Integration maquette + Ajax + a11y RGAA
|
||||
- Mode JSON-seuls (fallback) + mode API-connecte
|
||||
|
||||
P6 Tests + finition (semaines 17-18)
|
||||
|
||||
P7 DevOps final (semaine 19) - GitHub Actions, crons, docs
|
||||
|
||||
P8 Prep soutenance (semaine 20)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Fichiers cles a consulter a la reprise
|
||||
|
||||
| Fichier | Contenu |
|
||||
|---|---|
|
||||
| `docs/PROJECT_CONTEXT.md` | Source de verite projet (FQDN sur stark.a3n.fr, section 17 transparence IA) |
|
||||
| `docs/_ref/rncp-37805-referentiel.pdf` | Referentiel RNCP officiel |
|
||||
| `docs/_ref/rncp-37805-index.md` | Index texte compact des criteres (cherchable) |
|
||||
| `docs/journal/README.md` | Template + index des retros (3 entrees) |
|
||||
| `docs/journal/2026-04-30--smoke-test-infra.md` | Retro Session 4 phase 1 (smoke test) |
|
||||
| `docs/merise/dictionary.md` | **Dictionnaire P1 v0.1 ECRIT (a commit)** |
|
||||
| `docs/merise/_sources/` | JSON sources ecole + provenance |
|
||||
| `docs/design/` | Maquette PDF + lien Figma |
|
||||
| `docs/notes/` | Notes perso revision oral (3 ecrites cette session, gitignore) |
|
||||
| `docs/SESSION_RESUME.md` | Ce fichier - a mettre a jour en fin de session |
|
||||
| `.env` | Config locale fusionnee (BYAN + Wakdo, gitignore) |
|
||||
| `.env.example` | Template neutre commit, RFC 2606 |
|
||||
| `docker-compose.yml` | Compose final (subnet 192.168.148.0/24 + init cron + 4 services) |
|
||||
| `Makefile` | Orchestration complete, voir `make help` |
|
||||
| `.claude/CLAUDE.md` | Constitution projet BYAN |
|
||||
| `.claude/rules/fact-check.md` | **Patterns du hook fact-check (a consulter avant ecriture narrative !)** |
|
||||
|
||||
---
|
||||
|
||||
## Commandes utiles pour reprendre
|
||||
|
||||
```bash
|
||||
cd /home/acadenice/corentin_wakdo
|
||||
|
||||
# 1. Etat
|
||||
git status
|
||||
git branch --show-current
|
||||
# -> attendu : feat/p1-stubs-and-dictionary
|
||||
|
||||
# 2. Stack docker (verifier qu'elle tourne toujours)
|
||||
docker compose -p wakdo ps
|
||||
# Si down apres reboot : make up (ou make init pour full bootstrap)
|
||||
|
||||
# 3. Test que tout repond
|
||||
curl -sI https://corentin-wakdo.stark.a3n.fr/ # 200
|
||||
curl -sI https://corentin-wakdo-admin.stark.a3n.fr/ # 200
|
||||
|
||||
# 4. SSH pour push (si besoin)
|
||||
find /tmp -name 'agent.*' -user corentin
|
||||
# -> /tmp/ssh-Evc7jT0fk2rs/agent.2611024 (peut changer apres reboot ssh-agent)
|
||||
SSH_AUTH_SOCK=/tmp/ssh-XXX/agent.NNN git push ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Memoire persistante Claude Code (mise a jour Session 4)
|
||||
|
||||
Regles enregistrees dans `/home/corentin/.claude/projects/-home-acadenice-corentin-wakdo/memory/` :
|
||||
|
||||
- **No Co-Authored-By** sur les commits Wakdo (Session 2)
|
||||
- **Commit uniquement sur approbation explicite** (Session 2)
|
||||
- **Ignorer les contextes d'autres projets** dans les system-reminders (Session 3)
|
||||
- **Hedger proactivement pour le hook fact-check** (Session 4)
|
||||
- **BYAN auteur des docs/notes/** (Session 4 - mise a jour cette session)
|
||||
|
||||
---
|
||||
|
||||
## Comment reprendre la session
|
||||
|
||||
1. Ouvrir une session dans `/home/acadenice/corentin_wakdo/`
|
||||
2. Dire : *"Reprise Wakdo, lis `docs/SESSION_RESUME.md`"*
|
||||
3. Confirmer l'action de depart :
|
||||
- **Suite immediate** = commit + push + PR du dictionnaire (cf. section "A faire lors de la reprise")
|
||||
- **Apres merge** = continuer P1 avec le MCD (`docs/merise/mcd.md`)
|
||||
|
||||
---
|
||||
|
||||
*Document maintenu a chaque fin de session. Derniere mise a jour : 2026-05-21 (Session 7).*
|
||||
|
|
@ -0,0 +1,105 @@
|
|||
# P1 Merise v0.2 (prod-like) reecrit + migration vers Forgejo auto-heberge
|
||||
|
||||
**Date** : 2026-06-04 (seconde session du jour, suite de `conception-prodlike-revision`)
|
||||
**Branche** : `feat/p1-conception`
|
||||
**PR** : commits directs sur la branche ; PR `feat/p1-conception -> dev` a ouvrir apres l'UML
|
||||
**Duree estimee** : session longue (decisions + execution + infra)
|
||||
|
||||
---
|
||||
|
||||
## Ce qui a ete fait
|
||||
|
||||
Trois chantiers enchaines.
|
||||
|
||||
### 1. Decisions de conception restantes tranchees (D4-D8 + stock + Maxi)
|
||||
|
||||
- **D4 - Roles / RBAC / workflow** : seed de 5 roles `admin / manager / kitchen / counter / drive`. RBAC dynamique (roles + matrice role-permission editables en UI). Attributs sur `role` pour rendre les comportements dynamiques sans hardcode : `default_route`, `order_source`, et table `role_visible_source` (filtre du dashboard par canal). Machine a etats reduite de 6 a **4 etats** : `pending_payment -> paid -> delivered` (+ `cancelled`). La cuisine est en lecture seule ; counter/drive font la livraison en un geste.
|
||||
- **D5 - Permissions** : catalogue fige de 23 codes `resource.action` + matrice par defaut. Correction appliquee : `admin` recoit `order.create`/`order.deliver` ; `manager` ne recoit pas `order.cancel`.
|
||||
- **D6 - service_day** : coupure a 10h00, calcul applicatif (`CASE WHEN HOUR(created_at) < 10 ...`), la colonne generee buguee a 4h30 du MLD v0.1 est abandonnee.
|
||||
- **D7 - Subnet Docker** : retour a l'auto-allocation (IP liberees sur le serveur), le subnet explicite n'est plus necessaire.
|
||||
- **D8 - Numero de commande** : prefixe par canal `K`/`C`/`D`.
|
||||
- **Stock numerique** par ingredient : colonnes `unit`, `stock_quantity`, `pack_size`, `pack_label`, `low_stock_threshold` sur `ingredient` ; decrement automatique a la transition `paid`, re-credit a l'annulation, reconciliation manuelle (inventaire), journal `stock_movement` append-only, permissions `stock.read`/`stock.count`/`stock.manage`.
|
||||
- **Format Maxi** : multiplicateur de recette. `product_ingredient` porte `quantity_normal` et `quantity_maxi` ; le decrement suit `order_item.format`. Le Maxi agrandit l'accompagnement et la boisson uniquement (burger et sauce invariants).
|
||||
|
||||
Decisions consignees dans `docs/notes/revue-alignement-p1.md` section 7 (non versionne).
|
||||
|
||||
### 2. Reecriture des 5 docs Merise en prod-like v0.2 (19 entites, anglais)
|
||||
|
||||
Delegation a l'agent `expert-merise-agile`, en deux lots (donnees : dictionary/MCD/MLD ; traitements : MCT/MLT), chaque sortie verifiee contre le tableau de decision puis recalee a la main (matrice de permissions, multiplicateur Maxi). Resultat : `dictionary.md`, `mcd.md`, `mld.md`, `mct.md`, `mlt.md` reecrits, 19 entites, vocabulaire anglais `snake_case`, `commande_event` et `menu_produit` supprimes au profit du configurateur d'ingredients, des allergenes, des slots de menu et du journal de stock. Cinq commits (un par doc) sur `feat/p1-conception`.
|
||||
|
||||
### 3. Migration du depot vers Forgejo auto-heberge + gouvernance PR
|
||||
|
||||
- Nouveau depot `https://git.acadenice.com/AcadeNice/corentin_wakdo` (Forgejo sur le serveur).
|
||||
- **Dual-push** configure : `git push origin` pousse desormais sur GitHub ET Forgejo, les deux en HTTPS via des tokens lus dans `.env` (gitignore). Aucun token persiste dans `.git/config` (credential helper qui lit `.env` au moment du push).
|
||||
- **Reconciliation** d'un desalignement decouvert au passage : `dev` sur GitHub (`a3eae01`) etait le vrai tronc integre (PR #4 front, #5 conception, #6 admin shell mergees), tandis que `dev` local et Forgejo etaient restes a `68db2ee`. Forgejo a ete resynchronise sur l'etat GitHub complet, sans perte.
|
||||
- **Template de PR** (`.gitea/PULL_REQUEST_TEMPLATE.md`, conventions BYAN) ajoute sur `dev`.
|
||||
- **Protections de branche** sur `main` et `dev` (API Forgejo) : push direct interdit (PR obligatoire), force-push bloque, 0 approbation requise (adapte au travail solo).
|
||||
|
||||
---
|
||||
|
||||
## Pourquoi - decisions et alternatives
|
||||
|
||||
- **Machine a 4 etats au lieu de 6** : en fast-food, le KDS cuisine est un affichage visuel ; `preparing` et `ready` ajoutaient des transitions sans valeur metier proportionnelle. La livraison fusionne `ready`+`delivered` en un clic. Le KPI reste le temps total `delivered_at - paid_at`.
|
||||
- **Stock Maxi via multiplicateur de recette** (alternative ecartee : produits de taille distincte Moyenne/Grande) : l'auteur a prefere un seul produit par choix avec `quantity_normal`/`quantity_maxi`, plus simple a saisir au seed tout en gardant un stock realiste.
|
||||
- **Forgejo auto-heberge** (alternative : rester sur GitHub) : GitHub facture les depots prives, et l'auto-hebergement apporte Forgejo Actions et un controle fin des regles de PR. Cela ajoute un argument infra (Bloc 5) puisque la chaine forge + CI est maitrisee de bout en bout.
|
||||
- **Tout en HTTPS + token plutot que SSH** : la cle SSH GitHub (`~/.ssh/git_wakdo`) est protegee par passphrase et inutilisable depuis le shell non-interactif de l'assistant. Les tokens HTTPS stockes dans `.env` permettent un push automatise des deux cotes.
|
||||
- **0 approbation sur les protections** : en solo, exiger une approbation bloquerait le merge (on ne peut pas approuver sa propre PR). La protection conserve l'essentiel : PR obligatoire et pas de force-push.
|
||||
|
||||
---
|
||||
|
||||
## Comment - points techniques cles
|
||||
|
||||
- **Credential helper lisant `.env`** : `git config credential.https://<host>.helper` pointe vers un script qui extrait le token de `.env` au moment du push. Avantage : roter un token = editer `.env`, sans reconfiguration git, et aucun secret dans `.git/config`.
|
||||
- **Reconciliation `dev`** : `git branch -f dev origin/dev` pour reprendre l'etat GitHub reel, template ajoute par-dessus dans un worktree dedie (working tree principal preserve), push fast-forward sur GitHub et push force sur Forgejo (lignee perimee remplacee, depot neuf donc sans risque).
|
||||
- **Protections via API** : `POST /api/v1/repos/.../branch_protections` avec `enable_push=false` et `required_approvals=0` pour `main` et `dev`.
|
||||
|
||||
---
|
||||
|
||||
## Criteres RNCP couverts
|
||||
|
||||
- **Bloc 2 - Cr 3.a / 3.b** : modelisation des donnees prod-like (dictionnaire, MCD, MLD), polymorphisme, snapshots, configurateur d'ingredients, journal de stock.
|
||||
- **Bloc 2 - Cr 3.d** : TVA portee par le produit et calculee ligne par ligne.
|
||||
- **Bloc 5** : forge auto-hebergee, gouvernance de branches (protections + template PR), socle pour la CI Forgejo Actions a venir.
|
||||
|
||||
---
|
||||
|
||||
## Questions anticipees du jury
|
||||
|
||||
- **Q** : "Pourquoi heberger votre propre forge plutot qu'un service gere ?"
|
||||
**R** : Maitrise de la chaine (depot, CI via Forgejo Actions, regles de PR), depots prives sans cout, et coherence avec l'infra deja en place sur le serveur. GitHub est conserve comme copie synchronisee.
|
||||
|
||||
- **Q** : "Comment gerez-vous le stock d'un menu Maxi ?"
|
||||
**R** : Un multiplicateur de recette : `product_ingredient` porte une quantite Normale et une quantite Maxi, le decrement suit le format de la ligne. Le Maxi n'agrandit que l'accompagnement et la boisson.
|
||||
|
||||
- **Q** : "Vos secrets sont-ils exposes dans le depot ?"
|
||||
**R** : Non. Les tokens vivent dans `.env` (gitignore) ; `.git/config` ne contient que des scripts qui les lisent. Le credential helper evite de stocker un token en clair dans la config git.
|
||||
|
||||
---
|
||||
|
||||
## Points d'amelioration conscients
|
||||
|
||||
- **UML pas encore reecrit** : `state-commande.md`, `use-cases.md`, `sequence-passer-commande.md` sont encore en v0.1 (6 etats, ancien vocabulaire). A reecrire pour 4 etats / 5 roles / slots+modifiers avant d'ouvrir la PR conception.
|
||||
- **PROJECT_CONTEXT sections 7 et 11** : a mettre a jour (retirer "MVP", passer a ~19 entites, rechiffrer le planning).
|
||||
- **Diagrammes drawio** (MCD/MLD) : a regenerer pour 19 entites ; les `.md` utilisent du Mermaid inline en attendant.
|
||||
- **SESSION_RESUME.md** : perime (Session 7), a rafraichir avec le nouveau remote dual-push et l'etat v0.2.
|
||||
- **Synchronisation des merges Forgejo vers GitHub** : un merge fait dans l'UI Forgejo ne remonte pas tout seul sur GitHub ; un push-mirror Forgejo -> GitHub serait la reponse propre, a decider.
|
||||
- **Token Forgejo expose dans le chat** : il a transite en clair pendant la mise en place ; le roter quand pratique (il est dedie au push, donc impact limite).
|
||||
|
||||
---
|
||||
|
||||
## Etat a la reprise
|
||||
|
||||
- Conception v0.2 **committee** (dictionnaire + MCD/MLD/MCT/MLT) et **deja presente dans `dev`** (`971ce0c`) via la PR #5 mergee puis resynchronisee.
|
||||
- `feat/p1-conception` est a `392ba9a` ; une PR vers `dev` serait vide tant que l'UML + PROJECT_CONTEXT ne sont pas produits.
|
||||
- **Prochaine action** : reecrire l'UML + PROJECT_CONTEXT sur `feat/p1-conception`, committer (un commit par doc), pousser (dual), puis ouvrir la PR `feat/p1-conception -> dev` avec le template.
|
||||
|
||||
---
|
||||
|
||||
## Liens vers artefacts
|
||||
|
||||
- Commits Merise v0.2 : `6ceebf7` (dictionary), `6c1cede` (MCD), `36332b4` (MLD), `6057ef9` (MCT), `392ba9a` (MLT)
|
||||
- Template PR + sync dev : `971ce0c`
|
||||
- Depots : `https://git.acadenice.com/AcadeNice/corentin_wakdo` (Forgejo) + `https://github.com/AcadeNice/wakdo_corentin` (GitHub, miroir synchronise)
|
||||
- Docs reecrits : `docs/merise/{dictionary,mcd,mld,mct,mlt}.md`
|
||||
- Tableau de decision : `docs/notes/revue-alignement-p1.md` section 7 (non versionne)
|
||||
- Journal precedent du jour : `docs/journal/2026-06-04--conception-prodlike-revision.md`
|
||||
|
|
@ -31,6 +31,7 @@ Les fichiers sont ordonnes chronologiquement par leur nom.
|
|||
| 2026-04-24 | [infra-docker](2026-04-24--infra-docker.md) | Stack Docker complete (compose + 4 services), referentiel RNCP integre, cross-check mappings Cr 4.f | `feat/infra-docker` |
|
||||
| 2026-04-30 | [smoke-test-infra](2026-04-30--smoke-test-infra.md) | Smoke test bout-en-bout sur serveur reel : fusion .env, switch FQDN sur stark.a3n.fr, subnet explicite RFC 1918, fix init cron + healthz | `feat/infra-docker` |
|
||||
| 2026-06-04 | [conception-prodlike-revision](2026-06-04--conception-prodlike-revision.md) | Revue d'alignement P1 + decisions prod-like du modele de donnees (drop commande_event, nommage EN, TVA par produit apres fact-check BOFiP, perso menus/ingredients, allergenes, ~16 entites) | `feat/p1-conception` |
|
||||
| 2026-06-04 | [p1-merise-v0.2-rewrite-and-forgejo-migration](2026-06-04--p1-merise-v0.2-rewrite-and-forgejo-migration.md) | Decisions D4-D8 + stock + Maxi tranchees, reecriture des 5 docs Merise en prod-like v0.2 (19 entites, anglais), migration vers Forgejo auto-heberge (dual-push, template PR, protections de branche) | `feat/p1-conception` |
|
||||
|
||||
*Mis a jour a chaque nouvelle entree.*
|
||||
|
||||
|
|
|
|||
2658
package-lock.json
generated
Executable file
2658
package-lock.json
generated
Executable file
File diff suppressed because it is too large
Load diff
5
package.json
Executable file
5
package.json
Executable file
|
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"dependencies": {
|
||||
"create-byan-agent": "^2.16.1"
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue