diff --git a/.smartIde/agents/deploy-pprod-or-prod.md b/.smartIde/agents/deploy-pprod-or-prod.md index f427f40..aca0b4d 100644 --- a/.smartIde/agents/deploy-pprod-or-prod.md +++ b/.smartIde/agents/deploy-pprod-or-prod.md @@ -1,6 +1,6 @@ --- name: deploy-pprod-or-prod -description: Déploie vers pprod ou prod en suivant le workflow change-to-all-branches, deploy-by-script-to, puis push-by-script. Toute correction issue d’une phase pprod/prod se fait sur test puis le workflow est rejoué depuis change-to-all-branches. Paramètre obligatoire pprod ou prod. +description: Déploie vers pprod ou prod : push-by-script, alignement branches (change-to-all-branches.sh --align-only, sans déploiement test), deploy-by-script-to, puis push-by-script. Toute correction issue d’une phase pprod/prod se fait sur test puis le workflow est rejoué depuis l’étape 2. Paramètre obligatoire pprod ou prod. model: inherit is_background: false --- @@ -37,13 +37,15 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp **Répertoire d'exécution (standalone) :** Racine de ia_dev. Tous les scripts sont invoqués depuis la racine de ia_dev. +**`repository_root` (LeCoffre) / branche `test` — pas de `git stash` :** ne pas utiliser **`git stash`** sur le clone applicatif pour « préparer » **`pousse.sh`** ou un déploiement — commit WIP + **`./deploy/pousse.sh`** (message sur stdin ; builds explicites avant push ou **`--build`** si compilation requise dans le même appel). Le stash crée des conflits (**`VERSION`**, fichiers non suivis) et duplique souvent un état déjà sur **`origin/test`**. + ## Corrections découvertes sur pprod ou prod (obligatoire) - **Contexte** : analyse des logs, échec de **`deploy-by-script-to`**, constat sur le dépôt applicatif alors que la branche locale est **pprod** ou **prod**, ou toute autre intervention qui amène à modifier code, configuration ou documentation du projet cible. - **Interdit** : appliquer la correction **uniquement** sur la branche **pprod** ou **prod** du dépôt applicatif (`repository_root` dans `projects//conf.json`) et poursuivre sans repasser par **test** (pas de « correctif local pprod/prod puis push ciblé » en dehors du flux test-first). - **Obligation** : - 1. **`git checkout test`** (ou équivalent validé projet) sur le **dépôt applicatif** ; y **réaliser** les corrections (commits selon règles du projet ; le premier push du cycle est en principe celui de l’**étape 2** via **`/change-to-all-branches`**). - 2. **Rejouer intégralement** le workflow **depuis l’étape 2** : **`/change-to-all-branches`** (push-by-script + `change-to-all-branches.sh`), puis **étape 3** **`deploy-by-script-to`** vers la cible **pprod** ou **prod**, puis **étapes 4 à 6** comme décrit ci-dessous. + 1. **`git checkout test`** (ou équivalent validé projet) sur le **dépôt applicatif** ; y **réaliser** les corrections (commits selon règles du projet ; le premier push du cycle est en principe celui de l’**étape 2** via **`/push-by-script`**). + 2. **Rejouer intégralement** le workflow **depuis l’étape 2** : **`/push-by-script`** puis **`./deploy/change-to-all-branches.sh [project_id] --align-only`**, puis **étape 3** **`deploy-by-script-to`** vers la cible **pprod** ou **prod**, puis **étapes 4 à 6** comme décrit ci-dessous. Pour un **déploiement test** complet après correctif, enchaîner l’agent **`/change-to-all-branches`** en flux **séparé**. - Si plusieurs cycles correction → alignement → déploiement sont nécessaires, **chaque** correction part toujours de **test** puis enchaîne **étape 2 → 6** jusqu’à succès ou blocage utilisateur. ## Ordre des agents et anti-duplication (obligatoire) @@ -52,23 +54,23 @@ Règles **décisionnelles** (ne pas lancer en double ce qu’un agent en aval ex | Action en amont | Condition | Application (tant que l’étape 2 ci-dessous existe dans ce fichier) | | --- | --- | --- | -| **`/push-by-script`** (branche **test**) | Lancer **avant** ce workflow **seulement si** **`/change-to-all-branches`** ne le lance **pas** aussi. | L’agent **`/change-to-all-branches`** exécute **`/push-by-script`** **avant** `./deploy/change-to-all-branches.sh` (voir `.smartIde/agents/change-to-all-branches.md`, checklist étape 5). Comme **`/deploy-pprod-or-prod`** appelle **`/change-to-all-branches`** à l’étape 2, **interdit** de lancer **`/push-by-script`** sur test **séparément avant** l’étape 2 de ce workflow. | -| **`/change-to-all-branches`** | Lancer **avant** ce workflow **seulement si** **`/deploy-pprod-or-prod`** (cible pprod ou prod) ne le lance **pas** aussi. | Ce fichier impose l’**étape 2** « Lancer **`/change-to-all-branches`** ». **Interdit** de lancer **`/change-to-all-branches`** **séparément avant** de commencer ce workflow (sauf **évolution documentée** de ce fichier **sans** étape 2 ; dans ce cas seulement, enchaîner manuellement dans l’ordre push → change-to-all-branches → suite). | +| **`/push-by-script`** (branche **test**) | Lancer **avant** ce workflow **seulement si** l’**étape 2** de ce fichier ne le lance **pas** aussi. | L’**étape 2** exécute **`/push-by-script`** **puis** `./deploy/change-to-all-branches.sh [project_id] --align-only`. **Interdit** de lancer **`/push-by-script`** sur test **séparément avant** l’étape 2 de ce workflow (évite la double exécution). | +| **Agent `/change-to-all-branches`** (déploiement **test** inclus) | Lancer **avant** ce workflow **seulement** pour un besoin explicite de **déploiement test** (flux séparé). | Ce fichier **n’invoque pas** l’agent **`/change-to-all-branches`** : l’étape 2 aligne les branches via **`change-to-all-branches.sh --align-only`** **sans** **`deploy.sh` test**. **Interdit** de lancer l’agent **`/change-to-all-branches`** juste avant ce workflow pour « pré-déployer test » dans le même objectif pprod/prod — utiliser **`/change-to-all-branches`** en session **dédiée** si le déploiement test est requis. | -**Si** une future version de ce fichier **supprime** l’étape 2 : réévaluer le tableau (alors **`/change-to-all-branches`** peut être requis en amont, et **`/push-by-script`** reste couvert **si** **`/change-to-all-branches`** est inchangé côté ia_dev). +**Si** une future version de ce fichier **supprime** l’étape 2 : réévaluer le tableau (alignement branches + push en amont manuel si besoin). ### Vérification obligatoire — début d’exécution Avant l’**étape 1** du workflow, **afficher et cocher** (dans la sortie de l’agent) : -1. **Anti-duplication `change-to-all-branches`** : je **n’ai pas** exécuté **`/change-to-all-branches`** complet en dehors de ce run **immédiatement avant** l’étape 2 (conforme : une seule exécution, celle de l’étape 2). -2. **Anti-duplication `push-by-script`** : je **n’ai pas** exécuté **`/push-by-script`** sur test **uniquement pour préparer** ce déploiement avant l’étape 2 (le premier push est celui inclus dans **`/change-to-all-branches`** à l’étape 2). +1. **Anti-duplication agent `change-to-all-branches`** : je **n’ai pas** enchaîné l’agent **`/change-to-all-branches`** (déploiement **test**) dans le même run **pour le même objectif** pprod/prod **avant** l’étape 2, sauf exigence utilisateur documentée (flux test dédié). +2. **Anti-duplication `push-by-script`** : je **n’ai pas** exécuté **`/push-by-script`** sur test **uniquement pour préparer** ce déploiement avant l’étape 2 (le premier push est celui de l’**étape 2**). -Si l’utilisateur ou un autre processus **a** déjà aligné / poussé : **le signaler** ; ne **pas** refaire **`/push-by-script`** ni **`/change-to-all-branches`** en amont par habitude — suivre quand même l’étape 2 (idempotence gérée par les scripts / l’agent change-to-all-branches). +Si l’utilisateur ou un autre processus **a** déjà aligné / poussé : **le signaler** ; ne **pas** refaire **`/push-by-script`** en amont par habitude — suivre quand même l’étape 2 (idempotence gérée par les scripts). ### Vérification obligatoire — fin d’agent (avant clôture) -Cocher explicitement : **« Ordre anti-duplication : respecté (pas de `/push-by-script` ni `/change-to-all-branches` standalone avant l’étape 2 hors ce workflow) »** — ou documenter l’exception si évolution du fichier sans étape 2. Cocher : **« Corrections pprod/prod : si applicable, faites sur test puis workflow rejoué depuis étape 2 (aucun correctif applicatif « seulement pprod/prod ») »**. Cocher aussi : **« Lint min. 5 : exécuté sur repository_root + décompte avant/après (ou 0 diagnostic) ; pas de report seul sur /fix-lint »**. +Cocher explicitement : **« Ordre anti-duplication : respecté (pas de `/push-by-script` standalone avant l’étape 2 hors ce workflow ; pas d’agent `/change-to-all-branches` complet en doublon pour le même objectif pprod/prod) »** — ou documenter l’exception. Cocher : **« Corrections pprod/prod : si applicable, faites sur test puis workflow rejoué depuis étape 2 (aucun correctif applicatif « seulement pprod/prod ») »**. Cocher aussi : **« Lint min. 5 : exécuté sur repository_root + décompte avant/après (ou 0 diagnostic) ; pas de report seul sur /fix-lint »**. ## Multisite — projet **kogus** (monorepo LeCoffre ; code produit site `lecoffreio` inchangé) @@ -78,16 +80,18 @@ Quand **`repository_root`** est le monorepo LeCoffre et **`deploy-by-script-to`* 1. **Vérifier la branche** : La machine doit être sur la branche **test** au démarrage. Si ce n'est pas le cas, indiquer à l'utilisateur de passer sur test (ou exécuter `git checkout test` depuis la racine projet) avant de continuer. -2. **Lancer /change-to-all-branches** (sur test) : - - Exécuter intégralement l'agent change-to-all-branches (commande /change-to-all-branches) : push-by-script puis `./deploy/change-to-all-branches.sh`. - - **Si KO :** Analyser la sortie et les logs (logs/deploy_*.log), identifier la cause. Toute correction sur le dépôt applicatif : **test** d’abord (voir section **Corrections découvertes sur pprod ou prod**), puis relancer **`/change-to-all-branches`** jusqu'à succès. +2. **Alignement branches sur test (sans déploiement test)** : + - Exécuter intégralement **`/push-by-script`** (message selon règles du projet ; stdin obligatoire en non interactif). + - Puis, depuis la racine ia_dev : **`./deploy/change-to-all-branches.sh [project_id] --align-only`** (équivalent **`branch-align.sh test`** après push ; **pas** d’appel **`deploy-lecoffre-all-sites.sh test`** / **`orchestrator.sh test`** dans cette étape). + - **Ne pas** invoquer l’agent **`/change-to-all-branches`** ici : cet agent enchaîne le déploiement **test** ; pour un déploiement test complet, flux séparé **`/change-to-all-branches`**. + - **Si KO :** Analyser la sortie (et **`logs/deploy_*.log`** si un outil amont les a alimentés). Toute correction sur le dépôt applicatif : **test** d’abord (voir section **Corrections découvertes sur pprod ou prod**), puis relancer l’**étape 2** jusqu'à succès. - **Si OK :** Passer à l'étape 3. 3. **Lancer le script deploy-by-script-to** avec l’environnement en paramètre (`pprod` ou `prod`) : - Le script est lancé depuis la racine de ia_dev. Avec project_id (optionnel), MAIL_TO ou AI_AGENT_TOKEN le dépôt cible est celui de la conf (deploy.secrets_path). Lancer : `./deploy/deploy-by-script-to.sh [project_id] `. - - **`deploy.host_stays_on_test: true`** dans `projects//conf.json` (LeCoffre : **true** dans `projects/kogus/conf.json`) : le clone applicatif reste sur **`test`** ; `deploy-by-script-to.sh` ne fait **pas** de `checkout` **pprod**/**prod** ni `reset --hard` sur ces branches ; le `deploy.sh` du dépôt aligne les remotes / **worktree** (voir **`deploy/README.md`** du dépôt applicatif). - - **Sinon :** le script fait en général : passage dans le dépôt du projet, `checkout` sur la branche paramètre, vérification que la base secrets attendue par le projet existe (**kogus** / monorepo LeCoffre : imbriquée **`.secrets///`**, voir **`repository_root/docs/features/multi-site-architecture.md`** — le seul plat **`.secrets//`** n’est pas le contrat nominal multisite), `reset --hard` sur **`origin/`**, déploiement (orchestrateur ou `deploy.sh`), puis **`checkout test`**. - - **Si KO :** Analyser la sortie et les logs, identifier la cause. **Ne pas** se limiter à corriger sur la branche **pprod**/**prod** : retour **test**, corrections, puis **rejouer depuis l’étape 2** (**`/change-to-all-branches`** puis **`deploy-by-script-to`**) jusqu'à succès (section **Corrections découvertes sur pprod ou prod**). + - **`deploy.host_stays_on_test: true`** dans `projects//conf.json` (LeCoffre : **true** dans `projects/kogus/conf.json`) : le clone applicatif reste sur **`test`** ; `deploy-by-script-to.sh` ne fait **pas** de `checkout` **pprod**/**prod** ni `reset --hard` sur ces branches ; le playbook **`deploy/scripts_v2`** aligne les remotes / **worktree** et enchaîne **les trois lignes** (**`orchestrator.sh`** ou **`deploy-lecoffre-all-sites.sh`**) — voir **`deploy/README.md`** du dépôt applicatif. + - **Sinon :** le script fait en général : passage dans le dépôt du projet, `checkout` sur la branche paramètre, vérification que la base secrets attendue par le projet existe (**kogus** / monorepo LeCoffre : imbriquée **`.secrets///`**, voir **`repository_root/docs/features/multi-site-architecture.md`** — le seul plat **`.secrets//`** n’est pas le contrat nominal multisite), `reset --hard` sur **`origin/`**, déploiement (**orchestrateur** ou **`deploy-lecoffre-all-sites.sh`** / repli **`deploy.sh`**), puis **`checkout test`**. + - **Si KO :** Analyser la sortie et les logs, identifier la cause. **Ne pas** se limiter à corriger sur la branche **pprod**/**prod** : retour **test**, corrections, puis **rejouer depuis l’étape 2** (**`/push-by-script`** + **`change-to-all-branches.sh --align-only`**, puis **`deploy-by-script-to`**) jusqu'à succès (section **Corrections découvertes sur pprod ou prod**). - **Si OK :** Passer à l'étape 4. 4. **Branche test après l’étape 3 :** si **`deploy.host_stays_on_test`**, le clone est déjà sur **`test`**. Sinon, le script a remis **`test`** : vérifier que la branche courante est **`test`**. diff --git a/.smartIde/agents/push-by-script.md b/.smartIde/agents/push-by-script.md index d7ce54e..d532397 100644 --- a/.smartIde/agents/push-by-script.md +++ b/.smartIde/agents/push-by-script.md @@ -1,6 +1,6 @@ --- name: push-by-script -description: Exécute le script de push deploy/pousse.sh pour stager, committer avec un message structuré et pousser. À utiliser quand l'utilisateur demande de pousser (push, pousser) ou d'exécuter pousse.sh une fois les changements prêts. +description: Exécute deploy/pousse.sh pour stager, committer et pousser. Le build n’est plus implicite dans pousse.sh : builds explicites avant l’appel ou option --build. À utiliser quand l’utilisateur demande de pousser (push, pousser) ou pousse.sh une fois les changements et la compilation vérifiés. model: inherit is_background: false --- @@ -16,7 +16,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp - Sous-agents : uniquement si nécessaire ; descriptions courtes ; éviter « explore » si grep/read/chemin connu suffit. - Réponses concises, sans répéter règles ou docs déjà référencées. -- **Lint (obligatoire avant clôture)** : Sur le dépôt applicatif du projet (`repository_root` et `build_dirs` dans `projects//conf.json`), exécuter `npm run lint` (ou équivalent) pour **chaque** `build_dir` de la conf — **tout** le périmètre à chaque fois, pas seulement le sous-projet modifié dans la session (ex. tâche front : lancer aussi le lint sur les autres `build_dirs`). Compter **erreurs + warnings**. Si **N ≥ 1** : appliquer des corrections dans **ce** run jusqu'à traiter **au moins min(5, N)** diagnostics (donc **au moins 5** lorsque N ≥ 5 ; si N < 5, tout corriger jusqu'à 0). **Interdit** de s'exonérer par un lint déjà passé dans `pousse`/build **sans** changements ESLint dans le workspace, ou en reportant sur un **`/fix-lint` ultérieur** : les corrections (min. 5 quand N ≥ 5) font partie **du même run** que la clôture. Clôture : commandes, périmètres, **décompte avant/après**. Voir `.smartIde/rules/cloture-lint.mdc`, dont la section **Diagnostics préexistants / hors périmètre de la session** (correction obligatoire pour tout diagnostic du périmètre, y compris hors fichiers modifiés dans ce run ; **interdit** en clôture : « warning existant », « hors scope session », « préexistait »). +- **Lint (obligatoire avant clôture)** : Sur le dépôt applicatif du projet (`repository_root` et `build_dirs` dans `projects//conf.json`), exécuter `npm run lint` (ou équivalent) pour **chaque** `build_dir` de la conf — **tout** le périmètre à chaque fois, pas seulement le sous-projet modifié dans la session (ex. tâche front : lancer aussi le lint sur les autres `build_dirs`). Compter **erreurs + warnings**. Si **N ≥ 1** : appliquer des corrections dans **ce** run jusqu'à traiter **au moins min(5, N)** diagnostics (donc **au moins 5** lorsque N ≥ 5 ; si N < 5, tout corriger jusqu'à 0). **Interdit** de s'exonérer par un lint déjà passé **sans** changements ESLint enregistrés dans le workspace, ou en reportant sur un **`/fix-lint` ultérieur** : les corrections (min. 5 quand N ≥ 5) font partie **du même run** que la clôture. Clôture : commandes, périmètres, **décompte avant/après**. Voir `.smartIde/rules/cloture-lint.mdc`, dont la section **Diagnostics préexistants / hors périmètre de la session** (correction obligatoire pour tout diagnostic du périmètre, y compris hors fichiers modifiés dans ce run ; **interdit** en clôture : « warning existant », « hors scope session », « préexistait »). # Agent push-by-script @@ -49,7 +49,7 @@ En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (imp ### Étape 1 — Lecture du script - Lire le fichier `deploy/pousse.sh` avec l'outil de lecture. -- Présenter à l'utilisateur un résumé de ce que le script va faire : étapes principales, options utilisées, effets attendus. +- Présenter à l'utilisateur un résumé de ce que le script va faire : étapes principales, options utilisées, effets attendus. **Par défaut** le script **ne lance pas** de build : uniquement **`git add -A`**, **`commit`**, **`push`** après lecture du message sur stdin ; le build n’intervient que si **`--build`** est passé. - Ne pas lancer le script avant d'avoir fait cette présentation. ### Étape 2 — Message de commit (toutes les sections obligatoires) @@ -83,9 +83,16 @@ Pas de validation du commit à demander à l'utilisateur ; si les infos ne sont - Mettre à jour le fichier `VERSION` en incrémentant la sous-sous-version (patch) : soit en appelant le script avec l'option **--bump-version** (recommandé), soit manuellement. Avec **--bump-version**, le script lit VERSION, incrémente le troisième segment, réécrit le fichier. Le message de commit doit mentionner la nouvelle version si pertinent. +### Étape 4 bis — Builds et compilation (obligatoire avant un push qui doit valider le monorepo) + +- **`pousse.sh` sans `--build`** ne compile pas. Avant l’**étape 5**, soit : + - **Builds manuels** dans le dépôt applicatif (`repository_root`, chemins depuis `projects//conf.json` **`build_dirs`**) : **`ressources-common`** et **`back-common`** → **`npm run build`** ; **`front-common`** → **`npm run build:all-sites`** (sauf ordre métier documenté contraire) ; puis **étape 5** avec **`pousse.sh` sans `--build`** ; + - **ou** un seul appel : **`./deploy/pousse.sh [project_id|--project ] --build [--bump-version] <<'MSG'`** … **`MSG`** sur stdin pour enchaîner builds (comme l’ancien script) puis add/commit/push. +- En cas d’échec de compilation : corriger, puis recommencer avant l’étape 5. + ### Étape 5 — Exécution du script -- Exécuter depuis la **racine de ia_dev** : `./deploy/pousse.sh [project_id|--project ] [--bump-version]` (ou avec --remote si l'utilisateur le précise), en passant le message complet sur STDIN (heredoc). Si project_id est omis, le projet est résolu par MAIL_TO ou AI_AGENT_TOKEN. Le script effectue la build check (chemins absolus depuis conf), puis add/commit/push. +- Exécuter depuis la **racine de ia_dev** : `./deploy/pousse.sh [project_id|--project ] [--bump-version] [--build]` (ou avec **--remote** si l'utilisateur le précise), en passant le message complet sur STDIN (heredoc). Si project_id est omis, le projet est résolu par MAIL_TO ou AI_AGENT_TOKEN. **Sans `--build`** : add/commit/push uniquement. **Avec `--build`** : même boucle de builds que l’ancien comportement (par **`build_dirs`**), puis add/commit/push. - **Ne pas masquer la sortie** du script (stdout/stderr visibles en entier). ### Étape 6 — Contrôle du résultat @@ -104,7 +111,7 @@ Pas de validation du commit à demander à l'utilisateur ; si les infos ne sont ## Qualité et résolution de problèmes -- **Qualité** : Le message de commit doit contenir toutes les sections obligatoires ; CHANGELOG.md doit être à jour. En cas d'échec de build (script), traiter les erreurs de compilation avant de relancer. +- **Qualité** : Le message de commit doit contenir toutes les sections obligatoires ; CHANGELOG.md doit être à jour. En cas d'échec de build (**`--build`** ou builds de l’étape 4 bis), traiter les erreurs de compilation avant de relancer. - **Résolution** : Si le script échoue, analyser la sortie pour identifier la cause, rapporter la cause et la résolution à apporter, appliquer les corrections puis relancer ; s'arrêter uniquement si la correction n'est pas possible sans instruction utilisateur. --- @@ -119,6 +126,7 @@ Avant d'appeler la clôture, remplir explicitement pour cet agent : - [ ] Étape 2 (message commit avec toutes les sections) : réalisé / non réalisé - [ ] Étape 3 (CHANGELOG.md mis à jour) : réalisé / non réalisé - [ ] Étape 4 (VERSION mise à jour) : réalisé / non réalisé +- [ ] Étape 4 bis (builds explicites ou `pousse.sh --build` avant push) : réalisé / non réalisé / N/A (push doc-only sans besoin de recompiler — le documenter explicitement) - [ ] Étape 5 (script exécuté, sortie non masquée) : réalisé / non réalisé - [ ] Étape 6 (contrôle résultat, corrections si échec) : réalisé / non réalisé - [ ] Étape 7 (contraintes respectées) : réalisé / non réalisé @@ -172,5 +180,5 @@ Pour chaque point, indiquer **réalisé** ou **non réalisé** et, le cas éché - **9. Renforcement sécurité** : Vérifier exposition de données sensibles, validation des entrées ; « Réalisées » ou « Non réalisées encore ». - **10. Code mort** : Vérifier code mort (exports inutilisés, branches mortes) ; « Réalisées » ou « Non réalisées encore ». - **11. Lint corrigé** : **Exécuter** `npm run lint` (ou la commande de lint du projet) dans **chaque** répertoire du périmètre (chaque build_dir : backend, frontend, ressources partagées). Comptabiliser **erreurs et warnings** dans la sortie. « Réalisées » **uniquement** si **0 erreur et 0 warning** pour ce périmètre. S'il reste des erreurs ou des warnings : « Non réalisées encore » en précisant le nombre d'erreurs et le nombre de warnings par répertoire (ex. « frontend : 0 erreur, 1004 warnings »). Ne jamais considérer le lint OK si des warnings restent ; les traiter ou les documenter dans le reste à faire. - - **Types et compilation** : l'**étape 5** (`./deploy/pousse.sh`, *build check*) exécute déjà le typecheck et les builds pour chaque `build_dir` du projet ainsi que les passes front (**`build:all-sites`** selon la conf). Si le script se termine avec **exit 0**, répondre **Réalisées** pour les contrôles **Types** et **Compilation** en s'appuyant sur cette sortie — **ne pas** enchaîner un `npm run typecheck` / `npm run build` complet sur le même arbre sans nouveau changement local. Si l'étape 5 est absente, en échec, ou arrêtée avant la fin du build check : **Non réalisées encore** (corriger puis relancer `pousse.sh`, ou documenter une exécution manuelle ciblée hors script). + - **Types et compilation** : répondre **Réalisées** si **(a)** l’**étape 4 bis** a exécuté avec succès les builds explicites sur chaque **`build_dir`**, **ou (b)** l’**étape 5** a utilisé **`./deploy/pousse.sh ... --build`** et le script s’est terminé avec **exit 0** (builds inclus dans ce run). Sinon **Non réalisées encore** (lancer **`pousse.sh --build`** ou les commandes **`npm run build`** / **`build:all-sites`** / **`typecheck`** requises par le projet, puis reclôturer). **`pousse.sh` sans `--build`** ne prouve pas la compilation. - **Format de réponse** : Pour chaque point, écrire soit « Réalisées : [précision courte] », soit « Non réalisées encore : [précision courte] ». Interdit de laisser un point sans réponse ou avec uniquement « N/A » sans justification (périmètre inexistant). diff --git a/.smartIde/rules/cloture-lint.mdc b/.smartIde/rules/cloture-lint.mdc index 617eaf4..ea8ca64 100644 --- a/.smartIde/rules/cloture-lint.mdc +++ b/.smartIde/rules/cloture-lint.mdc @@ -11,10 +11,10 @@ Complète le point **11. Lint corrigé obligatoirement** de `.smartIde/rules/clo Le lint obligatoire porte sur **chaque** entrée listée dans `build_dirs` du `projects//conf.json` du dépôt projet actif (ex. LeCoffre : backend, frontend, ressources partagées). **Interdit** de restreindre l’exécution ou les corrections au seul sous-projet « concerné » par la tâche en cours (ex. correctif backend uniquement : lancer et traiter le lint aussi sur front et ressources). Même règle pour les agents **ia_dev** et les délégations depuis `LECOFFRE_REPO`. -## Obligation systématique (même après `pousse` ou build) +## Obligation systématique (même après build explicite ou `pousse.sh --build`) - Avant clôture, sur tout dépôt projet ayant des `build_dirs` : exécuter le lint sur **chaque** entrée ; si **N ≥ 1**, appliquer **au moins min(5, N)** corrections **dans le run courant** (commits dans le workspace si besoin). -- Un lint **déjà** exécuté pendant `pousse`, un script de build ou une étape intermédiaire **sans** modifications ESLint enregistrées dans le dépôt **ne dispense pas** cette étape. +- Un lint **déjà** exécuté pendant un script de build, **`pousse.sh --build`**, ou une étape intermédiaire **sans** modifications ESLint enregistrées dans le dépôt **ne dispense pas** cette étape. **`pousse.sh` sans `--build`** ne lance pas de build et ne dispense pas non plus le lint de clôture. - **Interdit** de clôturer le point lint en reportant l’effort sur un appel **`/fix-lint` séparé** ou « à faire plus tard » : les corrections requises font partie du **même run** que la clôture (sauf enchaînement **immédiat** de `/fix-lint` dans ce run, avec décompte final identique). ## Interdiction de « lint non applicable » par convenance diff --git a/deploy/pousse.sh b/deploy/pousse.sh index d41d480..6a3d619 100755 --- a/deploy/pousse.sh +++ b/deploy/pousse.sh @@ -36,19 +36,22 @@ source "${IA_DEV_ROOT}/lib/project_config.sh" remote="origin" bump_version=false +run_build=false usage() { cat <<'EOF' Usage: - ./deploy/pousse.sh [project_id|--project ] [--remote ] [--bump-version] + ./deploy/pousse.sh [project_id|--project ] [--remote ] [--bump-version] [--build] project_id Optional. Id from projects//conf.json (e.g. kogus). Else from MAIL_TO or AI_AGENT_TOKEN. --project Same as positional project_id. --bump-version Increment patch (third component) in VERSION before staging. + --build Run npm run build (or build:all-sites for front-common) in each build_dir from conf; exit on failure. + Omitted by default: no build inside this script — run builds explicitly before pousse, or pass --build. Reads a full multi-line commit message from STDIN, then: - if not in repo root: re-exec from repo root (standardized execution) -- build check (npm run build in each directory listed in projects//conf.json build_dirs, if any; exit on failure) +- optional build check only with --build (npm run build in each directory listed in projects//conf.json build_dirs) - git add -A - git commit -F - git push -u HEAD @@ -87,6 +90,10 @@ while [[ $# -gt 0 ]]; do bump_version=true shift ;; + --build) + run_build=true + shift + ;; -h|--help) usage exit 0 @@ -130,41 +137,49 @@ if [[ -n "${PROJECT_CONFIG_PATH:-}" && -f "$PROJECT_CONFIG_PATH" ]] && command - [[ -n "$d" ]] && build_dirs+=( "$d" ) done < <(jq -r '.build_dirs[]? // empty' "$PROJECT_CONFIG_PATH" 2>/dev/null) fi -if [[ ${#build_dirs[@]} -gt 0 ]]; then - # shellcheck source=../lib/conf_path_resolve.sh - source "${IA_DEV_ROOT}/lib/conf_path_resolve.sh" - echo "[pousse] Build check (${#build_dirs[@]} dirs from project config)..." - for dir in "${build_dirs[@]}"; do - if [[ "$dir" = /* ]]; then - abs_dir="$dir" - elif [[ "$dir" == ../* || "$dir" == ".." ]]; then - abs_dir="$(ia_dev_resolve_path_from_conf "$PROJECT_CONFIG_PATH" "$dir")" - else - abs_dir="${git_work_root}/${dir}" - fi - if [[ ! -d "$abs_dir" ]]; then - echo "[pousse][WARN] Skipping build ${dir} (directory not found)" >&2 - continue - fi - build_basename="$(basename "$abs_dir")" - if [[ -z "${NEXT_PUBLIC_SITE_CODE:-}" && ( "$build_basename" == "front-common" || "$build_basename" == "lecoffre-front-main" ) ]]; then - echo "[pousse] Building ${dir} (npm run build:all-sites: lecoffreio, enso, genealogie)..." - (cd "$abs_dir" && npm run build:all-sites) || { - echo "[pousse][ERROR] build:all-sites failed in ${dir}" >&2 +if [[ "$run_build" == "true" ]]; then + if [[ ${#build_dirs[@]} -gt 0 ]]; then + # shellcheck source=../lib/conf_path_resolve.sh + source "${IA_DEV_ROOT}/lib/conf_path_resolve.sh" + echo "[pousse] Build check (${#build_dirs[@]} dirs from project config, --build)..." + for dir in "${build_dirs[@]}"; do + if [[ "$dir" = /* ]]; then + abs_dir="$dir" + elif [[ "$dir" == ../* || "$dir" == ".." ]]; then + abs_dir="$(ia_dev_resolve_path_from_conf "$PROJECT_CONFIG_PATH" "$dir")" + else + abs_dir="${git_work_root}/${dir}" + fi + if [[ ! -d "$abs_dir" ]]; then + echo "[pousse][WARN] Skipping build ${dir} (directory not found)" >&2 + continue + fi + build_basename="$(basename "$abs_dir")" + if [[ -z "${NEXT_PUBLIC_SITE_CODE:-}" && ( "$build_basename" == "front-common" || "$build_basename" == "lecoffre-front-main" ) ]]; then + echo "[pousse] Building ${dir} (npm run build:all-sites: lecoffreio, enso, genealogie)..." + (cd "$abs_dir" && npm run build:all-sites) || { + echo "[pousse][ERROR] build:all-sites failed in ${dir}" >&2 + exit 1 + } + continue + fi + + echo "[pousse] Building ${dir}..." + (cd "$abs_dir" && npm run build) || { + echo "[pousse][ERROR] Build failed in ${dir}" >&2 exit 1 } - continue - fi - - echo "[pousse] Building ${dir}..." - (cd "$abs_dir" && npm run build) || { - echo "[pousse][ERROR] Build failed in ${dir}" >&2 - exit 1 - } - done - echo "[pousse] Build check OK" + done + echo "[pousse] Build check OK" + else + echo "[pousse] No build_dirs in project config (or no projects//conf.json / jq); nothing to build with --build" + fi else - echo "[pousse] No build_dirs in project config (or no projects//conf.json / jq); skipping build check" + if [[ ${#build_dirs[@]} -gt 0 ]]; then + echo "[pousse] Skipping build check (no --build). Run npm run build / build:all-sites per build_dirs in conf before push, or re-run with --build." + else + echo "[pousse] No build_dirs in project config (or no projects//conf.json / jq); skipping build" + fi fi msg_file="$(mktemp -t pousse-commit-msg.XXXXXX)" diff --git a/projects/kogus/docs/agents-scripts-split.md b/projects/kogus/docs/agents-scripts-split.md index 3c3ac17..7be099e 100644 --- a/projects/kogus/docs/agents-scripts-split.md +++ b/projects/kogus/docs/agents-scripts-split.md @@ -96,11 +96,11 @@ - Construire le message de commit (toutes les sections obligatoires) - Mettre à jour CHANGELOG.md - Mettre à jour VERSION (incrément sous-sous-version) -- Exécuter `./deploy/pousse.sh` avec le message sur STDIN +- Exécuter `./deploy/pousse.sh` avec le message sur STDIN (builds explicites avant, ou **`--build`** sur la même ligne) **Script pousse.sh aujourd’hui :** -- Lire le message sur STDIN, `git add -A`, vérifications (auteur, chemins sensibles, branche distante), commit, push +- Par défaut : pas de build ; message sur STDIN, `git add -A`, vérifications (auteur, chemins sensibles, branche distante), commit, push. Avec **`--build`** : même boucle **`npm run build`** / **`build:all-sites`** que l’historique, puis add/commit/push. **Déplacé dans le script :** @@ -121,8 +121,8 @@ |---------|--------------| | `deploy/branch-align.sh` | Ré-exécution depuis la racine git si nécessaire | | `deploy/scripts_v2/deploy.sh` | Par défaut sync `--sync-origin` ; tee toujours vers `logs/deploy_*.log` ; `--no-sync-origin` pour désactiver le sync local ; métier uniquement `deploy.conf` | -| `deploy/pousse.sh` | **Ré-exéc depuis racine** si besoin ; option --bump-version ; build check (ressources, backend, frontend) avant staging | -| `deploy/change-to-all-branches.sh` | Vérif branche test, branch-align.sh test, orchestrateur ou deploy.sh test --no-sync-origin ; logs `./logs/` | +| `deploy/pousse.sh` | **Ré-exéc depuis racine** si besoin ; options **`--bump-version`**, **`--build`** ; sans **`--build`** : pas de compilation dans le script | +| `deploy/change-to-all-branches.sh` | Vérif branche test, `branch-align.sh test`, puis sauf **`--align-only`** : orchestrateur ou `deploy-lecoffre-all-sites.sh` / `deploy.sh` test `--no-sync-origin` ; logs `./logs/` ; **`--align-only`** = alignement seul (usage **`/deploy-pprod-or-prod`** étape 2) | | Agents .smartIde/agents/*.md | Adapter les consignes pour utiliser les nouvelles options/scripts et alléger les étapes redondantes | --- @@ -138,8 +138,8 @@ ### push-by-script / pousse.sh -- **Dans le script :** build check (npm run build pour les trois projets dev) avant staging ; en cas d'échec, sortie en erreur sans commit ni push. -- **Dans l'agent :** construire le message, mettre à jour CHANGELOG, lancer le script, contrôler sortie et code de retour. +- **Dans le script :** avec **`--build`** uniquement : build check (`npm run build` / `build:all-sites` selon `build_dirs`) avant staging ; en cas d'échec, sortie en erreur sans commit ni push. Sans **`--build`** : staging/commit/push seulement. +- **Dans l'agent :** construire le message, mettre à jour CHANGELOG, exécuter les builds explicites (étape 4 bis) ou **`pousse.sh --build`**, lancer **`pousse.sh`**, contrôler sortie et code de retour. ### Tous les agents @@ -158,11 +158,12 @@ ### pousse.sh -- **Ré-exécution depuis la racine :** si le script est appelé hors racine du dépôt, il se ré-exécute depuis `git rev-parse --show-toplevel`. Exécution toujours depuis la racine (comme branch-align.sh et change-to-all-branches.sh). +- **Ré-exécution depuis la racine :** si le script est appelé hors racine du dépôt, il se ré-exécute depuis `git rev-parse --show-toplevel`. Exécution toujours depuis la racine (comme branch-align.sh et change-to-all-branches.sh). **Build :** opt-in **`--build`** ; sinon compilation hors script (agent ou opérateur). ### change-to-all-branches.sh -- Appelle `deploy.sh test --no-sync-origin` ou orchestrateur équivalent (après push ; métier dans `deploy.conf`). +- Par défaut (sans **`--align-only`**) : après `branch-align.sh test`, appelle `deploy-lecoffre-all-sites.sh test --no-sync-origin` / orchestrateur ou `deploy.sh test --no-sync-origin` (métier dans `deploy.conf`). +- Avec **`--align-only`** : s’arrête après `branch-align.sh test` (pas de déploiement test ; réservé au flux **`/deploy-pprod-or-prod`** ia_dev). ### Agents