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.
This commit is contained in:
Nicolas Cantu 2026-05-13 22:59:34 +02:00
parent c77afdff4c
commit 49de4eea20
12 changed files with 52 additions and 44 deletions

View File

@ -1,11 +1,16 @@
--- ---
name: analyse 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 model: inherit
is_background: false is_background: false
readonly: true readonly: true
--- ---
## SSH / réseau — exécution réelle obligatoire
- **`readonly: true`** : pas de commit, pas de patch applicatif, pas dUPDATE/DELETE BDD. **Ne bloque pas** SSH ni les scripts RO distants : lagent **lance** `read-backend-logs.sh`, `user-profil-env.sh`, autres scripts RO, chaîne SSH du dépôt LeCoffre. **Interdit** domettre §1 bis en prétextant « readonly », « mode Ask » ou « lecture seule » quand lenvironnement a accès SSH (clés habituelles).
- Échec réseau **documenté** (sortie commande) → audit incomplet ; absence dexécution sans preuve dindisponibilité → livrable **non conforme** au mandat analyse.
## Règle dalignement avec LeCoffre ## Règle dalignement 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 : 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 dactivité « 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). **`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.

View File

@ -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/<id>/docs`** ; la doc ia_dev est dans **`projects/ia_dev/docs`**. **Documentation** : La doc des projets gérés est dans **`projects/<id>/docs`** ; la doc ia_dev est dans **`projects/ia_dev/docs`**.
**Rôle de lagent :** 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/<site>/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 lagent :** 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/<site>/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/<site>/<env>/`**) 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`**). **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/<site>/<env>/`**) 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`**).

View File

@ -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) ## 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/<site>/<env>/`**. 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 <site>`**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh <pprod|prod> <site>`**, 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/<site>/<env>/`**. 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 <site>`**), **`deploy-pprod-or-prod-site.md`** (align puis **`deploy-site.sh <pprod|prod> <site>`**, sans **`deploy-by-script-to`**).
Cet agent lance le déploiement vers l**environnement passé au script** (ex. `./deploy/deploy-by-script-to.sh <id> 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 à lenv cible pour **pprod**/**prod**. **Rôle de lagent :** 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). Cet agent lance le déploiement vers l**environnement passé au script** (ex. `./deploy/deploy-by-script-to.sh <id> 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 à lenv cible pour **pprod**/**prod**. **Rôle de lagent :** 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).

View File

@ -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`**.

View File

@ -12,7 +12,7 @@ is_background: false
## Rappel opérationnel ## Rappel opérationnel
1. Racine **`IADEV_REPO`** : `./deploy/change-to-all-branches.sh kogus --align-only` (prérequis **`origin/test`** à jour — push hors agent). 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 <pprod|prod> <lecoffreio|enso|genealogie>` [options]. 2. **`LECOFFRE_REPO`** : `bash deploy/scripts_v2/deploy-site.sh <pprod|prod> <lecoffreio|genealogie>` [options].
## Référence flux trois lignes (pprod/prod) ## Référence flux trois lignes (pprod/prod)

View File

@ -82,7 +82,7 @@ Cocher explicitement : **« Ordre anti-duplication : respecté (pas dagent `/
## Multisite — projet **kogus** (monorepo LeCoffre ; code produit site `lecoffreio` inchangé) ## 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/`**, lorchestration 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/<site>/<env>/`**. 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/`**, lorchestration 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/<site>/<env>/`**. 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 ## Workflow obligatoire

View File

@ -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`**.

View File

@ -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`**.

View File

@ -1,6 +1,6 @@
--- ---
name: deploy-test-site 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 model: inherit
is_background: false is_background: false
--- ---
@ -12,7 +12,7 @@ is_background: false
## Rappel opérationnel ## Rappel opérationnel
- **Répertoire** : `cd "$(jq -r '.deploy.repository_root' projects/kogus/conf.json)"` (souvent **`/home/desk/code/lecoffre_ng_test`**). - **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 <lecoffreio|enso|genealogie>` [options `deploy.sh`]. - **Commande** : `bash deploy/scripts_v2/deploy-site.sh test <lecoffreio|genealogie>` [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). - **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) ## Référence multisite trois lignes (test)

View File

@ -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) : 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 <test|pprod|prod>` - `bash deploy/scripts_v2/run-setup-host.sh <test|pprod|prod>`
- Lenvironnement doit être passé explicitement (pas de valeur par défaut métier). - Lenvironnement doit être passé explicitement (pas de valeur par défaut métier).
5. **Secrets** : **`run-setup-host.sh`** résout le répertoire denv via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets/<site>/<env>/`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; sassurer 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 denv via **`lecoffre_secrets_env_dir_for_read`** (layout **`.secrets/<site>/<env>/`** pour LeCoffre, comme **`deploy.sh`** / **`connect-db-paths.sh`**) ; sassurer 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. 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 dexécution agent (horodatage, questions 311 selon périmètre touché). 7. **Clôture** : appliquer `.smartIde/rules/cloture-evolution.mdc` en fin dexécution agent (horodatage, questions 311 selon périmètre touché).

View File

@ -5,13 +5,46 @@
## Architecture front — URL API notaire ## Architecture front — URL API notaire
- Tout nouvel appel HTTP, flux SSE, refresh token ou URL backend dérivée pour lAPI 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 dURL à partir de **`process.env.NEXT_PUBLIC_BACK_API_*`** en dehors des chemins bootstrap / runtime déjà documentés. - Tout nouvel appel HTTP, flux SSE, refresh token ou URL backend dérivée pour lAPI 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 dURL à 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. - 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()*. - 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 dhôte, **`invalidateBaseUrl()`**, anti-patterns) : **`docs/Frontend.md`** § *Base URL backend (API notaire)*. - Détail produit (réécriture dhô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 largument **`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). Cest le périmètre **pg** du dossier **`lib/`** ; pas dautre **`.mjs`** y créer une pool pour linstant.
- **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** daccè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 dURL dupliquée ou une seule pool implicite pour tout le multisite.
- **Couche shell distante** : hors **`lib/`**, laccè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 <env> <site>`** dans **`deploy/scripts_v2/_lib/env-map.sh`** (forme **`/srv/4NK/<fqdn>`** dérivée de **`get_env_domain_for_site`**). Les scripts sous **`deploy/scripts_v2/`** (hors **`remote/`** qui reçoivent déjà **`<app_root>`** 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 <env> <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 lApp Router) : tout **`fetch`** navigateur vers ces chemins doit passer par **`fetchUnderCurrentAppBase`** ou **`nextAppSameOriginUrl`** (`front-backoffice/src/lib/oauth.ts`), afin dinclure 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 largument **`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 ## Lint backend (back-common) refactors restants

View File

@ -81,9 +81,9 @@ Liste des fichiers contenant les textes affichés à lutilisateur (libellés,
## Déploiement applicatif ## 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). - **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).
- **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`).
- **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. - **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 <project_id> <env> [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`. - **Orchestration ia_dev** : depuis la racine du dépôt ia_dev, `./deploy/deploy.sh <project_id> <env> [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). - **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/<site_code>/<env>/.env.<env>` (layout imbriqué obligatoire pour le multisite ; migration depuis lancien plat : `SITE_CODE=lecoffreio bash deploy/scripts_v2/sites/lecoffreio/migrate-secrets-legacy-to-nested-lecoffreio.sh <env>…>` ; 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'` (lexpansion 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 <env>` ou les trois dun coup : `bash deploy/scripts_v2/run-verify-ssh-all-envs.sh`. - **Clé SSH déploiement (`DEPLOY_SSH_KEY`)** : définie dans `.secrets/<site_code>/<env>/.env.<env>` (layout imbriqué obligatoire pour le multisite ; migration depuis lancien plat : `SITE_CODE=lecoffreio bash deploy/scripts_v2/sites/lecoffreio/migrate-secrets-legacy-to-nested-lecoffreio.sh <env>…>` ; 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'` (lexpansion 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 <env>` ou les trois dun coup : `bash deploy/scripts_v2/run-verify-ssh-all-envs.sh`.