Commit graph

20 commits

Author SHA1 Message Date
37e516af36 docs(session): update SESSION-RESUME apres Bloc 1+2+3 + smoke test
Some checks are pending
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Lint bridge (Biome) (push) Waiting to run
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- Ajoute CHANGELOG en tete du doc avec les 4 commits de la session soir
- Ajoute section "Smoke test live — etat actuel" avec table des resultats
- Ajoute section "Etat des blocs Phase 2 (a jour)" : 1-2-3 DONE, 4 inclus dans 3, 3.2/5/6/7 TODO avec recommandations
- Update credentials : bridge/.env documente + commande docker run bridge-redis
- Update commits Forgejo : split jour / soir
- Update checklist demarrage prochaine session : pull, bridge-redis, npm run dev, smoke quick, options bloc

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:12:42 +02:00
7a3fbe455d fix(bridge): smoke test fixes — skip rows malformees + BASEROW_TABLE_IDS override
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Decouverts via smoke test local contre Baserow + Docmost reels.

1. **BaseRepo.list robuste** : try/catch toDomain par row, skip + log warn
   si throw (ex Personne avec splits null != 100). Avant : 500 sur la liste
   entiere. Apres : 200 avec items valides + meta.skipped count pour visibilite.
   `get()` continue de propager (un get sur row corrompue = legitimement 500
   pour investigation manuelle).

2. **BASEROW_TABLE_IDS env override** : BaserowClient.resolveTableIds appelle
   /api/database/tables/database/:id/ qui requiert un JWT user (Baserow API
   distingue DB tokens reservees aux endpoints rows, et JWT pour les endpoints
   admin). En dev/prod simple on passe le mapping directement par env var :
   BASEROW_TABLE_IDS={"personne":609,"formation":610,...}. Le code resolveTableIds
   reste en place pour Phase 3+ (bridge avec JWT user).

Smoke test post-fix :
- GET /api/health, /api/ready : 200
- Auth : 401 absent / 401 invalide / 200 valide
- GET /personnes (rows test invalides) : 200 data:[] meta.skipped:2
- GET /formations, /projets : 200 avec rows
- GET /personnes/9999 : 404

Tests Vitest : 163/163 verts. tsc + biome ci verts.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:09:27 +02:00
c8e9b4d4ea feat(bridge): bloc 3 — routes REST Tier 1 + auth + repos Baserow (10 endpoints)
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Wiring HTTP du bridge service. 10 endpoints livres (cf docs/19 §6.1-6.5) :
- GET /api/v1/personnes (+ /:id, + /:id/dashboard)
- GET /api/v1/formations (+ /:id avec rollups blocs/modules)
- GET /api/v1/projets (+ /:id avec rollups taches)
- POST /api/v1/modules/:id/attribuer (RG-01 -> 422, role/heures invalides -> 400)
- POST /api/v1/interventions (validation role developpeur + heures > 0)
- PATCH /api/v1/attributions/:id/heures-realisees (409 si annule/realise)

Layers ajoutees :
- src/middleware/auth.ts : Bearer brg_*, scopes JSON-encoded BRIDGE_API_TOKENS, admin:* wildcard
- src/middleware/error-handler.ts : BridgeError -> JSON shape standard
- src/lib/container.ts : DI singleton (Baserow + Redis + 9 repos), setContainer testable
- src/lib/http.ts : parseListQuery + parseBody zod helper
- src/repos/baserow-repo.ts : BaseRepo<T> abstrait + 9 sous-classes (mapping Row<->Domain)
- src/routes/{personnes,formations,projets,modules,interventions,attributions}.ts

src/index.ts reecrit : buildApp() + initContainer + auth sur /api/v1/* + ready check Baserow+Redis.

Tests : 163/163 verts (12 suites domain + 8 nouvelles : auth, repos, 6 routes).
Coverage src global : 70.77% (cible 60%). Domain 97.86%, routes 96%, middleware 86%.

Choix : BaseRepo abstrait (pas mega-generic, Ockham) ; FakeRepos in-memory pour tests routes
(pas de testcontainers ici, c'est Bloc 7) ; mapping erreurs domain -> HTTP par message texte
(fragile, sera refactor en DomainError typees au Bloc 3.2).

Hors scope (a venir) :
- Bloc 5 : rate limiting Redis
- Bloc 7 : webhook handlers Baserow + sync bidirec + cache invalidation
- Bloc 3.2 : routes /docmost/*, /sync/*, /rapports/*

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 20:01:36 +02:00
2c5665bc44 feat(bridge/domain): bloc 2 — domain models + tests Vitest (coverage 97.86%)
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Modele OO complet (cf docs/12-uml-class-diagram.md) en TypeScript strict :
- Personne (pivot multi-roles, splits formation/agence, heuresRestantes*)
- Formation -> Bloc -> Module composition + heuresRestantes rollup
- Module.creerAttribution avec validation RG-01 (capacite) + role formateur
- Attribution lifecycle : demarrer/saisirHeuresRealisees/cloturer/annuler
- Client -> Projet -> Tache composition + lierFormationPedagogique
- Tache.creerIntervention avec validation role developpeur + heures > 0 + actif
- Schemas zod pour runtime validation (z.infer types exposes)
- Decimal.js partout pour les heures (zero erreur flottante)

Patterns appliques :
- Statuts comme discriminated unions ('actif' | 'inactif' | ...)
- Statuts annules exclus des rollups (annulation libere capacite)
- _appliquerHeures* en pseudo-private (convention underscore, pas de friend en TS)
- Warn surcharge Personne non bloquant (overbooking volontaire possible) — RG-01 Module reste bloquante

Tests : 111 pass / 0 fail. Coverage domain : 97.86% lines, 98.57% funcs.
tsc strict EXIT 0, biome ci EXIT 0.

Hors scope (a venir) :
- Repository pattern (Bloc 3 avec routes Hono)
- rapportPDF (Phase 2.4)
- Tests adapters Bloc 1 (Bloc 6 via bridge-tester)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 19:48:22 +02:00
5b2abbc23c feat(bridge/adapters): bloc 1 propre — BaserowClient + DocmostClient + RedisCache
- BaserowClient : CRUD rows, listRows pagination/filter/search, resolveTableIds, healthCheck
- DocmostClient : auth session cookie auto-relogin, spaces/pages/shares CRUD, healthCheck
- RedisCache : cache-aside, invalidation pattern SCAN, idempotence webhooks, rate limit sliding window
- errors.ts : BridgeError typee + 11 ErrorCode (AUTH/RG_VIOLATION/BASEROW_UNAVAILABLE...)
- bumps mineurs deps (hono, ofetch, ioredis, zod, pino) + ajout pino-pretty dev

tsc strict mode clean, biome ci clean. Tests unit a venir (Bloc 6 via bridge-tester).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 19:39:58 +02:00
460f7effe0 feat(workflows): create 5 BYAN workflows for agent collaboration
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Workflows (playbooks markdown) pour orchestrer les 4 agents specialises :

- README.md : index + conventions communes + integration BYAN web futur
- build-story.md : cycle complet livrer 1 story Phase 2 (bridge-dev → bridge-tester → review → CI → deploy staging → validation metier)
- sync-bidirec.md : sync Docmost ↔ Baserow event-driven (idempotence + anti-loop X-Bridge-Origin)
- release.md : process release semver (E2E staging → tag → approval → deploy prod → watch 30min)
- incident.md : SEV1/2/3 response + post-mortem blameless + runbooks
- bump-deps.md : Dependabot PRs + major bumps + Docmost/Baserow upstream

Chaque workflow specifie : trigger, acteurs (agents + humains), sequence
ordonnee avec outputs, gates humains bloquants, rollback, comm templates.

Workflows = playbooks declaratifs pour Claude main qui orchestre les agents
via Agent tool sequentiel. A migrer plus tard vers BYAN web workflow runs
quand le runtime BYAN sera fix.

Equipe complete pour formation-hub :
- 4 agents specialises (bridge-dev, bridge-tester, acadenice-devops, docmost-fork-dev)
- 5 workflows orchestrant leur collaboration
2026-05-07 19:30:48 +02:00
b37220d432 feat(agents): complete BYAN INT for 3 more agents + session resume MD
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Agents crees (briefs detailles ~150-200 lignes chacun) :
- bridge-tester : QA Vitest + testcontainers + E2E Playwright + coverage 80%
- acadenice-devops : Docker/Traefik/Forgejo/backups/monitoring/CI-CD
- docmost-fork-dev : React+Tiptap node-views + bidirec backlinks + fork strategy

Plus :
- _byan-output/fast-app/formation-hub/SESSION-RESUME.md : document de reprise
  pour la prochaine session apres restart Claude Code. Contient :
  * Etat global projet (conception OK + Phase 1 en cours)
  * Localisation tous artefacts (URLs, paths, IDs)
  * 19 docs conception checklist
  * Phase 1 iteration status (OK / partiel / TODO)
  * Phase 2 bridge — decoupage en blocs
  * 4 agents specialises + comment les invoquer
  * 3 workflows BYAN proposes (a creer)
  * Decisions structurelles a respecter
  * Credentials utilises (.env)
  * Tous les commits cette session
  * Checklist demarrage prochaine session

Equipe BYAN formation-hub now complete :
[OK] bridge-dev (code metier)
[OK] bridge-tester (qualite)
[OK] acadenice-devops (infra/ops)
[OK] docmost-fork-dev (frontend custom)
2026-05-07 19:26:17 +02:00
7d4d2cd427 feat(agents): create bridge-dev specialized agent (1st BYAN INT for project)
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
2026-05-07 19:16:26 +02:00
1d71364c6e feat(seed): add I4 forms publics + space etudiant + I5 healthcheck etendu
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
I4 — Forms publics + space etudiant :
- baserow/seed/seed_forms.py : cree forms publics sur attribution + intervention
  (saisie heures via lien sans compte). Form cree OK, field-options endpoint
  retourne 404 sur Baserow 1.30 — a investiguer (URL different selon version).
- docmost/setup/create-space-etudiant.py : cree space prive + invite etudiant
  + page Welcome template. Slug strict lettres+chiffres only (fix Docmost).

I5 — Ops :
- scripts/healthcheck.sh : check UI + API health (Docmost+Baserow), affiche
  status containers Docker. 4/4 OK en local.
- scripts/cron-install.sh : installe cron quotidien backup + healthcheck */5min.

Makefile : targets seed-baserow-forms, create-space-etudiant. Tous les targets
utilisent maintenant .venv/ local pour eviter pip systeme.

.gitignore : exclut .venv/ + __pycache__/.
2026-05-07 18:49:00 +02:00
d5558caf9a fix(docmost-seed): handle Docmost data envelope + add format field
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
Docmost API responses wrap : {data, success, status} (3 keys top-level).
- _post auto-unwrap si payload contient `data` dict|list
- create_page : ajout du field 'format' (markdown|json|html) requis
- welcome_page_content() : retourne markdown plain (Docmost convertit auto en Tiptap)

Iteration 3 BUILD validee en local :
  Workspace : Acadenice (id 019e034d-...)
  3 spaces  : CFA, Agence, Interne
  Page test : Welcome formation-hub dans CFA
  Share URL : http://localhost:3000/share/019e0352-7fc4-7639...

Endpoints reverse-engineered confirmes fonctionnels :
  /api/auth/setup, /api/auth/login, /api/workspace/info,
  /api/spaces/, /api/spaces/create, /api/pages/create, /api/shares/create
2026-05-07 18:43:39 +02:00
8a676d27c8 feat(docmost): add seed.py via internal endpoints (AGPL-legal, non-official)
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- docmost/setup/seed.py : Python script reverse-engineered depuis docmost/docmost
  github source. Endpoints utilises :
  * POST /api/auth/setup (bootstrap workspace+admin)
  * POST /api/auth/login (session cookie)
  * POST /api/spaces/create
  * POST /api/pages/create
  * POST /api/shares/create
- docmost/setup/requirements.txt : requests + PyYAML
- Makefile : target seed-docmost
- README updated : explique option A (manuel) vs option B (seed automatise)

Endpoints non-officiels mais utilisables sur Community Edition AGPL.
Risque : maintenance possible si Docmost upgrade modifie les internals.
Aligne avec strategie bridge Phase 2 (doc 19).
2026-05-07 18:22:47 +02:00
5d029771a0 feat(docmost): manual setup guide for iteration 3 BUILD
Some checks are pending
CI / Type-check bridge (push) Blocked by required conditions
CI / Lint bridge (Biome) (push) Waiting to run
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- docmost/setup/README.md : quickstart 10 min (admin + 3 spaces + page test + share)
- docmost/setup/spaces.yaml : schema declaratif (reference future si API Community s'ouvre)
- Makefile : target setup-docmost-guide (rappel des etapes)

API publique Docmost = Enterprise payante (cf docmost.com/docs/user-guide/api).
Setup manuel UI obligatoire pour Community Edition AGPL — rapide (10 min) et stable.

Iteration 3 du plan Fast-App couverte (stories S-01, S-07, S-08).
Couvre les UC : UCW01 gerer wiki + droits, UCW02 inviter client par lien
partage, UCW03 creer space etudiant.
2026-05-07 18:17:45 +02:00
a0266b886c feat(baserow): add formulas pass + related field naming to seed
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- schema.json : 17 formulas (rollups + heures_restantes) ajoutees + related_field_name explicite sur les 10 liens
- seed.py : 3 nouveaux methodes (create_formula_field, rename_field, create_link_field returns dict)
- seed.py : pass 5/6 renomme automatiquement les related fields apres link creation
- seed.py : pass 6/6 cree les formulas (idempotent)
- README.md : section formulas updated

Iteration 2 du plan Fast-App couverte. Apres seed, les rollups
(formation_heures_attribuees, personne_heures_restantes_total, etc.)
sont automatiques.
2026-05-07 18:15:21 +02:00
6724be6c85 feat(baserow): add seed script + Fast-App iteration 1 artifacts
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- baserow/seed/schema.json : 9 tables declaratif (personne + CFA + Agence)
- baserow/seed/seed.py : Python script idempotent (login + workspace + db + tables + fields + links)
- baserow/seed/requirements.txt : requests
- baserow/seed/README.md : quickstart 4 etapes
- Makefile target seed-baserow

Fast-App workflow local :
- _byan-output/fast-app/formation-hub/ : 6 artifacts (pitch, backlog, cdcf-stories, plan, dispatch, build-state)
- Phase 0 mappee : phases 1-6 done depuis docs Merise/UML existants
- Iteration 1 BUILD = setup tables Baserow vanilla (S-02 + S-03 + S-04)

Stack locale up et healthy. Pret pour seed apres creation compte admin Baserow.
2026-05-07 17:37:55 +02:00
ecb7a44c3c ops(infra): add Forgejo Actions Runner skeleton
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- infra/forgejo-runner/compose.yml : runner v6.5.0 avec auto-register
- infra/forgejo-runner/.env.example : variables registration
- infra/forgejo-runner/README.md : setup + usage + securite + troubleshooting
- infra/README.md : index

Le runner est OPTIONNEL et a deployer separement quand on veut activer le CI
sur git.acadenice.com. Tant que pas deploye, les workflows GitHub Actions
restent actifs sur github.com/AcadeNice/wiki (mirror).
2026-05-07 13:49:19 +02:00
d8e8bdefe5 ops(ci): fix docker-build job — setup .env BEFORE compose build
Some checks are pending
CI / Lint bridge (Biome) (push) Waiting to run
CI / Type-check bridge (push) Blocked by required conditions
CI / Tests unit bridge (push) Blocked by required conditions
CI / Tests integration bridge (push) Blocked by required conditions
CI / Security scan (push) Waiting to run
CI / Docker build + healthcheck (push) Blocked by required conditions
- cp .env.example .env en step 1 (compose interpole les vars au build)
- Add `compose config` validation step
- Bump sleep 30 -> 60s (Docmost boot prend 45-60s sur runner)
- Bump logs --tail=200 (200 lignes au lieu de tout)
2026-05-07 12:29:35 +02:00
66ff9097a6 ops(ci): add vitest config + sanity tests stub
- bridge/vitest.config.ts : config + coverage v8 + passWithNoTests
- bridge/tests/unit/sanity.test.ts : stub (real tests Phase 2)
- bridge/tests/integration/sanity.test.ts : stub
- Remove tests/.gitkeep
2026-05-07 12:25:00 +02:00
991d172f69 ops(ci): trigger CI on main pushes + disable auto deploy-staging Phase 0
- CI runs on push to main + develop + PR (was: ignore main → never ran on main)
- Deploy staging : workflow_dispatch only (re-activer push trigger quand
  secrets STAGING_HOST/USER/SSH_KEY configures cote GitHub)

Effet : push suivant trigger un CI complet et verifie que la stack passe les
gates avant tout deploy.
2026-05-07 12:21:59 +02:00
d510bddc34 ops: fix CI run — generate package-lock + bump testcontainers + doc 19 sync bidirec
- Add bridge/package-lock.json (npm install) — fix setup-node@v4 cache fail
- Bump testcontainers 10.x -> 11.14.0 (fix high CVE undici)
- Apply Biome formatter on src/index.ts + src/lib/config.ts
- Update doc 19 Bridge API design :
  * Add 5th mission : sync bidirectionnel Docmost <-> Baserow
  * Add endpoints /docmost/* write + /sync/* orchestration
  * Add section MCP server (Phase 3+) with tools/resources/prompts
  * Add anti-loop strategy (X-Bridge-Origin + idempotence Redis)
2026-05-07 12:20:44 +02:00
668576cdc4 chore: initial commit — formation-hub conception phase
Conception complete (Phase 0) pour formation-hub Acadenice :

- 19 docs Merise Agile + UML + GitOps + plans (tests/deploy/ops/api)
  cf docs/00-readme.md pour l'index complet
- Stack Docker compose (Docmost + Baserow + Postgres + Redis + MinIO local FS)
  compose.yml + compose.staging.yml + compose.prod.yml
- CI/CD GitHub Actions skeleton (ci, deploy-staging, deploy-prod)
- Bridge service skeleton (Hono + TS + Biome + Vitest + zod + pino)
- Templates GitHub : PR + 3 issue types + CODEOWNERS + dependabot.yml
- Scripts ops : healthcheck, backup quotidien, smoke-test post-deploy
- LICENSE AGPL-3.0 + SECURITY.md + CONTRIBUTING.md + CHANGELOG.md
- Diagramme drawIO archi infra (XML importable dans diagrams.net)

Decisions structurelles enregistrees :
- Scope CFA + Agence avec entite PERSONNE pivot multi-roles (ADR-001)
- Stack composite Docmost AGPL + Baserow MIT + bridge custom (ADR-001)
- Path B : UX quasi-unified via Tiptap node-views custom (ADR-002)
- Monorepo trunk-based development (ADR-003)
- Postgres separe Docmost/Baserow (ADR-004)
- Bridge stack Node 22 + Hono (ADR-005)
- Repo neuf prefere a fork Docmost
- Prod-like des le jour 1 (pas MVP)
2026-05-07 12:16:19 +02:00