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
This commit is contained in:
Nicolas Cantu 2026-04-03 17:50:49 +02:00
parent bc3c75e15f
commit d98e6bce60
29 changed files with 409 additions and 95 deletions

View File

@ -6,11 +6,11 @@ alwaysApply: false
# smart_ide ↔ ia_dev (projet et environnement) # 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`). - **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** sil manque avant des actions dépendantes du env. - **Environnement :** `test` | `pprod` | `prod`. Le reprendre depuis le message utilisateur ; **demander** sil 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`. - **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 lenv choisi (ex. test → `AI.SMART_IDE.TEST@4nkweb.com`). - **MAIL_TO (ticketing / mails) :** lire `projects/smart_ide/conf.json` (racine workspace) → `tickets.authorized_emails.to` pour lenv 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. - **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.

View File

@ -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). 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 dagents, scripts `deploy/`, ticketing Gitea, etc. Les **fichiers `conf.json`** pour ce monorepo sont sous [`./projects/<id>/`](./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 dagents**, 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/<id>/`](./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 ## 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/<id>/data`, Git / Ollama / AnythingLLM | | [docs/ecosystem-architecture-and-sync.md](./docs/ecosystem-architecture-and-sync.md) | smart_ide, clones projet, API IA, docv / données `../projects/<id>/data`, Git / Ollama / AnythingLLM |
| [docs/deployment-target.md](./docs/deployment-target.md) | Client Linux + SSH : serveur = socle IA + repos | | [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/` | | [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 dinté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/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/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) | | [docs/features/claw-harness-api.md](./docs/features/claw-harness-api.md) | Intégration claw-code (multi-modèles, sans Anthropic dans les gabarits) |

60
cron/README.md Normal file
View File

@ -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/<id>/`](../projects/) (fichiers `conf.json`), lit **`project_path`**, et pour chaque dépôt Git:
1. **`git fetch origin <branche_courante>`**
2. si **`origin/<branche>`** est en avance en **fast-forward****`git merge --ff-only origin/<branche>`**
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/<id>/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 sexécuter après un `merge --ff-only` : voir [`scripts/anythingllm-pull-sync`](../scripts/anythingllm-pull-sync/).

17
cron/config.env Normal file
View File

@ -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 lexé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 = <racine smart_ide>/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=

View File

@ -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 : <racine smart_ide>/logs/git-pull-projects.log
# PULL_SYNC_MODE=project
# PULL_SYNC_PROJECT_ID=enso

5
cron/fragments/README.md Normal file
View File

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

View File

@ -0,0 +1,2 @@
# Préférer systemd + cron/config.env. Sinon crontab :
# */15 * * * * USER cd SMART_IDE_ROOT && ./cron/git-pull-wrapper.sh

View File

@ -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

3
cron/fragments/enso.cron Normal file
View File

@ -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

View File

@ -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

90
cron/git-pull-project-clones.sh Executable file
View File

@ -0,0 +1,90 @@
#!/usr/bin/env bash
# For each projects/<id>/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 <id>]" >&2
echo " Reads projects/<id>/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

44
cron/git-pull-wrapper.sh Executable file
View File

@ -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

View File

@ -39,7 +39,9 @@ Index des documents à la racine de `docs/`. Les **fonctionnalités** détaillé
| Document | Contenu | | 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 dintégration du module `ia_dev` |
## Fonctionnalités (`features/`) ## Fonctionnalités (`features/`)

View File

@ -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 | | Élément | Rôle | Où vit la vérité opérationnelle |
|---------|------|----------------------------------| |---------|------|----------------------------------|
| **smart_ide** | Socle : doc, `services/*`, scripts, systemd, confs `ia_dev` (`./projects/<id>/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/<id>/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/<nom>/` ou équivalent) | | **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/<nom>/` 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/` | | **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 | | **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. - **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). - **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 larborescence 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 ### 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) ### 4.1 Ordre de référence (nouvelle machine ou post-clone)
1. Cloner **smart_ide** avec sous-modules : `git clone --recurse-submodules …`. 1. Cloner **smart_ide** : `git clone …` (le répertoire **`ia_dev/`** suit le même historique Git que le monorepo).
2. Initialiser / mettre à jour **`ia_dev`** : `git submodule update --init --recursive`. 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. Recréer le lien conf projet : `./scripts/ensure-ia-dev-smart-ide-project-link.sh` ([projects/README.md](../projects/README.md)). 3. Cloner les **projets applicatifs** à lemplacement convenu (ex. `../projects/<id>/`) et vérifier les chemins **absolus** dans `projects/<id>/conf.json` si `ia_dev` doit les piloter.
4. Cloner les **projets applicatifs** à lemplacement convenu (ex. `../projects/<id>/`) et vérifier les chemins **absolus** dans `projects/<id>/conf.json` si `ia_dev` doit les piloter. 4. Démarrer **Ollama** et **AnythingLLM** sur lhôte ([services.md](./services.md)) ; créer les **workspaces** et noter les **slugs**.
5. Démarrer **Ollama** et **AnythingLLM** sur lhôte ([services.md](./services.md)) ; créer les **workspaces** et noter les **slugs**. 5. Configurer lenvironnement de synchro AnythingLLM : `~/.config/4nk/anythingllm-sync.env` (URL, clé API) — ne pas commiter les secrets.
6. Configurer lenvironnement 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 denvironnement é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).
7. Par dépôt à indexer : fichier **`.anythingllm.json`** à la racine avec `{ "workspaceSlug": "…" }` (ou variable denvironnement é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) ### 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/<id>/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`**. 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. 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 ### 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é. 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). 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`) ### 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. - 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é » ### 4.5 Cohérence « clone présent + workspace aligné »

View File

@ -2,7 +2,7 @@
## Objectif ## Objectif
Remplacer à terme lappel **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 lappel **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`). - 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`).
- **Nimplémente pas** la logique métier des projets : il **oriente** les jobs vers `projects/<id>/`, `deploy/`, scripts existants, avec policy et journalisation. - **Nimplémente pas** la logique métier des projets : il **oriente** les jobs vers `projects/<id>/`, `deploy/`, scripts existants, avec policy et journalisation.
@ -21,7 +21,7 @@ Remplacer à terme lappel **direct** au dépôt sous-module [`ia_dev`](../ia_
Aujourdhui `./ia_dev` reste le **checkout canonique** sur lhôte. Le binaire `ia-dev-gateway` reçoit `IA_DEV_ROOT` (défaut : répertoire parent du service ou chemin absolu vers `./ia_dev`). Aujourdhui `./ia_dev` reste le **checkout canonique** sur lhô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 quun 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) ## API (spécification)

37
docs/ia_dev-module.md Normal file
View File

@ -0,0 +1,37 @@
# Module `ia_dev` dans smart_ide
Le répertoire **`./ia_dev`** à la racine du monorepo **smart_ide** contient l**équipe dagents** (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/<id>/`** à 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
```
Lexé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 lenvironnement 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 dinté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 lhô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.

View File

@ -40,5 +40,5 @@ Règle de contexte (fichiers sous `ia_dev/`, `docs/`, `services/`, etc.) : [`.cu
## Liens ## Liens
- Dépôt : `https://git.4nkweb.com/4nk/smart_ide` - 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) - Gateway dev : [docs/features/ia-dev-service.md](./features/ia-dev-service.md)

View File

@ -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/<id>/` à 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 <branch-or-tag> # 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 lhô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.

View File

@ -10,7 +10,7 @@ Ce document résume lexécution du plan « Plateforme IDE multi-env » et les
- [features/lapce-porting-roadmap.md](./features/lapce-porting-roadmap.md) - [features/lapce-porting-roadmap.md](./features/lapce-porting-roadmap.md)
- [features/sso-docv-enso.md](./features/sso-docv-enso.md) - [features/sso-docv-enso.md](./features/sso-docv-enso.md)
- [features/browser-automation-criteria.md](./features/browser-automation-criteria.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) ## Réalisé (code minimal)

View File

@ -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). - 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 larborescence du monorepo** sur disque ; il est **exclu de lindex Git du parent** par volumétrie (voir racine `.gitignore`). Mise à jour : procédure dans [core-ide.md](./core-ide.md). - **`core_ide/`** est un **clone local** de léditeur **Lapce** (socle applicatif), présent **dans larborescence du monorepo** sur disque ; il est **exclu de lindex Git du parent** par volumétrie (voir racine `.gitignore`). Mise à jour : procédure dans [core-ide.md](./core-ide.md).
- `ia_dev` est aujourdhui 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). - **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) ## 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 | | `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 | | `extensions/anythingllm-workspaces/` | Outils / modèles alignés AnythingLLM et workspaces par projet |
| `scripts/` , `setup/` , `systemd/` | Installation hôte, scripts dexploitation, unités utilisateur pour services | | `scripts/` , `setup/` , `systemd/` | Installation hôte, scripts dexploitation, unités utilisateur pour services |
| `cron/` | Pull **Git** planifié des clones décrits par `projects/<id>/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/local-office/` | **API REST** Office (upload, commandes docx, stockage SQLite + fichiers) ; complément programmatique à ONLYOFFICE |
| `services/docv/` | **Contrat dintégration** docv (hors monorepo) ; données projet sous `../projects/<id>/data/` ; pas de code applicatif docv ici — [features/docv-service-integration.md](./features/docv-service-integration.md) | | `services/docv/` | **Contrat dintégration** docv (hors monorepo) ; données projet sous `../projects/<id>/data/` ; pas de code applicatif docv ici — [features/docv-service-integration.md](./features/docv-service-integration.md) |
| `projects/<id>/` (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) | | `projects/<id>/` (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/<id>/` du sous-module peut pointer vers `../../projects/<id>` (lien) ; voir sous-module | | `ia_dev/` | Agents, déploiements — exécution sous policy ; `ia_dev/projects/<id>` peut pointer vers `../../projects/<id>` (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/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) | | `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/<env>/` ou variables dhébergement. Détail : [platform-target.md](./platform-target.md). 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/<env>/` ou variables dhé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 dexé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 dexé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) ## Répartition physique (première cible)
@ -175,7 +176,7 @@ flowchart TB
docs[docs] docs[docs]
svc[services] svc[services]
coreIde[core_ide] coreIde[core_ide]
ia[ia_dev_submodule] ia[ia_dev_module]
ext[extensions] ext[extensions]
scr[scripts_setup_systemd] scr[scripts_setup_systemd]
end end

2
ia_dev

@ -1 +1 @@
Subproject commit e8c0db220005ca7e670e496931e293b57bc63d9c Subproject commit 756bab0cd8d4d77dd2e83eaf108efc4c9d132fa1

2
logs/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# Fichiers de journal locaux uniquement
*.log

12
logs/README.md Normal file
View File

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

View File

@ -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/<nom>/`** (relatif à la racine `smart_ide`), **distinct** de `./projects/` ici. 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/<nom>/`** (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/<id>/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/<id>/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**. - **`../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` ## `smart_ide`
- Fichier : [`smart_ide/conf.json`](./smart_ide/conf.json) - 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/<id>/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 ## 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 lignorer sil ne le lit pas.

View File

@ -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 <racine smart_ide>/logs/git-pull-projects.log)"

View File

@ -0,0 +1,6 @@
# Référence dintégration (valeurs réelles hors dépôt).
# Racine dexé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

21
services/ia_dev/README.md Normal file
View File

@ -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) lorsquil était sous-module Git). Il est **versionné dans ce dépôt** ; il ny a plus de `git submodule update` pour lobtenir.
## Rôle
- Scripts **`deploy/`**, **`gitea-issues/`**, outillage **`tools/`**, définitions **`.cursor/`**.
- Résolution des projets via **`projects/<id>/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 linté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)

View File

@ -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

View File

@ -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