From 49de4eea209519671956b947f78911d0d37e9279 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Wed, 13 May 2026 22:59:34 +0200 Subject: [PATCH] docs(multisite): remove enso line references and tighten SSH/read-only guidance Update ia_dev agent playbooks and kogus docs to reflect two-line multisite (lecoffreio/genealogie), enforce SSH execution requirements in analyse mode, and refresh deployment/multisite documentation links. --- .smartIde/agents/analyse.md | 11 ++++-- .smartIde/agents/change-to-all-branches.md | 2 +- .smartIde/agents/deploy-by-script.md | 2 +- .smartIde/agents/deploy-pprod-enso.md | 10 ----- .smartIde/agents/deploy-pprod-or-prod-site.md | 2 +- .smartIde/agents/deploy-pprod-or-prod.md | 2 +- .smartIde/agents/deploy-prod-enso.md | 10 ----- .smartIde/agents/deploy-test-enso.md | 10 ----- .smartIde/agents/deploy-test-site.md | 4 +- .smartIde/agents/setup-host.md | 2 +- projects/kogus/docs/Code-Standards.md | 37 ++++++++++++++++++- projects/kogus/docs/Deployment.md | 4 +- 12 files changed, 52 insertions(+), 44 deletions(-) delete mode 100644 .smartIde/agents/deploy-pprod-enso.md delete mode 100644 .smartIde/agents/deploy-prod-enso.md delete mode 100644 .smartIde/agents/deploy-test-enso.md diff --git a/.smartIde/agents/analyse.md b/.smartIde/agents/analyse.md index 54734ab..541dbcc 100644 --- a/.smartIde/agents/analyse.md +++ b/.smartIde/agents/analyse.md @@ -1,11 +1,16 @@ --- name: analyse -description: Analyse pré-correctif (lecture seule) — inventaire métier, SSH + logs + BDD RO, hypothèses, recommandations sans contournement. Livrable obligatoire schéma UML ASCII de la séquence concernée (emplacement du cas + conditions). +description: Analyse pré-correctif (lecture seule dépôt + BDD) — inventaire métier, exécution réelle SSH + logs + BDD RO, hypothèses, recommandations sans contournement. Livrable obligatoire schéma UML ASCII. readonly dépôt ; la lecture seule ne dispense pas SSH §1 bis. model: inherit is_background: false readonly: true --- +## SSH / réseau — exécution réelle obligatoire + +- **`readonly: true`** : pas de commit, pas de patch applicatif, pas d’UPDATE/DELETE BDD. **Ne bloque pas** SSH ni les scripts RO distants : l’agent **lance** `read-backend-logs.sh`, `user-profil-env.sh`, autres scripts RO, chaîne SSH du dépôt LeCoffre. **Interdit** d’omettre §1 bis en prétextant « readonly », « mode Ask » ou « lecture seule » quand l’environnement a accès SSH (clés habituelles). +- Échec réseau **documenté** (sortie commande) → audit incomplet ; absence d’exécution sans preuve d’indisponibilité → livrable **non conforme** au mandat analyse. + ## Règle d’alignement avec LeCoffre La procédure détaillée (registre chemins, SSH, scripts, §1 bis exécutions réelles) est **canonique** dans le dépôt applicatif : @@ -35,6 +40,6 @@ Remontée **purement infrastructure** : mini diagramme d’activité « investig **`LECOFFRE_REPO/docs/features/login-and-email-helpers-structure.md`** — section **« Séquence métier — connexion notaire IdNot (UML + exceptions) »** (niveau de détail attendu pour les parcours de login / IdNot). -## Lecture seule +## Lecture seule (périmètre dépôt + données en écriture) -Pas de modification applicative, pas de commit, pas de déploiement dans ce run. Enchaînement : **`/fix`** ou **`/evol`** après validation humaine. +Pas de modification applicative, pas de commit, pas de déploiement dans ce run. **Exécuter** malgré tout SSH + logs + scripts RO (§1 bis LeCoffre). Enchaînement : **`/fix`** ou **`/evol`** après validation humaine. diff --git a/.smartIde/agents/change-to-all-branches.md b/.smartIde/agents/change-to-all-branches.md index 0702c09..6d80e3f 100644 --- a/.smartIde/agents/change-to-all-branches.md +++ b/.smartIde/agents/change-to-all-branches.md @@ -48,7 +48,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp **Documentation** : La doc des projets gérés est dans **`projects//docs`** ; la doc ia_dev est dans **`projects/ia_dev/docs`**. -**Rôle de l’agent :** vérifier que la branche locale est test (sinon retour 1), fournir le message de commit (via /push-by-script), lancer le script, contrôler la sortie et le code de retour. **Rôle du script :** exécution déterministe (vérif branche test, `branch-align.sh test`, puis sauf **`--align-only`** : **`orchestrator.sh test --no-sync-origin`** ou, à défaut, **`bash deploy/scripts_v2/deploy-multisite-lines.sh test --no-sync-origin`** — **toujours les trois lignes** lecoffreio / enso / genealogie lorsque le dépôt expose **`deploy-multisite-lines.sh`** ; repli historique **`deploy.sh test`** uniquement si ce script est absent). Flags métier via **`$SECRETS_BASE//test/deploy.conf`** (par ligne) ; journalisation **`./logs/deploy_*.log`**. Préparation OS : **`/setup-host`** + **`run-setup-host.sh`**, pas confondre avec le déploiement applicatif. +**Rôle de l’agent :** vérifier que la branche locale est test (sinon retour 1), fournir le message de commit (via /push-by-script), lancer le script, contrôler la sortie et le code de retour. **Rôle du script :** exécution déterministe (vérif branche test, `branch-align.sh test`, puis sauf **`--align-only`** : **`orchestrator.sh test --no-sync-origin`** ou, à défaut, **`bash deploy/scripts_v2/deploy-multisite-lines.sh test --no-sync-origin`** — **toujours les deux lignes** lecoffreio / genealogie lorsque le dépôt expose **`deploy-multisite-lines.sh`** ; repli historique **`deploy.sh test`** uniquement si ce script est absent). Flags métier via **`$SECRETS_BASE//test/deploy.conf`** (par ligne) ; journalisation **`./logs/deploy_*.log`**. Préparation OS : **`/setup-host`** + **`run-setup-host.sh`**, pas confondre avec le déploiement applicatif. **Projet kogus (monorepo LeCoffre) :** si le script enchaîne **`deploy/scripts_v2`**, appliquer le contrat multisite (**`SITE_CODE`** / **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**, secrets **`.secrets///`**) décrit dans **`repository_root/docs/features/multi-site-architecture.md`** et **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis (les agents Cursor du dépôt applicatif sont sous **`.cursor/agents/`**, pas **`.smartIde`**). diff --git a/.smartIde/agents/deploy-by-script.md b/.smartIde/agents/deploy-by-script.md index 2ddc8c0..6792f55 100644 --- a/.smartIde/agents/deploy-by-script.md +++ b/.smartIde/agents/deploy-by-script.md @@ -42,7 +42,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp ## Multisite — projet **kogus** (site produit `lecoffreio` = ligne notaire) -Lorsque le playbook appelle **`repository_root/deploy/scripts_v2/`**, respecter la boucle **`SITE_CODE`** (**`lecoffreio`**, **`enso`**, **`genealogie`**) ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`** ; **`deploy-by-script-to`** ne positionne pas **`SITE_CODE`**. Secrets : **`.secrets///`**. Source normative : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; § **Multisite** dans **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`**. **Une seule ligne** : **neuf agents** (site × env) — **`deploy-test-lecoffreio`**, **`deploy-test-enso`**, **`deploy-test-genealogie`**, **`deploy-pprod-lecoffreio`**, **`deploy-pprod-enso`**, **`deploy-pprod-genealogie`**, **`deploy-prod-lecoffreio`**, **`deploy-prod-enso`**, **`deploy-prod-genealogie`** (fichiers **`.smartIde/agents/deploy-*.md`**, playbook canonique sous **`LECOFFRE_REPO/.cursor/agents/`**). **Repli paramétrique** : **`deploy-test-site.md`** (**`deploy-site.sh test `**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh `**, sans **`deploy-by-script-to`**). +Lorsque le playbook appelle **`repository_root/deploy/scripts_v2/`**, respecter la boucle **`SITE_CODE`** (**`lecoffreio`**, **`genealogie`**) ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`** ; **`deploy-by-script-to`** ne positionne pas **`SITE_CODE`**. Secrets : **`.secrets///`**. Source normative : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; § **Multisite** dans **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`**. **Une seule ligne** : **six agents** (site × env) — **`deploy-test-lecoffreio`**, **`deploy-test-genealogie`**, **`deploy-pprod-lecoffreio`**, **`deploy-pprod-genealogie`**, **`deploy-prod-lecoffreio`**, **`deploy-prod-genealogie`** (fichiers **`.smartIde/agents/deploy-*.md`**, playbook canonique sous **`LECOFFRE_REPO/.cursor/agents/`**). **Repli paramétrique** : **`deploy-test-site.md`** (**`deploy-site.sh test `**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh `**, sans **`deploy-by-script-to`**). Cet agent lance le déploiement vers l’**environnement passé au script** (ex. `./deploy/deploy-by-script-to.sh test|pprod|prod`) via **scripts_v2**. **Si `deploy.host_stays_on_test` est absent ou false :** en pratique la branche locale du dépôt applicatif correspond souvent à l’env cible pour **pprod**/**prod**. **Rôle de l’agent :** vérifier le contexte (si **`host_stays_on_test`** : branche locale = **test** ; sinon : cohérence branche / env selon le projet), lancer le script, contrôler la sortie et le code de retour, synthèse et clôture. **Rôle du script :** exécution et orchestration sûre (suivi branches, sync, log, déploiement). diff --git a/.smartIde/agents/deploy-pprod-enso.md b/.smartIde/agents/deploy-pprod-enso.md deleted file mode 100644 index 5b433a3..0000000 --- a/.smartIde/agents/deploy-pprod-enso.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: deploy-pprod-enso -description: Déploiement **pprod** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-pprod-enso.md`**. Projet **kogus**. -model: inherit -is_background: false ---- - -## Source normative - -**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-pprod-enso.md`** — align puis **`deploy-site.sh pprod enso`**. diff --git a/.smartIde/agents/deploy-pprod-or-prod-site.md b/.smartIde/agents/deploy-pprod-or-prod-site.md index adad71b..387b2e2 100644 --- a/.smartIde/agents/deploy-pprod-or-prod-site.md +++ b/.smartIde/agents/deploy-pprod-or-prod-site.md @@ -12,7 +12,7 @@ is_background: false ## Rappel opérationnel 1. Racine **`IADEV_REPO`** : `./deploy/change-to-all-branches.sh kogus --align-only` (prérequis **`origin/test`** à jour — push hors agent). -2. **`LECOFFRE_REPO`** : `bash deploy/scripts_v2/deploy-site.sh ` [options]. +2. **`LECOFFRE_REPO`** : `bash deploy/scripts_v2/deploy-site.sh ` [options]. ## Référence flux trois lignes (pprod/prod) diff --git a/.smartIde/agents/deploy-pprod-or-prod.md b/.smartIde/agents/deploy-pprod-or-prod.md index d24cb77..6f19dc7 100644 --- a/.smartIde/agents/deploy-pprod-or-prod.md +++ b/.smartIde/agents/deploy-pprod-or-prod.md @@ -82,7 +82,7 @@ Cocher explicitement : **« Ordre anti-duplication : respecté (pas d’agent `/ ## Multisite — projet **kogus** (monorepo LeCoffre ; code produit site `lecoffreio` inchangé) -Quand **`repository_root`** est le monorepo LeCoffre et **`deploy-by-script-to`** enchaîne **`deploy/scripts_v2/`**, l’orchestration doit couvrir **`notary`**, **`enso`**, **`genealogie`** (**`SITE_CODE`** ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**) ; **`deploy-by-script-to`** ne définit pas **`SITE_CODE`**. Secrets : **`.secrets///`**. Doc : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`** § Multisite. +Quand **`repository_root`** est le monorepo LeCoffre et **`deploy-by-script-to`** enchaîne **`deploy/scripts_v2/`**, l’orchestration doit couvrir **`lecoffreio`** et **`genealogie`** (**`SITE_CODE`** ou **`deploy-site.sh`** / **`deploy-multisite-lines.sh`**) ; **`deploy-by-script-to`** ne définit pas **`SITE_CODE`**. Secrets : **`.secrets///`**. Doc : **`repository_root/docs/features/multi-site-architecture.md`** ; **`repository_root/.cursor/agents/agent-paths-registry.md`** §3 bis ; **`repository_root/.cursor/agents/deploy-pprod-or-prod.md`** § Multisite. ## Workflow obligatoire diff --git a/.smartIde/agents/deploy-prod-enso.md b/.smartIde/agents/deploy-prod-enso.md deleted file mode 100644 index 0e650e7..0000000 --- a/.smartIde/agents/deploy-prod-enso.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: deploy-prod-enso -description: Déploiement **prod** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-prod-enso.md`**. Projet **kogus**. -model: inherit -is_background: false ---- - -## Source normative - -**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-prod-enso.md`** — align puis **`deploy-site.sh prod enso`**. diff --git a/.smartIde/agents/deploy-test-enso.md b/.smartIde/agents/deploy-test-enso.md deleted file mode 100644 index 937b4ef..0000000 --- a/.smartIde/agents/deploy-test-enso.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: deploy-test-enso -description: Déploiement LeCoffre **test** ligne **enso** — playbook **`LECOFFRE_REPO/.cursor/agents/deploy-test-enso.md`**. Projet **kogus**. -model: inherit -is_background: false ---- - -## Source normative - -**`/home/desk/code/lecoffre_ng_test/.cursor/agents/deploy-test-enso.md`** — **`deploy-site.sh test enso`** depuis **`LECOFFRE_REPO`**. diff --git a/.smartIde/agents/deploy-test-site.md b/.smartIde/agents/deploy-test-site.md index 1ee1bf6..19705b9 100644 --- a/.smartIde/agents/deploy-test-site.md +++ b/.smartIde/agents/deploy-test-site.md @@ -1,6 +1,6 @@ --- name: deploy-test-site -description: Déploiement LeCoffre **test** pour **une ligne** (`lecoffreio` \| `enso` \| `genealogie`) via `deploy-site.sh` depuis le clone applicatif — une tentative par run ; prérequis alignés sur `deploy-test-by-script`. Exécution depuis `IADEV_REPO` ou `LECOFFRE_REPO` selon le prompt. +description: Déploiement LeCoffre **test** pour **une ligne** (`lecoffreio` \| `genealogie`) via `deploy-site.sh` depuis le clone applicatif — une tentative par run ; prérequis alignés sur `deploy-test-by-script`. Exécution depuis `IADEV_REPO` ou `LECOFFRE_REPO` selon le prompt. model: inherit is_background: false --- @@ -12,7 +12,7 @@ is_background: false ## Rappel opérationnel - **Répertoire** : `cd "$(jq -r '.deploy.repository_root' projects/kogus/conf.json)"` (souvent **`/home/desk/code/lecoffre_ng_test`**). -- **Commande** : `bash deploy/scripts_v2/deploy-site.sh test ` [options `deploy.sh`]. +- **Commande** : `bash deploy/scripts_v2/deploy-site.sh test ` [options `deploy.sh`]. - **Projet ia_dev** : **`kogus`** (injection systématique aux scripts **`change-to-all-branches`**, **`pousse.sh`**, etc., comme les autres agents déploiement). ## Référence multisite trois lignes (test) diff --git a/.smartIde/agents/setup-host.md b/.smartIde/agents/setup-host.md index 0fbda44..4c33ae2 100644 --- a/.smartIde/agents/setup-host.md +++ b/.smartIde/agents/setup-host.md @@ -23,7 +23,7 @@ is_background: false 4. **Invocation** : depuis la racine du dépôt projet (`cd "$(jq -r '.deploy.repository_root' conf.json)"` ou équivalent) : - `bash deploy/scripts_v2/run-setup-host.sh ` - L’environnement doit être passé explicitement (pas de valeur par défaut métier). -5. **Secrets** : **`run-setup-host.sh`** résout le répertoire d’env via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets///`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; s’assurer que **`SITE_CODE`** ou les trois branches **`lecoffreio`**, **`enso`**, **`genealogie`** sont peuplées selon le projet — voir **`repository_root/docs/features/multi-site-architecture.md`** pour le projet **kogus** (monorepo LeCoffre). +5. **Secrets** : **`run-setup-host.sh`** résout le répertoire d’env via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets///`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; s’assurer que **`SITE_CODE`** ou les branches **`lecoffreio`**, **`genealogie`** sont peuplées selon le projet — voir **`repository_root/docs/features/multi-site-architecture.md`** pour le projet **kogus** (monorepo LeCoffre). 6. **Sortie** : ne pas masquer stdout/stderr ; en échec, relire les messages sudo / SSH. 7. **Clôture** : appliquer `.smartIde/rules/cloture-evolution.mdc` en fin d’exécution agent (horodatage, questions 3–11 selon périmètre touché). diff --git a/projects/kogus/docs/Code-Standards.md b/projects/kogus/docs/Code-Standards.md index 0b7460d..db79ec5 100644 --- a/projects/kogus/docs/Code-Standards.md +++ b/projects/kogus/docs/Code-Standards.md @@ -5,13 +5,46 @@ ## Architecture front — URL API notaire - Tout nouvel appel HTTP, flux SSE, refresh token ou URL backend dérivée pour l’API notaire doit passer par **`getBaseUrl()`** (`front-common/src/front/Api/helpers/configHelpers.ts`) ou **`baseApi.getBaseUrl()`** sur un service **`BaseApiService`**, pas par concaténation manuelle de **`BACK_API_*`** ni par composition d’URL à partir de **`process.env.NEXT_PUBLIC_BACK_API_*`** en dehors des chemins bootstrap / runtime déjà documentés. + +- **Navigation notaire — contexte « Dossiers invités »** : toute évolution du basculement office / invité ou du retour depuis les écrans document doit tenir compte de **`notaryInvitedFoldersNavPersistence.ts`** (**`sessionStorage`**, **`pathnameEligibleForPersistedInvitedNav`**) et des consommateurs **`folderContextViewFlags`**, **`viewDocumentsBackUrlCompute`**, **`ActiveOfficeStore.reset`** — détail comportement et chemins dans **`docs/Frontend.md`** (section *Persistance du contexte « Dossiers invités »*). + +### Next.js — `PublicSiteConfigProvider` et prerender (SSG) + +- Tout hook qui appelle **`usePublicSiteConfigContext`** (y compris **`useApplyPublicSiteTheme`**) doit vivre **sous** **`PublicSiteConfigProvider`** dans **`front-common/src/pages/_app.tsx`**. Les hooks du shell parent (**`AppShell`**, ex. **`useAppFrontendBootstrap`**) restent limités au bootstrap env / session : pas de contexte site public à cet niveau. +- Pattern retenu : composant **`PublicSiteThemeEffect`** (enfant du provider) qui appelle **`useApplyPublicSiteTheme`** — voir **`docs/Frontend.md`** § *Config site public* et **`docs/Operations.md`** § *Next.js — prerender / SSG*. - Préférer le hook **`useApiClient`** et le catalogue **`apiV1Paths`** pour les segments sous **`/api/v1`** ; exposer **`baseUrl`** du hook plutôt que **`protocol` + `host`** isolés. - Politique **`process.env`**, liste des fichiers autorisés et commandes de contrôle : **`docs/Operations.md`** § *Front — URL API : centralisation sur getBaseUrl()*. - Détail produit (réécriture d’hôte, **`invalidateBaseUrl()`**, anti-patterns) : **`docs/Frontend.md`** § *Base URL backend (API notaire)*. -## `front-backoffice` — typage i18n +## Multisite back-end — résolution de déploiement vs options `sites` -- Pour le code sous **`front-backoffice/src/`** qui appelle **`t("…")`** avec des clés du catalogue **`src/i18n/messages.*.ts`**, typer l’argument **`t`** avec **`TranslateFn`** depuis **`@/i18n`** (alias vers **`src/i18n`**) dans les helpers et modules extraits — aligné avec les écrans case / document du monorepo **`lecoffre_ng_test`** ; détail : **`docs/Frontend.md`** § *I18n — périmètres*. +- **Routage** : lorsque le même binaire sert plusieurs hôtes publics, **`getEffectiveDeploymentSiteCode`** / ALS (`back-common/src/common/request/deploymentSiteContext.ts`) rattachent la requête à la **ligne `sites` effective** et aux enregistrements **`site_code`** concernés — aligné sur **`GET /v1/public/site-config`**. +- **Logique métier** : le code applicatif doit rester **agnostique des noms de site** (`lecoffreio`, `genealogie`). Il se pilote sur les **options activées** (**`integration_flags`**, contenu de **`theme_json`**, etc.) pour cette ligne, pas sur des branchements métier par libellé de ligne. Exceptions : couches **Host** / chemins secrets, **migrations** ou **seeds** SQL par partition documentés, **scripts shell** avec **`SITE_CODE`**. +- **Référence** : **`docs/features/multi-site-architecture.md`** § *Backend HTTP partagé* / *Règle code métier*. + +## Déploiement Node — `deploy/scripts_v2/lib/` et PostgreSQL + +- **Fichiers qui ouvrent une `Pool` `pg`** : uniquement **`deploy/scripts_v2/lib/pgPoolFromConnectDb.mjs`** (résolution **DATABASE_URL** **kogus** / surcharge env, **`createVerifiedPgPool`**, **`createVerifiedPgPoolFromUrl`**, **`resolveDatabaseUrlForDeployScript`**), **`connectDbUrl.mjs`** (**`loadDatabaseUrlFromConnectDb`**, **`tryLoadDatabaseUrlFromConnectDbFile`**, **`nestedLineConnectDbPath`**, chemins connectDB), et **`exportMandatoryLineArtifactsFromDb.mjs`** (**SELECT** multi-**`site_code`** pour les exports JSON ligne). C’est le périmètre **pg** du dossier **`lib/`** ; pas d’autre **`.mjs`** y créer une pool pour l’instant. +- **Autres `*.mjs` sous `lib/`** (`nestedSecretsMaterialize`, `mergeInfosV2DatabaseFromSiteLineEnv`, `mandatoryLineArtifactsTemplates`, `nestedSecretsEnsureGaps`, `generateEnvFullFromInfos`, `merge-env-full-site-keys-cli`, `stripInfosV2CrossLineSecrets`, `parseEnvFileValue`, `loadPg`, `warnConnectDbLoopback`) : disque uniquement (gabarits, **`infos_v2`**, merge env-full, avertissements) — **pas** d’accès PostgreSQL. +- **Nouveau script Node** sous **`deploy/scripts_v2/`** (racine ou **`lib/`**) qui doit lire PostgreSQL : réutiliser **`resolveDatabaseUrlForDeployScript`**, **`nestedLineConnectDbPath`** / **`tryLoadDatabaseUrlFromConnectDbFile`**, et **`createVerifiedPgPoolFromUrl`** comme **`nested-secrets-tool.mjs`** (**`export-db-artifacts`**) — une pool par **`DATABASE_URL`** de ligne lorsque le connectDB **ligne** diffère du défaut **kogus** ; éviter une résolution d’URL dupliquée ou une seule pool implicite pour tout le multisite. +- **Couche shell distante** : hors **`lib/`**, l’accès BDD sur les cibles passe par **`load_connectdb_v2`**, **`SITE_CODE`**, **`resolve_connect_db_path_on_target`** (**`deploy/scripts_v2/remote/_lib.sh`**). Ne pas court-circuiter cette résolution pour du métier runtime. +- **Références** : **`docs/features/secrets-multisite-kogus-and-sites.md`** § *CLI `nested-secrets-tool.mjs`* et inventaire **`lib/`** ; **`docs/features/multi-site-architecture.md`**. + +## Déploiement shell — chemins cible (`APP_ROOT`) et multisite + +- **Chemin dépôt distant (orchestrateur)** : une seule fonction **`get_env_remote_app_root `** dans **`deploy/scripts_v2/_lib/env-map.sh`** (forme **`/srv/4NK/`** dérivée de **`get_env_domain_for_site`**). Les scripts sous **`deploy/scripts_v2/`** (hors **`remote/`** qui reçoivent déjà **``** en argument) ne doivent **pas** recalculer **`/srv/4NK/${DOMAIN}`** ou dupliquer la règle FQDN → disque. +- **FQDN public aligné sur `APP_ROOT`** : **`get_env_domain_for_site `** avec le **même** **`site`** (`lecoffreio` \| `genealogie`) que pour **`get_env_remote_app_root`**. +- **Contexte déploiement** : **`lcf_deploy_export_target_context`** (**`deploy/scripts_v2/_lib/deploy-target-context.sh`**) résout **`site`** une fois depuis **`SITE_CODE`** / **`LECOFFRE_SITE_CODE`** / **`DEPLOY_SITE_CODE`**, pose **`DOMAIN`** et **`APP_ROOT`** via ces deux fonctions, puis les ports systemd via **`get_env_*_port`** lorsque demandé — pas de second chemin pour **`APP_ROOT`**. +- **Outils sans boucle `for site`** : second argument explicite ; **`lcf_site_code_for_remote_app_root_or_lecoffreio`** (**`env-map.sh`**) lorsque le défaut **lecoffreio** ou un **`SITE_CODE`** exporté hors boucle suffit ; boucles multisite : passer **`site`** / **`SITE`** en clair. +- **Détail opérateur** (arbres **`.secrets/`**, **kogus**, sync connectDB sur les trois **`APP_ROOT`**, matrice post-déploiement, exceptions stockage) : **`docs/features/secrets-multisite-kogus-and-sites.md`** — ne pas y recopier la norme ci-dessus ; renvoyer ici pour toute nouvelle règle shell sur **`APP_ROOT`** / **`DOMAIN`**. + +## `front-backoffice` (cabinet) — `fetch` same-origin et `basePath` + +- **Route Handlers Next** (`src/app/api/**`, même déploiement que l’App Router) : tout **`fetch`** navigateur vers ces chemins doit passer par **`fetchUnderCurrentAppBase`** ou **`nextAppSameOriginUrl`** (`front-backoffice/src/lib/oauth.ts`), afin d’inclure le préfixe **`/backoffice`**. **Inventaire actuel du dépôt** : un seul appel — **`docvOAuthBrowser.ts`** → **`/api/auth/docv-token`**. Toute nouvelle route **`app/api/...`** consommée en **`fetch`** côté client doit réutiliser ce mécanisme. +- **API docv-back** : les chemins **`/api/v1/...`** passent par **`docvFetch`** et **`docvApiBase()`** (`front-backoffice/src/lib/docv/client.ts`, origine **`/docv-api`**). **Ne pas** les faire transiter par **`pathWithBase`** / **`fetchUnderCurrentAppBase`**. +- **Liens et redirections** : **`Link`**, **`redirect()`**, **`router.replace()`** avec chemins commençant par **`/`** restent sans préfixe manuel **`/backoffice`** ; Next applique **`basePath`** automatiquement. +- Détail déploiement et smoke réseau : **`docs/features/monorepo-backoffice-oauth-default.md`** § *`fetch` same-origin : Route Handlers Next vs API docv-back*. +- **Typage i18n** : pour le code sous **`front-backoffice/src/`** qui appelle **`t("…")`** avec des clés du catalogue **`src/i18n/messages.*.ts`**, typer l’argument **`t`** avec **`TranslateFn`** depuis **`@/i18n`** (alias vers **`src/i18n`**) dans les helpers et modules extraits — aligné avec les écrans case / document déjà refactorés. ## Lint backend (back-common) – refactors restants diff --git a/projects/kogus/docs/Deployment.md b/projects/kogus/docs/Deployment.md index d2bef20..49122b4 100644 --- a/projects/kogus/docs/Deployment.md +++ b/projects/kogus/docs/Deployment.md @@ -81,9 +81,9 @@ Liste des fichiers contenant les textes affichés à l’utilisateur (libellés, ## Déploiement applicatif -- **Multi-site (runbook)** : ordre **test** → préparation **pprod/prod**, migrations Prisma, smoke `site-config` — [`features/multi-site-deploy-runbook.md`](./features/multi-site-deploy-runbook.md). Snippet à intégrer à la page wiki **Deployment** : [`features/wiki-deployment-multisite-snippet.md`](./features/wiki-deployment-multisite-snippet.md). -- **Agents Cursor (une ligne × environnement)** : neuf fichiers dans le dépôt LeCoffre **`repository_root/.cursor/agents/`** — `deploy-test-lecoffreio`, `deploy-test-enso`, `deploy-test-genealogie`, `deploy-pprod-lecoffreio`, `deploy-pprod-enso`, `deploy-pprod-genealogie`, `deploy-prod-lecoffreio`, `deploy-prod-enso`, `deploy-prod-genealogie` ; miroirs courts sous **`ia_dev/.smartIde/agents/`**. Tableau et chemins absolus : **`LECOFFRE_REPO/.cursor/agents/agent-paths-registry.md`** §3 bis (voir aussi ce fichier dans le clone applicatif configuré par `projects/kogus/conf.json`). +- **Multi-site (runbook)** : ordre **test** → préparation **pprod/prod**, migrations Prisma, smoke `site-config` — [`features/multi-site-deploy-runbook.md`](./features/multi-site-deploy-runbook.md). Snippet wiki : [`features/wiki-deployment-multisite-snippet.md`](./features/wiki-deployment-multisite-snippet.md). **Checklist opérateur** : [`features/multisite-operator-master-checklist.md`](./features/multisite-operator-master-checklist.md). **Secrets / migration cible** : [`features/secrets-multisite-kogus-and-sites.md`](./features/secrets-multisite-kogus-and-sites.md). **Politique données** : [`features/multisite-data-policy-lecoffre-vs-ia-dev.md`](./features/multisite-data-policy-lecoffre-vs-ia-dev.md). - **Admin local (exports / imports secrets par site, sans déploiement)** : [`features/secrets-devai-kogus-sites-and-imports.md`](./features/secrets-devai-kogus-sites-and-imports.md) — couches dev_ai / kogus / site, API `back-admin`, UI `front-admin`, fichiers matrice et catalogues actes. +- **Automation git-issues / IMAP** : module **`automation/imap-bridge/imap_common.py`** ; gabarit **`automation/imap-bridge/imap-bridge.env.example`** ; secrets préférés **`.secrets/automation/git-issues/`** (non versionné). Copie depuis **`ia_dev`** avec backups horodatés : **`bash automation/imap-bridge/centralize-ia-dev-secrets.sh`** (`IADEV_ROOT` si besoin). Détails : **`automation/imap-bridge/README.md`**, **`automation/backups/README.md`**, doc **`ia_dev`** [`projects/ia_dev/docs/GIT_ISSUES_SCRIPTS_AGENTS.md`](../../ia_dev/projects/ia_dev/docs/GIT_ISSUES_SCRIPTS_AGENTS.md) (chemins résolus). - **Orchestration ia_dev** : depuis la racine du dépôt ia_dev, `./deploy/deploy.sh [options]` exporte `IA_PROJECT_ID` puis exécute `orchestrator.sh`. Celui-ci enchaîne les scripts listés dans `deploy.hooks.phases` du `conf.json` du projet (chemins relatifs à `repository_root`), ou exécute `deploy.deploy_script_path` si `phases` est vide. `run-project-hooks.sh` délègue à `orchestrator.sh` (compatibilité). Cadrage : `deploy/DEPLOY_ORCHESTRATION_IA_DEV.md`. - **Scripts** : `deploy/scripts_v2/` ; chemin projet dans ia_dev `projects/kogus/conf.json` (project_path, build_dirs, deploy.deploy_script_path, deploy.secrets_path). - **Clé SSH déploiement (`DEPLOY_SSH_KEY`)** : définie dans `.secrets///.env.` (layout imbriqué obligatoire pour le multisite ; migration depuis l’ancien plat : `SITE_CODE=lecoffreio bash deploy/scripts_v2/sites/lecoffreio/migrate-secrets-legacy-to-nested-lecoffreio.sh …>` ; gabarits locaux optionnels : `node deploy/scripts_v2/nested-secrets-tool.mjs materialize` — alias : `materialize-nested-secrets-mandatory.mjs`). Utiliser un chemin **portable** : par ex. `DEPLOY_SSH_KEY='$HOME/.ssh/id_ed25519_4nk'` (l’expansion de `$HOME`, `${HOME}` et un préfixe `~/` est appliquée par `lcf_deploy_resolve_deploy_ssh_key` après `load_dotenv_file_strict`, qui ne fait pas d’`eval`). Ne pas figer un autre compte système (`/home/desk/...`). Ordre de repli si la clé indiquée est absente : `$HOME/.ssh/id_ed25519_4nk`, puis `$HOME/.ssh/id_ed25519`. Avant toute connexion SSH, la clé retenue est validée avec `ssh-keygen -y`. Vérification réseau : `bash deploy/scripts_v2/run-verify-ssh.sh ` ou les trois d’un coup : `bash deploy/scripts_v2/run-verify-ssh-all-envs.sh`.