smart_ide/services/ia_dev/.smartIde/agents/deploy-pprod-or-prod.md
Nicolas Cantu 58cc2493e5 chore: consolidate ia_dev module, sync tooling, and harden gateways (0.0.5)
Initial state:
- ia_dev was historically referenced as ./ia_dev in docs and integrations, while the vendored module lives under services/ia_dev.
- AnythingLLM sync and hook installation had error masking / weak exit signaling.
- Proxy layers did not validate proxy path segments, allowing path normalization tricks.

Motivation:
- Make the IDE-oriented workflow usable (sync -> act -> deploy/preview) with explicit errors.
- Reduce security footguns in proxying and script automation.

Resolution:
- Standardize IA_DEV_ROOT usage and documentation to services/ia_dev.
- Add SSH remote data mirroring + optional AnythingLLM ingestion.
- Extend AnythingLLM pull sync to support upload-all/prefix and fail on upload errors.
- Harden smart-ide-sso-gateway and smart-ide-global-api proxying with safe-path checks and non-leaking error responses.
- Improve ia-dev-gateway runner validation and reduce sensitive path leakage.
- Add site scaffold tool (Vite/React) with OIDC + chat via sso-gateway -> orchestrator.

Root cause:
- Historical layout changes (submodule -> vendored tree) and missing central contracts for path resolution.
- Missing validation for proxy path traversal patterns.
- Overuse of silent fallbacks (|| true, exit 0 on partial failures) in automation scripts.

Impacted features:
- Project sync: git pull + AnythingLLM sync + remote data mirror ingestion.
- Site frontends: SSO gateway proxy and orchestrator intents (rag.query, chat.local).
- Agent execution: ia-dev-gateway script runner and SSE output.

Code modified:
- scripts/remote-data-ssh-sync.sh
- scripts/anythingllm-pull-sync/sync.mjs
- scripts/install-anythingllm-post-merge-hook.sh
- cron/git-pull-project-clones.sh
- services/smart-ide-sso-gateway/src/server.ts
- services/smart-ide-global-api/src/server.ts
- services/smart-ide-orchestrator/src/server.ts
- services/ia-dev-gateway/src/server.ts
- services/ia_dev/tools/site-generate.sh

Documentation modified:
- docs/** (architecture, API docs, ia_dev module + integration, scripts)

Configurations modified:
- config/services.local.env.example
- services/*/.env.example

Files in deploy modified:
- services/ia_dev/deploy/*

Files in logs impacted:
- logs/ia_dev.log (runtime only)
- .logs/* (runtime only)

Databases and other sources modified:
- None

Off-project modifications:
- None

Files in .smartIde modified:
- .smartIde/agents/*.md
- services/ia_dev/.smartIde/**

Files in .secrets modified:
- None

New patch version in VERSION:
- 0.0.5

CHANGELOG.md updated:
- yes
2026-04-04 18:36:43 +02:00

12 KiB
Raw Blame History

name description model is_background
deploy-pprod-or-prod 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 dune phase pprod/prod se fait sur test puis le workflow est rejoué depuis change-to-all-branches. Paramètre obligatoire pprod ou prod. inherit false

Preparer au maximum à l'aide d'outils et de scripts

En tant qu'agent, avant de solliciter l'ia, regarde ce que tu peux scripter (importe/install les outils nécessaires si besoin) l'ia est la derniere priorité par rapport à l'outillage, les outils sont lancés dans des scripts dans /home/desk/code/ia_dev/tools et rendus le plus générique possible afin de les réutilisé plus tard dans d'autres contextes, par contre l'ia peut serveur à développer ces scripts.

Rationalisation tokens

  • Contexte minimal : ne charger que les fichiers nécessaires à l'étape en cours ; recherches ciblées (dossier/fichier) plutôt qu'exploration large.

  • Référencer les procédures longues (clôture, déploiement) par fichier/section au lieu de les recopier.

  • 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/<id>/conf.json), exécuter npm run lint (ou équivalent) pour chaque zone concernée par la conf. 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 »).

Agent deploy-pprod-or-prod

Règle d'exécution intégrale (obligatoire, non négociable)

  • Tout dérouler : exécuter toutes les étapes décrites dans cet agent dans l'ordre, sans en omettre aucune. Tout doit se dérouler effectivement.
  • Sans priorisation : aucune étape n'est optionnelle ou "secondaire" ; chacune est obligatoire.
  • Sans jugement d'intérêt : ne jamais juger de la pertinence d'une étape pour la sauter ; tout appliquer tel que décrit, sans exception.
  • Vérification en fin d'agent : avant clôture, cocher explicitement chaque étape (réalisée / non réalisée).

Contexte projet : La configuration et la documentation du projet sont dans projects/<id>/. L'identifiant <id> est résolu par paramètre (optionnel en premier argument des scripts), MAIL_TO ou AI_AGENT_TOKEN. Voir docs/repo/ia-dev-project-conf-schema.md. Rappeler ce chemin en début et en fin d'exécution.

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 l'agent : Exécuter le déploiement vers pprod ou prod en suivant strictement le workflow ci-dessous. Paramètre obligatoire : pprod ou prod. En cas d'échec d'une étape, corriger (analyse des logs, corrections code/config/doc), relancer jusqu'à succès ou blocage nécessitant instruction utilisateur.

Répertoire d'exécution (standalone) : Racine de ia_dev. Tous les scripts sont invoqués depuis la racine de ia_dev.

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/<id>/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.
  • 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)

Règles décisionnelles (ne pas lancer en double ce quun agent en aval exécute déjà) :

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. Lagent /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 lordre push → change-to-all-branches → suite).

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).

Vérification obligatoire — début dexécution

Avant létape 1 du workflow, afficher et cocher (dans la sortie de lagent) :

  1. Anti-duplication change-to-all-branches : je nai 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 nai 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).

Si lutilisateur 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 / lagent change-to-all-branches).

Vérification obligatoire — fin dagent (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 lexception 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 ».

Workflow obligatoire

  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 dabord (voir section Corrections découvertes sur pprod ou prod), puis relancer /change-to-all-branches jusqu'à succès.
    • Si OK : Passer à l'étape 3.
  3. Lancer le script deploy-by-script-to avec lenvironnement 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] <pprod|prod>.
    • deploy.host_stays_on_test: true dans projects/<id>/conf.json (LeCoffre : true dans projects/lecoffreio/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 .secrets/<env> existe, reset --hard sur origin/<branche>, 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).
    • 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.

  5. Lancer /push-by-script : Exécuter intégralement l'agent push-by-script (commande /push-by-script). Message de commit fourni par l'agent selon les règles du projet.

  6. Lint min. 5 sur le dépôt applicatif : Avant la clôture, se placer dans repository_root (projects/<id>/conf.json). Exécuter le lint dans chaque entrée de build_dirs. Si N ≥ 1 diagnostics (erreurs+warnings) : corriger au moins min(5, N) dans ce run. Interdit de clôturer le point lint en renvoyant uniquement à un /fix-lint ultérieur. Documenter décompte avant/après. Si des fichiers sont modifiés : enchaîner /push-by-script (commit des corrections lint) avant de finaliser la clôture lorsque le dépôt nest pas clean.

Horodatage et contexte

Appliquer intégralement le bloc défini dans .smartIde/rules/cloture-evolution.mdc (début et fin d'exécution, lancement et retour des sub-agents). Au début et à la fin : date/heure, projet (id), branche et répertoire de travail du dépôt concerné.

Clôture complète obligatoire (tous les cas, sans exception)

En fin d'exécution de cet agent, toujours appliquer intégralement .smartIde/rules/cloture-evolution.mdc : points 1 à 19. Pour le point 7 (Optimisation / mutualisation / centralisation), si « Non réalisées encore » : justifier par composant (voir .smartIde/agents/closure-point-7-justification.md). Toutes les étapes (agent + clôture) doivent être réellement passées, sans jugement de pertinence ; tout doit se dérouler. (horodatage, 5 sub-agents par projet, questions 3-13, docupdate, reste à faire, push-by-script si pas déjà fait, affichage du texte du commit). Aucune exception : même si une étape a échoué, la clôture complète est obligatoire. Lister les actions réalisées et non réalisées pour chaque point.