From d98e6bce609d30813c6589fc6f96a0e90c890fe1 Mon Sep 17 00:00:00 2001 From: Nicolas Cantu Date: Fri, 3 Apr 2026 17:50:49 +0200 Subject: [PATCH] feat: logs/ for pull-sync and ia_dev; document ia_dev as in-repo module - Default PULL_SYNC_LOG to logs/git-pull-projects.log; add logs/README and gitignore - Add services/ia_dev integration README and .env.example - Replace docs/ia_dev-submodule.md with ia_dev-module.md; update ecosystem and README links - Point ia_dev submodule to commit with smart_ide_logs.sh --- .cursor/rules/smart-ide-ia-dev-bridge.mdc | 4 +- README.md | 9 +- cron/README.md | 60 +++++++++++++ cron/config.env | 17 ++++ cron/config.local.env.example | 5 ++ cron/fragments/README.md | 5 ++ cron/fragments/_template.cron | 2 + cron/fragments/all-projects.cron | 4 + cron/fragments/enso.cron | 3 + cron/fragments/smart_ide.cron | 4 + cron/git-pull-project-clones.sh | 90 +++++++++++++++++++ cron/git-pull-wrapper.sh | 44 +++++++++ docs/README.md | 4 +- docs/ecosystem-architecture-and-sync.md | 23 +++-- docs/features/ia-dev-service.md | 4 +- docs/ia_dev-module.md | 37 ++++++++ docs/ia_dev-project-smart_ide.md | 2 +- docs/ia_dev-submodule.md | 64 ------------- docs/implementation-rollout.md | 2 +- docs/system-architecture.md | 11 +-- ia_dev | 2 +- logs/.gitignore | 2 + logs/README.md | 12 +++ projects/README.md | 22 ++++- scripts/install-git-pull-systemd-user.sh | 27 ++++++ services/ia_dev/.env.example | 6 ++ services/ia_dev/README.md | 21 +++++ .../user/git-pull-project-clones.service.in | 8 ++ systemd/user/git-pull-project-clones.timer | 10 +++ 29 files changed, 409 insertions(+), 95 deletions(-) create mode 100644 cron/README.md create mode 100644 cron/config.env create mode 100644 cron/config.local.env.example create mode 100644 cron/fragments/README.md create mode 100644 cron/fragments/_template.cron create mode 100644 cron/fragments/all-projects.cron create mode 100644 cron/fragments/enso.cron create mode 100644 cron/fragments/smart_ide.cron create mode 100755 cron/git-pull-project-clones.sh create mode 100755 cron/git-pull-wrapper.sh create mode 100644 docs/ia_dev-module.md delete mode 100644 docs/ia_dev-submodule.md create mode 100644 logs/.gitignore create mode 100644 logs/README.md create mode 100755 scripts/install-git-pull-systemd-user.sh create mode 100644 services/ia_dev/.env.example create mode 100644 services/ia_dev/README.md create mode 100644 systemd/user/git-pull-project-clones.service.in create mode 100644 systemd/user/git-pull-project-clones.timer diff --git a/.cursor/rules/smart-ide-ia-dev-bridge.mdc b/.cursor/rules/smart-ide-ia-dev-bridge.mdc index 26bbf99..aebf363 100644 --- a/.cursor/rules/smart-ide-ia-dev-bridge.mdc +++ b/.cursor/rules/smart-ide-ia-dev-bridge.mdc @@ -6,11 +6,11 @@ alwaysApply: false # smart_ide ↔ ia_dev (projet et environnement) -Quand le périmètre touche ce dépôt et le sous-module **`ia_dev/`** : +Quand le périmètre touche ce dépôt et le module **`ia_dev/`** : - **Identifiant projet ia_dev :** `smart_ide` ; conf versionnée : **`projects/smart_ide/conf.json`** à la racine du workspace ; `ia_dev/projects/smart_ide` doit être un **lien** vers ce dossier (script `scripts/ensure-ia-dev-smart-ide-project-link.sh`). - **Environnement :** `test` | `pprod` | `prod`. Le reprendre depuis le message utilisateur ; **demander** s’il manque avant des actions dépendantes du env. -- **Exécution des scripts ia_dev :** répertoire courant = racine du clone **`ia_dev/`** (sous le workspace smart_ide). Pas de mélange avec la racine smart_ide pour `deploy/`, `gitea-issues/`, etc. +- **Exécution des scripts ia_dev :** répertoire courant = racine **`ia_dev/`** (dans le workspace smart_ide). Pas de mélange avec la racine smart_ide pour `deploy/`, `gitea-issues/`, etc. - **Sélection projet pour les scripts :** `IA_PROJECT_ID=smart_ide` et/ou `--project smart_ide` selon le script ; détail : `ia_dev/projects/README.md`. - **MAIL_TO (ticketing / mails) :** lire `projects/smart_ide/conf.json` (racine workspace) → `tickets.authorized_emails.to` pour l’env choisi (ex. test → `AI.SMART_IDE.TEST@4nkweb.com`). - **Code et doc applicative :** racine du workspace smart_ide ; doc indexée sous `docs/` à la racine. `ia_dev/projects/smart_ide/docs` peut être absent. diff --git a/README.md b/README.md index 7aa75de..a6bb343 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ Pour chaque **projet**, un **workspace AnythingLLM** dédié est créé (ou ratt Voir [docs/anythingllm-workspaces.md](./docs/anythingllm-workspaces.md). -## Dépôt `ia_dev` (sous-module Git) +## Module `ia_dev` (dans ce dépôt) -Le dépôt [**ia_dev**](https://git.4nkweb.com/4nk/ia_dev.git) est intégré comme **sous-module** dans le répertoire [`./ia_dev`](./ia_dev) : équipe d’agents, scripts `deploy/`, ticketing Gitea, etc. Les **fichiers `conf.json`** pour ce monorepo sont sous [`./projects//`](./projects/README.md) (pas les clones Git ; ceux-ci ailleurs, ex. `../projects/`). Cloner avec `git clone --recurse-submodules` ou initialiser avec `git submodule update --init --recursive`. Détail : [docs/ia_dev-submodule.md](./docs/ia_dev-submodule.md). Les agents Cursor **pont** (`ia-dev-*`) sont décrits dans [docs/ia_dev-project-smart_ide.md](./docs/ia_dev-project-smart_ide.md). +Le répertoire [`./ia_dev`](./ia_dev) contient l’**équipe d’agents**, les scripts `deploy/`, le ticketing Gitea, etc. (référence historique sur la forge : [**ia_dev**](https://git.4nkweb.com/4nk/ia_dev.git)). Les **fichiers `conf.json`** pour ce monorepo sont sous [`./projects//`](./projects/README.md) (pas les clones Git ; ceux-ci ailleurs, ex. `../projects/`). Un `git clone` du monorepo suffit. Détail : [docs/ia_dev-module.md](./docs/ia_dev-module.md), intégration [services/ia_dev/](services/ia_dev/README.md), journaux [logs/README.md](logs/README.md). Les agents Cursor **pont** (`ia-dev-*`) sont décrits dans [docs/ia_dev-project-smart_ide.md](./docs/ia_dev-project-smart_ide.md). ## Documentation @@ -44,7 +44,10 @@ Le dépôt [**ia_dev**](https://git.4nkweb.com/4nk/ia_dev.git) est intégré com | [docs/ecosystem-architecture-and-sync.md](./docs/ecosystem-architecture-and-sync.md) | smart_ide, clones projet, API IA, docv / données `../projects//data`, Git / Ollama / AnythingLLM | | [docs/deployment-target.md](./docs/deployment-target.md) | Client Linux + SSH : serveur = socle IA + repos | | [projects/README.md](./projects/README.md) | Confs `ia_dev` (`conf.json` seuls) — distinct des clones sous `../projects/` | -| [docs/ia_dev-submodule.md](./docs/ia_dev-submodule.md) | Sous-module Git `ia_dev`, clone / mise à jour | +| [cron/README.md](./cron/README.md) | Config `cron/config.env`, pull Git planifié (`projects/*/conf.json`) | +| [scripts/install-git-pull-systemd-user.sh](./scripts/install-git-pull-systemd-user.sh) | Timer systemd **user** pour le pull automatique | +| [docs/ia_dev-module.md](./docs/ia_dev-module.md) | Module `ia_dev`, liens projet, journaux | +| [services/ia_dev/](services/ia_dev/README.md) | Contrat d’intégration `ia_dev` dans smart_ide | | [docs/ia_dev-project-smart_ide.md](./docs/ia_dev-project-smart_ide.md) | Projet `ia_dev` `smart_ide` : `conf.json`, wiki/issues forge 4nk, agents Cursor `ia-dev-*` | | [docs/features/langextract-api.md](./docs/features/langextract-api.md) | API locale LangExtract (extraction structurée) | | [docs/features/claw-harness-api.md](./docs/features/claw-harness-api.md) | Intégration claw-code (multi-modèles, sans Anthropic dans les gabarits) | diff --git a/cron/README.md b/cron/README.md new file mode 100644 index 0000000..6770b85 --- /dev/null +++ b/cron/README.md @@ -0,0 +1,60 @@ +# Tirage Git planifié — clones `projects/*/conf.json` + +## Comportement + +Le script [`git-pull-project-clones.sh`](./git-pull-project-clones.sh) parcourt [`../projects//`](../projects/) (fichiers `conf.json`), lit **`project_path`**, et pour chaque dépôt Git : + +1. **`git fetch origin `** +2. si **`origin/`** est en avance en **fast-forward** → **`git merge --ff-only origin/`** +3. sinon → message explicite, **pas** de merge forcé + +## Configuration centralisée + +| Fichier | Rôle | +|---------|------| +| [`config.env`](./config.env) | **Versionné** : `PULL_SYNC_ENABLED`, `PULL_SYNC_MODE` (`all` \| `project`), `PULL_SYNC_PROJECT_ID`, `PULL_SYNC_LOG` | +| `config.local.env` | **Optionnel, non versionné** (voir [`config.local.env.example`](./config.local.env.example)) — surcharge machine | + +Le script [`git-pull-wrapper.sh`](./git-pull-wrapper.sh) charge ces fichiers puis appelle `git-pull-project-clones.sh` et **append** la sortie dans `PULL_SYNC_LOG` (défaut : **`logs/git-pull-projects.log`** à la racine du dépôt — voir [`logs/README.md`](../logs/README.md)). + +## Mise en place recommandée : systemd utilisateur + +Depuis la racine du dépôt **smart_ide** : + +```bash +./scripts/install-git-pull-systemd-user.sh +``` + +Cela installe sous `~/.config/systemd/user/` : + +- `git-pull-project-clones.service` (généré depuis [`../systemd/user/git-pull-project-clones.service.in`](../systemd/user/git-pull-project-clones.service.in)) +- `git-pull-project-clones.timer` ([`../systemd/user/git-pull-project-clones.timer`](../systemd/user/git-pull-project-clones.timer)) — **toutes les 15 minutes** (`OnCalendar=*:0/15`) + +Commandes utiles : + +```bash +systemctl --user status git-pull-project-clones.timer +systemctl --user list-timers | grep git-pull +journalctl --user -u git-pull-project-clones.service -n 50 --no-pager +``` + +Pour changer la fréquence : éditer le fichier **timer** dans le dépôt, relancer `install-git-pull-systemd-user.sh`, ou éditer directement `~/.config/systemd/user/git-pull-project-clones.timer` puis `systemctl --user daemon-reload`. + +## Prérequis + +- **`jq`** +- Clones avec remote **`origin`** et branche suivie (ex. `test`) + +## Désactiver un projet + +Dans `projects//conf.json` : `"cron": { "git_pull": false }`. + +Pour **tout** arrêter : `PULL_SYNC_ENABLED=0` dans `config.env` ou `config.local.env`, ou `systemctl --user disable --now git-pull-project-clones.timer`. + +## Crontab (alternative) + +Si tu préfères cron au lieu de systemd : une ligne qui appelle **`./cron/git-pull-wrapper.sh`** (pas besoin de redéfinir les variables si tu utilises uniquement `config.env`). Fragments : [`fragments/`](./fragments/) (à aligner sur le wrapper). + +## Hooks AnythingLLM + +Un **`post-merge`** sur un clone peut s’exécuter après un `merge --ff-only` : voir [`scripts/anythingllm-pull-sync`](../scripts/anythingllm-pull-sync/). diff --git a/cron/config.env b/cron/config.env new file mode 100644 index 0000000..aae200b --- /dev/null +++ b/cron/config.env @@ -0,0 +1,17 @@ +# Configuration centralisée — tirage Git des clones (projects/*/conf.json) +# Fichier versionné : modifier ici ou surcharger dans config.local.env (non versionné). +# +# Désactiver complètement l’exécution planifiée (systemd user timer) : +# PULL_SYNC_ENABLED=0 + +PULL_SYNC_ENABLED=1 + +# all = tous les projets sous projects/*/conf.json (respecte cron.git_pull par projet) +# project = un seul id (définir PULL_SYNC_PROJECT_ID) +PULL_SYNC_MODE=all +# PULL_SYNC_MODE=project +# PULL_SYNC_PROJECT_ID=smart_ide + +# Journal append : défaut = /logs/git-pull-projects.log (voir git-pull-wrapper.sh) +# Surcharge ex. : PULL_SYNC_LOG=/home/user/.local/log/smart_ide-pull.log +# PULL_SYNC_LOG= diff --git a/cron/config.local.env.example b/cron/config.local.env.example new file mode 100644 index 0000000..5697929 --- /dev/null +++ b/cron/config.local.env.example @@ -0,0 +1,5 @@ +# Copier vers config.local.env (ignoré par Git) pour surcharges machine locale. +# Exemple : +# PULL_SYNC_LOG=/chemin/perso/pull.log # défaut : /logs/git-pull-projects.log +# PULL_SYNC_MODE=project +# PULL_SYNC_PROJECT_ID=enso diff --git a/cron/fragments/README.md b/cron/fragments/README.md new file mode 100644 index 0000000..134dfdf --- /dev/null +++ b/cron/fragments/README.md @@ -0,0 +1,5 @@ +# Fragments crontab (alternative à systemd) + +La configuration **centralisée** est dans [`../config.env`](../config.env). En **systemd utilisateur** (recommandé) : [`../../scripts/install-git-pull-systemd-user.sh`](../../scripts/install-git-pull-systemd-user.sh). + +Si tu utilises **cron** à la place : une seule ligne qui appelle **`git-pull-wrapper.sh`** (il lit `config.env` / `config.local.env`). Les fichiers `*.cron` ici ne sont que des rappels commentés. diff --git a/cron/fragments/_template.cron b/cron/fragments/_template.cron new file mode 100644 index 0000000..87528a4 --- /dev/null +++ b/cron/fragments/_template.cron @@ -0,0 +1,2 @@ +# Préférer systemd + cron/config.env. Sinon crontab : +# */15 * * * * USER cd SMART_IDE_ROOT && ./cron/git-pull-wrapper.sh diff --git a/cron/fragments/all-projects.cron b/cron/fragments/all-projects.cron new file mode 100644 index 0000000..b64cf99 --- /dev/null +++ b/cron/fragments/all-projects.cron @@ -0,0 +1,4 @@ +# Tous les projets — utilise la config centralisée cron/config.env (PULL_SYNC_*). +# Préférer systemd : ./scripts/install-git-pull-systemd-user.sh +# +# */15 * * * * USER cd SMART_IDE_ROOT && ./cron/git-pull-wrapper.sh diff --git a/cron/fragments/enso.cron b/cron/fragments/enso.cron new file mode 100644 index 0000000..d80eabb --- /dev/null +++ b/cron/fragments/enso.cron @@ -0,0 +1,3 @@ +# Voir cron/config.env : PULL_SYNC_MODE=project et PULL_SYNC_PROJECT_ID=enso + git-pull-wrapper.sh +# +# */15 * * * * USER cd SMART_IDE_ROOT && ./cron/git-pull-wrapper.sh diff --git a/cron/fragments/smart_ide.cron b/cron/fragments/smart_ide.cron new file mode 100644 index 0000000..42c8824 --- /dev/null +++ b/cron/fragments/smart_ide.cron @@ -0,0 +1,4 @@ +# Un seul projet : préférer éditer cron/config.env (PULL_SYNC_MODE=project, PULL_SYNC_PROJECT_ID=smart_ide) +# puis ./cron/git-pull-wrapper.sh depuis crontab, ou systemd (install-git-pull-systemd-user.sh). +# +# */15 * * * * USER cd SMART_IDE_ROOT && ./cron/git-pull-wrapper.sh diff --git a/cron/git-pull-project-clones.sh b/cron/git-pull-project-clones.sh new file mode 100755 index 0000000..685d1ae --- /dev/null +++ b/cron/git-pull-project-clones.sh @@ -0,0 +1,90 @@ +#!/usr/bin/env bash +# For each projects//conf.json with project_path pointing to a Git clone under ../ +# (or anywhere), fetch origin and fast-forward the current branch if safe. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +PROJECTS_CONF="$ROOT/projects" +LOG_PREFIX="[git-pull-project-clones]" + +usage() { + echo "Usage: $0 [--all | --project ]" >&2 + echo " Reads projects//conf.json (jq required). Skips if cron.git_pull is false." >&2 + exit 1 +} + +filter_id="" +if [[ "${1:-}" == "--project" && -n "${2:-}" ]]; then + filter_id="$2" +elif [[ -n "${1:-}" && "$1" != "--all" ]]; then + usage +fi + +command -v jq >/dev/null 2>&1 || { + echo "$LOG_PREFIX jq not found; install jq." >&2 + exit 1 +} + +pull_clone() { + local id="$1" path="$2" + if [[ ! -d "$path" ]]; then + echo "$LOG_PREFIX skip $id: project_path not a directory: $path" + return 0 + fi + if [[ ! -d "$path/.git" ]]; then + echo "$LOG_PREFIX skip $id: not a git repository: $path" + return 0 + fi + local branch + if ! branch="$(git -C "$path" symbolic-ref -q --short HEAD 2>/dev/null)"; then + echo "$LOG_PREFIX skip $id: detached HEAD in $path" + return 0 + fi + if ! git -C "$path" remote get-url origin >/dev/null 2>&1; then + echo "$LOG_PREFIX skip $id: no origin remote in $path" + return 0 + fi + echo "$LOG_PREFIX $id: fetch origin ($path, branch $branch)" + if ! git -C "$path" fetch origin "$branch" 2>&1; then + echo "$LOG_PREFIX $id: fetch failed" >&2 + return 1 + fi + local head oref + head="$(git -C "$path" rev-parse HEAD)" + oref="origin/$branch" + if ! git -C "$path" rev-parse --verify -q "$oref" >/dev/null 2>&1; then + echo "$LOG_PREFIX skip $id: $oref missing after fetch" + return 0 + fi + local remote_sha + remote_sha="$(git -C "$path" rev-parse "$oref")" + if [[ "$head" == "$remote_sha" ]]; then + echo "$LOG_PREFIX $id: up to date" + return 0 + fi + if ! git -C "$path" merge-base --is-ancestor "$head" "$remote_sha" 2>/dev/null; then + echo "$LOG_PREFIX skip $id: not fast-forward (diverged or unrelated); manual merge required" + return 0 + fi + echo "$LOG_PREFIX $id: fast-forward to $oref" + git -C "$path" merge --ff-only "$oref" + echo "$LOG_PREFIX $id: done" +} + +for conf in "$PROJECTS_CONF"/*/conf.json; do + [[ -f "$conf" ]] || continue + id="$(basename "$(dirname "$conf")")" + if [[ -n "$filter_id" && "$id" != "$filter_id" ]]; then + continue + fi + if [[ "$(jq -r '.cron.git_pull // true' "$conf")" == "false" ]]; then + echo "$LOG_PREFIX skip $id: cron.git_pull is false" + continue + fi + path="$(jq -r '.project_path // empty' "$conf")" + if [[ -z "$path" || "$path" == "null" ]]; then + echo "$LOG_PREFIX skip $id: empty project_path" + continue + fi + pull_clone "$id" "$path" || true +done diff --git a/cron/git-pull-wrapper.sh b/cron/git-pull-wrapper.sh new file mode 100755 index 0000000..1a24a9e --- /dev/null +++ b/cron/git-pull-wrapper.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# Charge cron/config.env (+ optionnel config.local.env) puis exécute git-pull-project-clones.sh. +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +load_env() { + local f="$1" + [[ -f "$f" ]] || return 0 + set -a + # shellcheck source=/dev/null + source "$f" + set +a +} + +load_env "$ROOT/cron/config.env" +load_env "$ROOT/cron/config.local.env" + +if [[ "${PULL_SYNC_ENABLED:-1}" == "0" ]]; then + exit 0 +fi + +LOG="${PULL_SYNC_LOG:-$ROOT/logs/git-pull-projects.log}" +mkdir -p "$(dirname "$LOG")" 2>/dev/null || true + +{ + echo "=== $(date -Iseconds) pull-sync ===" + case "${PULL_SYNC_MODE:-all}" in + all) + "$ROOT/cron/git-pull-project-clones.sh" --all + ;; + project) + if [[ -z "${PULL_SYNC_PROJECT_ID:-}" ]]; then + echo "[git-pull-wrapper] PULL_SYNC_PROJECT_ID requis quand PULL_SYNC_MODE=project" >&2 + exit 1 + fi + "$ROOT/cron/git-pull-project-clones.sh" --project "$PULL_SYNC_PROJECT_ID" + ;; + *) + echo "[git-pull-wrapper] PULL_SYNC_MODE invalide: ${PULL_SYNC_MODE:-}" >&2 + exit 1 + ;; + esac + echo "=== fin ===" +} >>"$LOG" 2>&1 diff --git a/docs/README.md b/docs/README.md index b254722..5e50431 100644 --- a/docs/README.md +++ b/docs/README.md @@ -39,7 +39,9 @@ Index des documents à la racine de `docs/`. Les **fonctionnalités** détaillé | Document | Contenu | |----------|---------| -| [ia_dev-submodule.md](./ia_dev-submodule.md) | Sous-module `ia_dev` (forge 4NK), agents ; confs versionnées dans [`../projects/`](../projects/) | +| [ia_dev-module.md](./ia_dev-module.md) | Module `ia_dev` dans le dépôt, agents ; confs dans [`../projects/`](../projects/) | +| [../logs/README.md](../logs/README.md) | Journaux locaux : pull Git planifié, exécutions `ia_dev` | +| [../services/ia_dev/README.md](../services/ia_dev/README.md) | Contrat d’intégration du module `ia_dev` | ## Fonctionnalités (`features/`) diff --git a/docs/ecosystem-architecture-and-sync.md b/docs/ecosystem-architecture-and-sync.md index e8e45c2..c8be504 100644 --- a/docs/ecosystem-architecture-and-sync.md +++ b/docs/ecosystem-architecture-and-sync.md @@ -8,7 +8,7 @@ Références complémentaires : [system-architecture.md](./system-architecture.m | Élément | Rôle | Où vit la vérité opérationnelle | |---------|------|----------------------------------| -| **smart_ide** | Socle : doc, `services/*`, scripts, systemd, confs `ia_dev` (`./projects//conf.json`), sous-module **`ia_dev/`** | Dépôt Git **smart_ide** (forge interne) | +| **smart_ide** | Socle : doc, `services/*`, scripts, systemd, confs `ia_dev` (`./projects//conf.json`), module **`ia_dev/`**, journaux **`logs/`** | Dépôt Git **smart_ide** (forge interne) | | **Projets développés** | Code métier (docv, autres produits) : sources, builds, tests | **Autres** dépôts Git ; clones sur disque en dehors de `./projects/` (convention : répertoire frère `../projects//` ou équivalent) | | **Couche API IA** | Routage HTTP, auth, appels vers LLM, RAG, outils, agents | Processus sur l’**hôte** (systemd, ports locaux) ; contrats décrits sous `docs/API/` | | **Git (hôte)** | Historique des dépôts, hooks, branches par environnement | Chaque dépôt ; politique de branche documentée par projet | @@ -67,7 +67,7 @@ flowchart TB - **Source de vérité** pour le code et la documentation versionnée des projets. - **Branches** : alignement avec les environnements (test / pprod / prod) selon la politique du projet ; smart_ide documente les cibles dans [platform-target.md](./platform-target.md) et [deployment-target.md](./deployment-target.md). -- **Sous-module `ia_dev`** : `git submodule update --init --recursive` sur smart_ide ; puis scripts de post-checkout documentés ([ia_dev-submodule.md](./ia_dev-submodule.md), [projects/README.md](../projects/README.md)). +- **Module `ia_dev`** : présent dans l’arborescence du dépôt **smart_ide** ; liens `ia_dev/projects/*` et scripts documentés ([ia_dev-module.md](./ia_dev-module.md), [projects/README.md](../projects/README.md)). ### Ollama @@ -89,29 +89,28 @@ Objectif : après un changement **tracé dans Git**, les systèmes en aval (Anyt ### 4.1 Ordre de référence (nouvelle machine ou post-clone) -1. Cloner **smart_ide** avec sous-modules : `git clone --recurse-submodules …`. -2. Initialiser / mettre à jour **`ia_dev`** : `git submodule update --init --recursive`. -3. Recréer le lien conf projet : `./scripts/ensure-ia-dev-smart-ide-project-link.sh` ([projects/README.md](../projects/README.md)). -4. Cloner les **projets applicatifs** à l’emplacement convenu (ex. `../projects//`) et vérifier les chemins **absolus** dans `projects//conf.json` si `ia_dev` doit les piloter. -5. Démarrer **Ollama** et **AnythingLLM** sur l’hôte ([services.md](./services.md)) ; créer les **workspaces** et noter les **slugs**. -6. Configurer l’environnement de synchro AnythingLLM : `~/.config/4nk/anythingllm-sync.env` (URL, clé API) — ne pas commiter les secrets. -7. Par dépôt à indexer : fichier **`.anythingllm.json`** à la racine avec `{ "workspaceSlug": "…" }` (ou variable d’environnement équivalente), puis installer le hook **post-merge** : [features/anythingllm-pull-sync-after-pull.md](./features/anythingllm-pull-sync-after-pull.md), [scripts/anythingllm-pull-sync/README.md](../scripts/anythingllm-pull-sync/README.md). +1. Cloner **smart_ide** : `git clone …` (le répertoire **`ia_dev/`** suit le même historique Git que le monorepo). +2. Recréer le lien conf projet si besoin : `./scripts/ensure-ia-dev-smart-ide-project-link.sh` ([projects/README.md](../projects/README.md)). +3. Cloner les **projets applicatifs** à l’emplacement convenu (ex. `../projects//`) et vérifier les chemins **absolus** dans `projects//conf.json` si `ia_dev` doit les piloter. +4. Démarrer **Ollama** et **AnythingLLM** sur l’hôte ([services.md](./services.md)) ; créer les **workspaces** et noter les **slugs**. +5. Configurer l’environnement de synchro AnythingLLM : `~/.config/4nk/anythingllm-sync.env` (URL, clé API) — ne pas commiter les secrets. +6. Par dépôt à indexer : fichier **`.anythingllm.json`** à la racine avec `{ "workspaceSlug": "…" }` (ou variable d’environnement équivalente), puis installer le hook **post-merge** : [features/anythingllm-pull-sync-after-pull.md](./features/anythingllm-pull-sync-after-pull.md), [scripts/anythingllm-pull-sync/README.md](../scripts/anythingllm-pull-sync/README.md). ### 4.2 Cycle de travail développeur (projet applicatif) -1. `git pull` (ou `merge`) sur le clone du projet. +1. `git pull` (ou `merge`) sur le clone du projet — peut être **automatisé** par [`cron/git-pull-project-clones.sh`](../cron/git-pull-project-clones.sh) à partir des `projects//conf.json` (voir [`cron/README.md`](../cron/README.md)). 2. Le hook **post-merge** exécute **`scripts/anythingllm-pull-sync/sync.mjs`** : envoi des fichiers **modifiés ou ajoutés** vers le workspace AnythingLLM du projet, avec exclusions **`.4nkaiignore`**. 3. Limites documentées : pas de suppression automatique des documents retirés du repo dans la version actuelle du script ; traiter les gros refactors par une **resynchro** manuelle ou évolution du script si le besoin est récurrent. ### 4.3 Cycle de travail sur smart_ide -1. `git pull` sur smart_ide ; mettre à jour le sous-module **`ia_dev`** si le pointeur parent a bougé. +1. `git pull` sur smart_ide (inclut les mises à jour sous **`ia_dev/`**). 2. Réexécuter **`ensure-ia-dev-smart-ide-project-link.sh`** si le répertoire `ia_dev/projects/` a été réinitialisé. 3. Option : installer le même hook **post-merge** sur le dépôt **smart_ide** si un workspace AnythingLLM est dédié au monorepo (fichier `.anythingllm.json` + slug). ### 4.4 Agents, déploiement, ticketing (`ia_dev`) -- Exécution depuis la **racine** du sous-module `ia_dev/` ; résolution du projet : `IA_PROJECT_ID`, `--project`, `MAIL_TO`, `AI_AGENT_TOKEN` — voir `ia_dev/projects/README.md` dans le sous-module. +- Exécution depuis la **racine** de `ia_dev/` ; résolution du projet : `IA_PROJECT_ID`, `--project`, `MAIL_TO`, `AI_AGENT_TOKEN` — voir [`ia_dev/projects/README.md`](../ia_dev/projects/README.md). - Les scripts **ne remplacent pas** Git : ils **lisent** `conf.json` pour savoir où sont les dépôts et comment déployer. ### 4.5 Cohérence « clone présent + workspace aligné » diff --git a/docs/features/ia-dev-service.md b/docs/features/ia-dev-service.md index a3f9896..c326d09 100644 --- a/docs/features/ia-dev-service.md +++ b/docs/features/ia-dev-service.md @@ -2,7 +2,7 @@ ## Objectif -Remplacer à terme l’appel **direct** au dépôt sous-module [`ia_dev`](../ia_dev-submodule.md) par un **service HTTP** sous [`services/ia-dev-gateway/`](../../services/ia-dev-gateway/) qui : +Remplacer à terme l’appel **direct** au répertoire module [`ia_dev`](../ia_dev-module.md) par un **service HTTP** sous [`services/ia-dev-gateway/`](../../services/ia-dev-gateway/) qui : - Pointe vers un **fork** de [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git) (même historique Git, gouvernance dans le monorepo `smart_ide`). - **N’implémente pas** la logique métier des projets : il **oriente** les jobs vers `projects//`, `deploy/`, scripts existants, avec policy et journalisation. @@ -21,7 +21,7 @@ Remplacer à terme l’appel **direct** au dépôt sous-module [`ia_dev`](../ia_ Aujourd’hui `./ia_dev` reste le **checkout canonique** sur l’hôte. Le binaire `ia-dev-gateway` reçoit `IA_DEV_ROOT` (défaut : répertoire parent du service ou chemin absolu vers `./ia_dev`). -**Trajectoire** : sous-module conservé jusqu’à ce que le fork soit **vendored** ou **cloné par le service** au déploiement ; puis documentation de migration dans [ia_dev-submodule.md](../ia_dev-submodule.md). +**Trajectoire** : module `ia_dev` dans le monorepo jusqu’à ce qu’un fork soit **vendored** ou **cloné par le service** au déploiement ; documentation de migration dans [ia_dev-module.md](../ia_dev-module.md). ## API (spécification) diff --git a/docs/ia_dev-module.md b/docs/ia_dev-module.md new file mode 100644 index 0000000..b5ff5a2 --- /dev/null +++ b/docs/ia_dev-module.md @@ -0,0 +1,37 @@ +# Module `ia_dev` dans smart_ide + +Le répertoire **`./ia_dev`** à la racine du monorepo **smart_ide** contient l’**équipe d’agents** (définitions sous `.cursor/agents/`, `.cursor/rules/`), **`deploy/`**, **`gitea-issues/`**, etc. Il est **versionné dans ce dépôt** (plus de sous-module Git séparé pour le checkout standard). + +Les **`conf.json` par projet** pour ce monorepo restent sous **`./projects//`** à la racine de **smart_ide** (voir [projects/README.md](../projects/README.md)), pas mélangés avec les clones applicatifs (`../projects/` ou autre). Un **lien symbolique** `ia_dev/projects/smart_ide` → `../../projects/smart_ide` permet aux scripts `ia_dev` de résoudre `projects/smart_ide/conf.json`. Après un clone neuf ou une réorganisation des dossiers, exécuter si besoin : + +```bash +./scripts/ensure-ia-dev-smart-ide-project-link.sh +``` + +L’exécution des scripts reste **depuis la racine `ia_dev/`**, comme dans la documentation amont du dépôt historique [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git) ; **smart_ide** fournit l’environnement IDE, les scripts hôte, les unités systemd et les journaux sous [`logs/`](../logs/README.md). + +## Journaux + +- Tirage Git planifié des clones : [`logs/git-pull-projects.log`](../logs/README.md) (via [`cron/git-pull-wrapper.sh`](../cron/git-pull-wrapper.sh)). +- Scripts `ia_dev` : [`logs/ia_dev.log`](../logs/README.md) (via [`ia_dev/lib/smart_ide_logs.sh`](../ia_dev/lib/smart_ide_logs.sh)). + +## Service d’intégration + +Le périmètre « service » côté monorepo est documenté sous [`services/ia_dev/`](../services/ia_dev/README.md) (contrat, chemins, variables de référence). + +## Relation aux dépôts + +| Élément | Rôle | +|---------|------| +| **smart_ide** | Cible UX IDE, scripts socle, systemd, doc de déploiement, **`logs/`** | +| **`ia_dev/`** (module dans ce dépôt) | Agents, déploiements, ticketing ; confs projet dans `./projects/` + liens sous `ia_dev/projects/` | + +Le futur **agent gateway** doit traiter **`./ia_dev`** comme chemin canonique sur le serveur sauf configuration contraire. Voir [system-architecture.md](./system-architecture.md). + +## Trajectoire : service `ia-dev-gateway` + +Un service HTTP dédié ([features/ia-dev-service.md](./features/ia-dev-service.md), [API/ia-dev-gateway.md](./API/ia-dev-gateway.md)) prendra le relais pour les **clients** (Lapce, front, orchestrateur) : le répertoire **`./ia_dev`** reste la **source de fichiers** côté hôte jusqu’à une éventuelle extraction ou conteneurisation documentée ailleurs. + +1. **Phase actuelle** : module dans **smart_ide** + exécution manuelle / scripts depuis la racine `ia_dev`. +2. **Phase gateway** : binaire `ia-dev-gateway` sur l’hôte, `IA_DEV_ROOT` pointant vers `./ia_dev`. +3. **Phase fork / mirror** : le dépôt amont `ia_dev` peut continuer à exister sur la forge ; la copie de travail dans **smart_ide** suit le flux Git habituel du monorepo. diff --git a/docs/ia_dev-project-smart_ide.md b/docs/ia_dev-project-smart_ide.md index d9331b6..3ffeed5 100644 --- a/docs/ia_dev-project-smart_ide.md +++ b/docs/ia_dev-project-smart_ide.md @@ -40,5 +40,5 @@ Règle de contexte (fichiers sous `ia_dev/`, `docs/`, `services/`, etc.) : [`.cu ## Liens - Dépôt : `https://git.4nkweb.com/4nk/smart_ide` -- Sous-module `ia_dev` : [docs/ia_dev-submodule.md](./ia_dev-submodule.md) +- Module `ia_dev` : [docs/ia_dev-module.md](./ia_dev-module.md) - Gateway dev : [docs/features/ia-dev-service.md](./features/ia-dev-service.md) diff --git a/docs/ia_dev-submodule.md b/docs/ia_dev-submodule.md deleted file mode 100644 index 9c69866..0000000 --- a/docs/ia_dev-submodule.md +++ /dev/null @@ -1,64 +0,0 @@ -# Submodule `ia_dev` - -The repository [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git) is integrated as a **Git submodule** at `./ia_dev`. - -It holds the **centralized AI agent team** (definitions under `.cursor/agents/`, `.cursor/rules/`), `deploy/`, `gitea-issues/`, etc. Les **`conf.json` par projet** pour ce monorepo sont versionnés sous **`./projects//` à la racine de `smart_ide`** (voir [projects/README.md](../projects/README.md)), pas mélangés avec les clones applicatifs (`../projects/` ou autre). Un **lien symbolique** `ia_dev/projects/smart_ide` → `../../projects/smart_ide` permet aux scripts ia_dev de résoudre `projects/smart_ide/conf.json`. Après chaque `git submodule update --init`, exécuter : - -```bash -./scripts/ensure-ia-dev-smart-ide-project-link.sh -``` - -Execution remains **from the `ia_dev` root** per upstream README; `smart_ide` provides the surrounding IDE vision, host scripts, and systemd units. - -## Clone with submodule - -```bash -git clone --recurse-submodules https://git.4nkweb.com/4nk/smart_ide.git -cd smart_ide -``` - -## Submodule already present but empty - -```bash -git submodule update --init --recursive -``` - -## Update to latest `ia_dev` commit - -```bash -cd ia_dev -git fetch origin -git checkout # e.g. main -cd .. -git add ia_dev -git commit -m "chore: bump ia_dev submodule" -``` - -## SSH remote for `ia_dev` (optional) - -If you use SSH instead of HTTPS for the submodule: - -```bash -git config submodule.ia_dev.url git@git.4nkweb.com:4nk/ia_dev.git -``` - -(Requires host key and deploy key configured for Gitea.) - -## Relation to `smart_ide` - -| Repository | Role | -|------------|------| -| **smart_ide** | IDE target UX, local AI stack scripts, systemd, docs for deployment | -| **ia_dev** (submodule) | Agent registry, deploy/ticketing/notary pipelines ; configs projet **smart_ide** dans `./projects/` (racine monorepo) + lien | - -The future **agent gateway** should treat `./ia_dev` as the canonical checkout path on the server unless overridden by configuration. See [system-architecture.md](./system-architecture.md). - -## Trajectoire : service `ia-dev-gateway` - -Un service HTTP dédié ([features/ia-dev-service.md](./features/ia-dev-service.md), [API/ia-dev-gateway.md](./API/ia-dev-gateway.md)) prendra le relais pour les **clients** (Lapce, front, orchestrateur) : le sous-module reste la **source de vérité des fichiers** `ia_dev` jusqu’à migration vers un **fork** cloné ou embarqué au même chemin (`IA_DEV_ROOT`). - -1. **Phase actuelle** : sous-module + exécution manuelle / scripts depuis la racine `ia_dev`. -2. **Phase gateway** : binaire `ia-dev-gateway` sur l’hôte, `IA_DEV_ROOT` pointant vers `./ia_dev`. -3. **Phase fork** : le fork `ia_dev` est référencé par `smart_ide` (sous-module mis à jour vers le fork ou remplacement documenté) ; le gateway ne change pas de contrat HTTP. - -Ne pas supprimer le sous-module tant que la CI et les postes de dev ne sont pas alignés sur le fork et le service. diff --git a/docs/implementation-rollout.md b/docs/implementation-rollout.md index c85582e..f890ed6 100644 --- a/docs/implementation-rollout.md +++ b/docs/implementation-rollout.md @@ -10,7 +10,7 @@ Ce document résume l’exécution du plan « Plateforme IDE multi-env » et les - [features/lapce-porting-roadmap.md](./features/lapce-porting-roadmap.md) - [features/sso-docv-enso.md](./features/sso-docv-enso.md) - [features/browser-automation-criteria.md](./features/browser-automation-criteria.md) -- Mises à jour : [system-architecture.md](./system-architecture.md), [deployment-target.md](./deployment-target.md), [ia_dev-submodule.md](./ia_dev-submodule.md), [API/README.md](./API/README.md), [services.md](./services.md) +- Mises à jour : [system-architecture.md](./system-architecture.md), [deployment-target.md](./deployment-target.md), [ia_dev-module.md](./ia_dev-module.md), [API/README.md](./API/README.md), [services.md](./services.md) ## Réalisé (code minimal) diff --git a/docs/system-architecture.md b/docs/system-architecture.md index 150ac85..0218f23 100644 --- a/docs/system-architecture.md +++ b/docs/system-architecture.md @@ -19,7 +19,7 @@ Conséquences : - Les répertoires sous `services/` font partie du **même cycle de vie** que le reste du monorepo (revue, déploiement, systemd). - **`core_ide/`** est un **clone local** de l’éditeur **Lapce** (socle applicatif), présent **dans l’arborescence du monorepo** sur disque ; il est **exclu de l’index Git du parent** par volumétrie (voir racine `.gitignore`). Mise à jour : procédure dans [core-ide.md](./core-ide.md). -- `ia_dev` est aujourd’hui un **sous-module** pointant vers la forge 4NK ([ia_dev-submodule.md](./ia_dev-submodule.md)). Un service HTTP **`ia-dev-gateway`** ([features/ia-dev-service.md](./features/ia-dev-service.md)) exposera le registre et les exécutions agents ; trajectoire documentée dans le sous-module. Si la politique « un seul historique » devient stricte, la trajectoire possible est **fusion** du contenu agent dans ce dépôt (à planifier), en conservant la même séparation logique des dossiers. +- `ia_dev` est un **répertoire versionné** dans ce monorepo (évolution historique depuis le dépôt forge [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git)) ; intégration et journaux : [ia_dev-module.md](./ia_dev-module.md), [`services/ia_dev/`](../services/ia_dev/README.md), [`logs/README.md`](../logs/README.md). Un service HTTP **`ia-dev-gateway`** ([features/ia-dev-service.md](./features/ia-dev-service.md)) exposera le registre et les exécutions agents. - **Orchestrateur** HTTP : [features/orchestrator-api.md](./features/orchestrator-api.md) — serveur stub sous `services/smart-ide-orchestrator/` ; routage intentions → Ollama, AnythingLLM, micro-services, `ia-dev-gateway` (forward HTTP à compléter). ## Cartographie des ressources (arborescence) @@ -34,10 +34,11 @@ Conséquences : | `core_ide/` | **Sources Lapce** — socle applicatif (build éditeur, personnalisations) — clone amont, hors index du parent | | `extensions/anythingllm-workspaces/` | Outils / modèles alignés AnythingLLM et workspaces par projet | | `scripts/` , `setup/` , `systemd/` | Installation hôte, scripts d’exploitation, unités utilisateur pour services | +| `cron/` | Pull **Git** planifié des clones décrits par `projects//conf.json` (`project_path`) — [cron/README.md](../cron/README.md) | | `services/local-office/` | **API REST** Office (upload, commandes docx, stockage SQLite + fichiers) ; complément programmatique à ONLYOFFICE | | `services/docv/` | **Contrat d’intégration** docv (hors monorepo) ; données projet sous `../projects//data/` ; pas de code applicatif docv ici — [features/docv-service-integration.md](./features/docv-service-integration.md) | | `projects//` (racine monorepo) | **Confs seules** pour `ia_dev` (`conf.json`) — **pas** les clones Git ; clones typiquement sous `../projects/` ou autre racine ; voir [projects/README.md](../projects/README.md) | -| `ia_dev/` | Agents, déploiements — exécution sous policy ; `projects//` du sous-module peut pointer vers `../../projects/` (lien) ; voir sous-module | +| `ia_dev/` | Agents, déploiements — exécution sous policy ; `ia_dev/projects/` peut pointer vers `../../projects/` (lien) ; voir [ia_dev-module.md](./ia_dev-module.md) | | `services/ia-dev-gateway/` | Gateway HTTP (stub runner) : registre agents `.md`, runs, SSE — [features/ia-dev-service.md](./features/ia-dev-service.md) | | `services/smart-ide-orchestrator/` | Routage intentions (stub forward) — [features/orchestrator-api.md](./features/orchestrator-api.md) | @@ -45,9 +46,9 @@ Conséquences : Chaque environnement possède ses **URLs**, **secrets** et **politiques** (AnythingLLM, tokens micro-services, OIDC front — docv). Pas de configuration sensible dans le dépôt : `.secrets//` ou variables d’hébergement. Détail : [platform-target.md](./platform-target.md). -## Checkout `ia_dev` dans ce dépôt +## Module `ia_dev` dans ce dépôt -Le dépôt [**ia_dev**](https://git.4nkweb.com/4nk/ia_dev.git) est relié à `smart_ide` comme **sous-module Git** sous `./ia_dev` (forge 4NK, pas GitHub). Sur le serveur SSH, l’**agent gateway** et les outils peuvent pointer vers ce chemin comme racine d’exécution des agents (tout script invoqué depuis la racine `ia_dev`, comme documenté en amont). Voir [ia_dev-submodule.md](./ia_dev-submodule.md). +Le répertoire **`./ia_dev`** fait partie du dépôt **smart_ide** (référence historique : [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git) sur la forge). Sur le serveur SSH, l’**agent gateway** et les outils peuvent pointer vers ce chemin comme racine d’exécution des agents (scripts invoqués depuis la racine `ia_dev`). Voir [ia_dev-module.md](./ia_dev-module.md) et [services/ia_dev/](../services/ia_dev/README.md). ## Répartition physique (première cible) @@ -175,7 +176,7 @@ flowchart TB docs[docs] svc[services] coreIde[core_ide] - ia[ia_dev_submodule] + ia[ia_dev_module] ext[extensions] scr[scripts_setup_systemd] end diff --git a/ia_dev b/ia_dev index e8c0db2..756bab0 160000 --- a/ia_dev +++ b/ia_dev @@ -1 +1 @@ -Subproject commit e8c0db220005ca7e670e496931e293b57bc63d9c +Subproject commit 756bab0cd8d4d77dd2e83eaf108efc4c9d132fa1 diff --git a/logs/.gitignore b/logs/.gitignore new file mode 100644 index 0000000..eac39bc --- /dev/null +++ b/logs/.gitignore @@ -0,0 +1,2 @@ +# Fichiers de journal locaux uniquement +*.log diff --git a/logs/README.md b/logs/README.md new file mode 100644 index 0000000..1b87f03 --- /dev/null +++ b/logs/README.md @@ -0,0 +1,12 @@ +# Journaux smart_ide (tâches de fond et ia_dev) + +Les fichiers `*.log` sous ce répertoire sont **produits localement** par la machine qui exécute les timers systemd utilisateur, les cron, ou les scripts `ia_dev`. Ils ne sont **pas versionnés** (voir `.gitignore`). + +| Fichier | Origine | +|---------|---------| +| `git-pull-projects.log` | Tirage Git planifié des clones ([`cron/git-pull-wrapper.sh`](../cron/git-pull-wrapper.sh)), variable `PULL_SYNC_LOG` dans [`cron/config.env`](../cron/config.env). | +| `ia_dev.log` | Exécutions des scripts shell sous `ia_dev/` lorsque ce dépôt est un checkout **smart_ide** avec `ia_dev` au bon emplacement (détection via `cron/git-pull-wrapper.sh` ou `projects/smart_ide/`). | + +Variable interne utilisée par les scripts : `SMART_IDE_LOG_IA_DEV_ROOT` (racine `ia_dev`), posée par [`ia_dev/lib/smart_ide_logs.sh`](../ia_dev/lib/smart_ide_logs.sh). + +Service métier associé : [`services/ia_dev/`](../services/ia_dev/README.md). diff --git a/projects/README.md b/projects/README.md index f5cf4f6..177d328 100644 --- a/projects/README.md +++ b/projects/README.md @@ -6,14 +6,30 @@ Ce répertoire, à la **racine du monorepo `smart_ide`**, ne contient que les ** Les dépôts sources des produits (ex. backend **docv** sous un chemin du type `…/enso/docv`, autres apps) doivent vivre **ailleurs**, selon la convention du poste — typiquement un répertoire **frère** du monorepo, par ex. **`../projects//`** (relatif à la racine `smart_ide`), **distinct** de `./projects/` ici. -- **`./projects/`** (ce dossier) → uniquement `conf.json` (+ métadonnées légères) pour que `ia_dev` résolve `projects//conf.json` via le lien symbolique décrit dans [docs/ia_dev-submodule.md](../docs/ia_dev-submodule.md). +- **`./projects/`** (ce dossier) → uniquement `conf.json` (+ métadonnées légères) pour que `ia_dev` résolve `projects//conf.json` via le lien symbolique décrit dans [docs/ia_dev-module.md](../docs/ia_dev-module.md). - **`../projects/`** (ou autre racine configurée) → arborescences Git complètes, builds, etc. ; `project_path` dans chaque `conf.json` pointe vers ces chemins **absolus**. ## `smart_ide` - Fichier : [`smart_ide/conf.json`](./smart_ide/conf.json) -- Après `git submodule update`, exécuter [`scripts/ensure-ia-dev-smart-ide-project-link.sh`](../scripts/ensure-ia-dev-smart-ide-project-link.sh) pour recréer le lien `ia_dev/projects/smart_ide` → `../../projects/smart_ide`. +- Après clone ou réorganisation des dossiers, exécuter si besoin [`scripts/ensure-ia-dev-smart-ide-project-link.sh`](../scripts/ensure-ia-dev-smart-ide-project-link.sh) pour recréer le lien `ia_dev/projects/smart_ide` → `../../projects/smart_ide`. + +## `enso` + +- Fichier : [`enso/conf.json`](./enso/conf.json) — monorepo **enso** (`project_path` typique `/home/ncantu/code/enso`), déploiement `deploy/scripts_v2`, forge **4nk/enso** (wiki / issues), mails ticketing `AI.ENSO.*@4nkweb.com`. +- Cron fragment : [`cron/fragments/enso.cron`](../cron/fragments/enso.cron). +- Pour que **`ia_dev`** résolve `projects/enso/conf.json`, créer sous `ia_dev/projects/` un lien symbolique `enso` → `../../projects/enso` (même principe que `smart_ide`). + +## Synchronisation Git planifiée (`cron/`) + +Pour **chaque** `projects//conf.json`, le tirage automatique utilise la **config centralisée** [`cron/config.env`](../cron/config.env) (`PULL_SYNC_*`) et le wrapper [`cron/git-pull-wrapper.sh`](../cron/git-pull-wrapper.sh), qui appelle [`cron/git-pull-project-clones.sh`](../cron/git-pull-project-clones.sh) (`git fetch` / **`merge --ff-only`** si possible). + +- **Activer le timer systemd utilisateur** (recommandé) : [`scripts/install-git-pull-systemd-user.sh`](../scripts/install-git-pull-systemd-user.sh) +- Désactiver pour un id projet : `"cron": { "git_pull": false }` dans le `conf.json` concerné. +- Désactiver tout le mécanisme : `PULL_SYNC_ENABLED=0` dans `config.env` ou `cron/config.local.env`. + +Détail : [`cron/README.md`](../cron/README.md). Les clones restent sous le chemin **absolu** `project_path`. ## Référence amont -Schéma des champs : `ia_dev/projects/README.md` dans le sous-module (documentation ia_dev). +Schéma des champs : `ia_dev/projects/README.md` dans le sous-module (documentation ia_dev). Le bloc optionnel **`cron`** est une extension **smart_ide** pour les scripts locaux ; `ia_dev` peut l’ignorer s’il ne le lit pas. diff --git a/scripts/install-git-pull-systemd-user.sh b/scripts/install-git-pull-systemd-user.sh new file mode 100755 index 0000000..5be9942 --- /dev/null +++ b/scripts/install-git-pull-systemd-user.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash +# Installe le timer systemd utilisateur pour git-pull (config centralisée : cron/config.env). +# Usage : ./scripts/install-git-pull-systemd-user.sh +# Puis : systemctl --user status git-pull-project-clones.timer +set -euo pipefail + +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" +UNIT_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/systemd/user" +SERVICE_IN="${ROOT}/systemd/user/git-pull-project-clones.service.in" +TIMER_SRC="${ROOT}/systemd/user/git-pull-project-clones.timer" +SERVICE_OUT="${UNIT_DIR}/git-pull-project-clones.service" +TIMER_OUT="${UNIT_DIR}/git-pull-project-clones.timer" + +mkdir -p "$UNIT_DIR" +sed "s|@SMART_IDE_ROOT@|$ROOT|g" "$SERVICE_IN" >"$SERVICE_OUT" +cp -f "$TIMER_SRC" "$TIMER_OUT" +chmod 0644 "$SERVICE_OUT" "$TIMER_OUT" +chmod +x "${ROOT}/cron/git-pull-wrapper.sh" "${ROOT}/cron/git-pull-project-clones.sh" + +systemctl --user daemon-reload +systemctl --user enable git-pull-project-clones.timer +systemctl --user start git-pull-project-clones.timer + +echo "Installé : $SERVICE_OUT" +echo "Timer : $(systemctl --user is-active git-pull-project-clones.timer) (next: $(systemctl --user list-timers git-pull-project-clones.timer --no-legend 2>/dev/null | awk '{print $1,$2}' || true))" +echo "Config : $ROOT/cron/config.env (+ optionnel cron/config.local.env)" +echo "Logs : voir PULL_SYNC_LOG dans config.env (défaut /logs/git-pull-projects.log)" diff --git a/services/ia_dev/.env.example b/services/ia_dev/.env.example new file mode 100644 index 0000000..26fa647 --- /dev/null +++ b/services/ia_dev/.env.example @@ -0,0 +1,6 @@ +# Référence d’intégration (valeurs réelles hors dépôt). +# Racine d’exécution des scripts agents / deploy (souvent …/smart_ide/ia_dev). +# IA_DEV_ROOT=/chemin/vers/smart_ide/ia_dev + +# Journal agrégé smart_ide (optionnel ; défaut résolu par ia_dev/lib/smart_ide_logs.sh). +# SMART_IDE_LOG_IA_DEV_ROOT=/chemin/vers/smart_ide/ia_dev diff --git a/services/ia_dev/README.md b/services/ia_dev/README.md new file mode 100644 index 0000000..c61d300 --- /dev/null +++ b/services/ia_dev/README.md @@ -0,0 +1,21 @@ +# ia_dev — module smart_ide + +Le répertoire **`ia_dev/`** à la racine du monorepo **smart_ide** est le **module agents / déploiement / ticketing** (équivalent historique du dépôt [4nk/ia_dev](https://git.4nkweb.com/4nk/ia_dev.git) lorsqu’il était sous-module Git). Il est **versionné dans ce dépôt** ; il n’y a plus de `git submodule update` pour l’obtenir. + +## Rôle + +- Scripts **`deploy/`**, **`gitea-issues/`**, outillage **`tools/`**, définitions **`.cursor/`**. +- Résolution des projets via **`projects//conf.json`** à la racine **smart_ide** et liens sous `ia_dev/projects/` (voir [projects/README.md](../../projects/README.md), [docs/ia_dev-module.md](../../docs/ia_dev-module.md)). + +## Journaux smart_ide + +Les exécutions shell concernées écrivent des événements dans **`logs/ia_dev.log`** à la racine **smart_ide** lorsque la détection du monorepo réussit (présence de `cron/git-pull-wrapper.sh` ou de `projects/smart_ide/` au-dessus de `ia_dev/`). Détail : [`logs/README.md`](../../logs/README.md), implémentation [`ia_dev/lib/smart_ide_logs.sh`](../../ia_dev/lib/smart_ide_logs.sh). + +## Variables (référence) + +Les chemins réels restent hors dépôt (secrets, clones). Pour l’intégration orchestrateur / gateway, voir [`.env.example`](./.env.example). + +## Liens + +- Architecture : [docs/system-architecture.md](../../docs/system-architecture.md) +- Gateway HTTP cible : [docs/features/ia-dev-service.md](../../docs/features/ia-dev-service.md) diff --git a/systemd/user/git-pull-project-clones.service.in b/systemd/user/git-pull-project-clones.service.in new file mode 100644 index 0000000..74314f0 --- /dev/null +++ b/systemd/user/git-pull-project-clones.service.in @@ -0,0 +1,8 @@ +[Unit] +Description=smart_ide — git fetch/ff pour clones (projects/*/conf.json) +Documentation=file://@SMART_IDE_ROOT@/cron/README.md + +[Service] +Type=oneshot +WorkingDirectory=@SMART_IDE_ROOT@ +ExecStart=@SMART_IDE_ROOT@/cron/git-pull-wrapper.sh diff --git a/systemd/user/git-pull-project-clones.timer b/systemd/user/git-pull-project-clones.timer new file mode 100644 index 0000000..5754dc7 --- /dev/null +++ b/systemd/user/git-pull-project-clones.timer @@ -0,0 +1,10 @@ +[Unit] +Description=smart_ide — timer tirage Git clones (toutes les 15 minutes) + +[Timer] +# Calendrier : modifier ici puis reinstall (scripts/install-git-pull-systemd-user.sh) +OnCalendar=*:0/15 +Persistent=true + +[Install] +WantedBy=timers.target