projects: single conf.json per id, workspace in smart_ide block; example/ template; remove .code-workspace files

This commit is contained in:
4NK 2026-04-03 21:56:51 +02:00 committed by Nicolas Cantu
parent b21ac2cf64
commit 524d38b9ff
13 changed files with 107 additions and 95 deletions

5
.gitignore vendored
View File

@ -12,11 +12,12 @@ cron/config.local.env
# logs/ : le répertoire reste versionné (README.md, logs/.gitignore) ; aucun fichier journal versionné # logs/ : le répertoire reste versionné (README.md, logs/.gitignore) ; aucun fichier journal versionné
logs/**/*.log logs/**/*.log
# projects/ : ignorer tout répertoire d'id sous projects/ sauf les squelettes versionnés (conf, workspace, etc.) # projects/ : ignorer tout répertoire d'id sous projects/ sauf les squelettes versionnés (conf.json par id, gabarit example/)
projects/* projects/*
!projects/README.md !projects/README.md
!projects/example/
!projects/example/**
!projects/active-project.json.example !projects/active-project.json.example
!projects/ssh-config.example
!projects/enso/ !projects/enso/
!projects/enso/** !projects/enso/**
!projects/smart_ide/ !projects/smart_ide/

View File

@ -8,7 +8,7 @@ alwaysApply: false
Quand le périmètre touche ce dépôt et le module **`ia_dev/`** : Quand le périmètre touche ce dépôt et le module **`ia_dev/`** :
- **Projet courant (IDE / smart_ide) :** lire dans lordre: fichier local **`projects/active-project.json`** (champ **`id`**, non versionné — copier depuis `projects/active-project.json.example`) ; sinon variable **`SMART_IDE_PROJECT_ID`** ; sinon paramètre workspace **`smartIde.activeProjectId`** dans le fichier **`.code-workspace`** ou **`.vscode/settings.json`** ; sinon défaut **`smart_ide`**. La conf versionnée du projet est **`projects/<id>/conf.json`** ([docs/repo/projects-directory.md](../../docs/repo/projects-directory.md)). Données déployées et SSH : [docs/features/remote-deployed-data-ssh.md](../../docs/features/remote-deployed-data-ssh.md). - **Projet courant (IDE / smart_ide) :** lire dans lordre: fichier local **`projects/active-project.json`** (champ **`id`**, non versionné — copier depuis `projects/active-project.json.example`) ; sinon variable **`SMART_IDE_PROJECT_ID`** ; sinon **`smartIde.activeProjectId`** dans **`smart_ide.workspace.settings`** de **`projects/<id>/conf.json`** (id déduit du dossier ouvert ou du workspace) ; sinon le même paramètre dans un **`.code-workspace`** local ou **`.vscode/settings.json`** ; sinon défaut **`smart_ide`**. La conf versionnée du projet est **`projects/<id>/conf.json`** ([docs/repo/projects-directory.md](../../docs/repo/projects-directory.md)). Données déployées et SSH : [docs/features/remote-deployed-data-ssh.md](../../docs/features/remote-deployed-data-ssh.md).
- **Lien ia_dev :** pour lid choisi, `ia_dev/projects/<id>` doit être un **lien** vers `../../projects/<id>` lorsque les scripts ia_dev résolvent ce chemin (script `scripts/ensure-ia-dev-smart-ide-project-link.sh` pour `smart_ide`). - **Lien ia_dev :** pour lid choisi, `ia_dev/projects/<id>` doit être un **lien** vers `../../projects/<id>` lorsque les scripts ia_dev résolvent ce chemin (script `scripts/ensure-ia-dev-smart-ide-project-link.sh` pour `smart_ide`).
- **Environnement :** `test` | `pprod` | `prod`. Le reprendre depuis le message utilisateur ou depuis **`default_env`** dans `projects/active-project.json` ; **demander** sil manque avant des actions dépendantes du env. - **Environnement :** `test` | `pprod` | `prod`. Le reprendre depuis le message utilisateur ou depuis **`default_env`** dans `projects/active-project.json` ; **demander** sil manque avant des actions dépendantes du env.
- **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/`, `git-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/`, `git-issues/`, etc.

View File

@ -70,13 +70,12 @@ Objectif : indiquer **quel** `projects/<id>/` est actif pour léditeur et les
- Ce fichier est **ignoré par Git** (voir racine `.gitignore`). - Ce fichier est **ignoré par Git** (voir racine `.gitignore`).
- Champs : **`id`** (obligatoire, ex. `enso`), **`default_env`** (optionnel : `test` | `pprod` | `prod`). Lexemple versionné peut contenir dautres clés purement documentaires (ex. **`notes`**) ignorées par les automatisations. - Champs : **`id`** (obligatoire, ex. `enso`), **`default_env`** (optionnel : `test` | `pprod` | `prod`). Lexemple versionné peut contenir dautres clés purement documentaires (ex. **`notes`**) ignorées par les automatisations.
2. **Paramètres du fichier workspace VS Code / Cursor** 2. **Paramètres multi-dossiers VS Code / Cursor**
- Dans le **`.code-workspace`** que vous ouvrez (ex. [`projects/enso/smart_ide.code-workspace`](../enso/smart_ide.code-workspace)), renseigner: - La conf versionnée par projet est **`projects/<id>/conf.json`** : sous **`smart_ide.workspace.settings`**, renseigner **`smartIde.activeProjectId`** (même sémantique quun fichier `.code-workspace`). Les **`folders`** du même bloc décrivent les racines du workspace.
`"smartIde.activeProjectId": "<id>"` - Pour ouvrir léditeur : copier ce bloc dans un **fichier local `.code-workspace`** (non versionné) si besoin, ou aligner **`.vscode/settings.json`** sur ces valeurs pour un dossier unique.
- Même clé possible dans **`.vscode/settings.json`** à la racine du dossier smart_ide pour un dossier unique.
- Ces clés ne sont **pas** des clés natives VS Code : elles servent de **convention** lue par scripts, extensions maison ou règles Cursor (voir [`.smartIde/rules/smart-ide-ia-dev-bridge.mdc`](../../.smartIde/rules/smart-ide-ia-dev-bridge.mdc)). - Ces clés ne sont **pas** des clés natives VS Code : elles servent de **convention** lue par scripts, extensions maison ou règles Cursor (voir [`.smartIde/rules/smart-ide-ia-dev-bridge.mdc`](../../.smartIde/rules/smart-ide-ia-dev-bridge.mdc)).
Ordre de priorité suggéré pour les automatisations : **`projects/active-project.json`** → variable denvironnement **`SMART_IDE_PROJECT_ID`** si défini au lancement → **`smartIde.activeProjectId`** dans les settings du workspace → demande explicite à lutilisateur. Ordre de priorité suggéré pour les automatisations : **`projects/active-project.json`** → variable denvironnement **`SMART_IDE_PROJECT_ID`** si défini au lancement → **`smartIde.activeProjectId`** dans **`smart_ide.workspace.settings`** du `conf.json` du projet concerné, ou dans les settings du workspace ouvert, ou **`.vscode/settings.json`** → demande explicite à lutilisateur.
## Liens ## Liens

View File

@ -38,7 +38,7 @@ Les agents ne modifient pas `projects/<id>/conf.json` sans validation humaine ex
| `deploy.host_stays_on_test` | no | Comportement `deploy-by-script-to.sh` (branche test vs pprod/prod). | | `deploy.host_stays_on_test` | no | Comportement `deploy-by-script-to.sh` (branche test vs pprod/prod). |
| `tickets` | no | URL issues, `authorized_emails` ; le **to** sert à résoudre le projet. | | `tickets` | no | URL issues, `authorized_emails` ; le **to** sert à résoudre le projet. |
| `cron` | no | Extension **smart_ide** : `{ "git_pull": false }` pour désactiver le pull planifié. | | `cron` | no | Extension **smart_ide** : `{ "git_pull": false }` pour désactiver le pull planifié. |
| `smart_ide` | no | Extension **smart_ide** : `remote_data_access`, `anythingllm_workspace_slug`, etc. | | `smart_ide` | no | Extension **smart_ide** : `remote_data_access`, `anythingllm_workspace_slug`, `workspace` (`folders` + `settings`, équivalent `.code-workspace` ; y placer `smartIde.activeProjectId`), etc. |
Détail ticketing : `ia_dev/projects/ia_dev/docs/TICKETS_SPOOL_FORMAT.md`. Détail ticketing : `ia_dev/projects/ia_dev/docs/TICKETS_SPOOL_FORMAT.md`.

View File

@ -8,7 +8,7 @@ Les **sous-répertoires** `projects/<id>/` non listés dans le **`.gitignore`**
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/`** → 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 [ia_dev-module.md](../ia_dev-module.md). - **`./projects/`** → **un seul fichier de configuration par id** : `projects/<id>/conf.json` (y compris le gabarit [`projects/example/conf.json`](../../projects/example/conf.json)). Pas de fichier `.code-workspace` versionné à côté : léquivalent multi-root IDE est **`smart_ide.workspace`** dans ce même `conf.json`. `ia_dev` résout via le lien symbolique décrit dans [ia_dev-module.md](../ia_dev-module.md).
- **`../projects/`** (ou autre racine configurée) → arborescences Git complètes, builds, etc. ; dans chaque `conf.json`, **`project_path`** et les chemins **`deploy.*`** utiles sont **relatifs à la racine du monorepo smart_ide** (ex. `../enso`, `.`) ou **absolus** ; le script `cron/git-pull-project-clones.sh` et ia_dev les résolvent depuis cette racine (`ia_dev/lib/conf_path_resolve.sh`). - **`../projects/`** (ou autre racine configurée) → arborescences Git complètes, builds, etc. ; dans chaque `conf.json`, **`project_path`** et les chemins **`deploy.*`** utiles sont **relatifs à la racine du monorepo smart_ide** (ex. `../enso`, `.`) ou **absolus** ; le script `cron/git-pull-project-clones.sh` et ia_dev les résolvent depuis cette racine (`ia_dev/lib/conf_path_resolve.sh`).
## `smart_ide` ## `smart_ide`
@ -27,7 +27,7 @@ Les dépôts sources des produits (ex. backend **docv** sous un chemin du type `
- Fichier : `projects/builazoo/conf.json` — dépôt **sous la racine monorepo** (`project_path` : `builazoo`, soit `smart_ide/builazoo/`), forge **4nk/builazoo** (wiki / issues à ajuster si le dépôt diffère), mails ticketing `AI.BUILAZOO.*@4nkweb.com`. - Fichier : `projects/builazoo/conf.json` — dépôt **sous la racine monorepo** (`project_path` : `builazoo`, soit `smart_ide/builazoo/`), forge **4nk/builazoo** (wiki / issues à ajuster si le dépôt diffère), mails ticketing `AI.BUILAZOO.*@4nkweb.com`.
- **`smart_ide.remote_data_access`** : alias SSH `builazoo-test` / `builazoo-pprod` / `builazoo-prod` (à déclarer dans `~/.ssh/config` comme pour les autres ids). - **`smart_ide.remote_data_access`** : alias SSH `builazoo-test` / `builazoo-pprod` / `builazoo-prod` (à déclarer dans `~/.ssh/config` comme pour les autres ids).
- Workspace : `projects/builazoo/smart_ide.code-workspace` - Multi-root IDE : **`smart_ide.workspace`** dans `conf.json` (dossiers + `smartIde.activeProjectId`).
- Cron fragment : `cron/fragments/builazoo.cron` - Cron fragment : `cron/fragments/builazoo.cron`
- Pour **`ia_dev`** : `./scripts/ensure-ia-dev-project-link.sh builazoo` - Pour **`ia_dev`** : `./scripts/ensure-ia-dev-project-link.sh builazoo`
- Le répertoire **`builazoo/`** à la racine du monorepo est partiellement ignoré par Git (sauf `builazoo/README.md`) : y placer le clone ou les sources. - Le répertoire **`builazoo/`** à la racine du monorepo est partiellement ignoré par Git (sauf `builazoo/README.md`) : y placer le clone ou les sources.
@ -48,12 +48,14 @@ Spécification : [features/remote-deployed-data-ssh.md](../features/remote-deplo
### Bloc optionnel `smart_ide` dans `conf.json` ### Bloc optionnel `smart_ide` dans `conf.json`
Clé **`smart_ide`** avec notamment **`remote_data_access`**, **`anythingllm_workspace_slug`**. Exemple : `projects/enso/conf.json`. Clé **`smart_ide`** avec notamment **`remote_data_access`**, **`anythingllm_workspace_slug`**, **`workspace`** (équivalent `.code-workspace` : `folders` + `settings.smartIde.activeProjectId`). Exemple : `projects/enso/conf.json`.
### Projet actif pour léditeur / Cursor ### Projet actif pour léditeur / Cursor
1. Copier `projects/active-project.json.example` vers **`projects/active-project.json`** (non versionné) ; renseigner **`id`**, optionnellement **`default_env`**, **`notes`** (informative). 1. Copier [`projects/active-project.json.example`](../../projects/active-project.json.example) vers **`projects/active-project.json`** (non versionné) ; renseigner **`id`**, optionnellement **`default_env`**, **`notes`**.
2. Dans un **`.code-workspace`** : **`smartIde.activeProjectId`** dans **`settings`** (ex. `projects/enso/smart_ide.code-workspace`). 2. Pour ouvrir un workspace multi-dossiers dans VS Code / Cursor : lire **`smart_ide.workspace`** dans **`projects/<id>/conf.json`** (même schéma quun fichier `.code-workspace`) — copier ce bloc dans un fichier local `.code-workspace` si léditeur lexige, ou configurer les dossiers à la main.
Nouveau projet : partir de [`projects/example/conf.json`](../../projects/example/conf.json) → `projects/<nouvel_id>/conf.json`.
Convention agents : `.smartIde/rules/smart-ide-ia-dev-bridge.mdc`. Convention agents : `.smartIde/rules/smart-ide-ia-dev-bridge.mdc`.

View File

@ -1,52 +1,5 @@
{ {
"id": "<name>", "id": "smart_ide",
"<name>": "<name>", "default_env": "test",
"cron": { "notes": "Copier vers projects/active-project.json (non versionné). Définition complète dun projet : projects/<id>/conf.json (seul fichier par id, inclut smart_ide.workspace pour VS Code / Cursor)."
"git_pull": true
},
"project_path": ".",
"build_dirs": [],
"deploy": {},
"version": {
"package_json_paths": [],
"splash_app_<name>": "<name>"
},
"mail": {
"imap_bridge_env": ".secrets/git-issues/imap-bridge.env"
},
"git": {
"wiki_url": "https://git.<domain>/4nk/<name>/wiki",
"token_file": ".secrets/git-issues/token"
},
"tickets": {
"ticketing_url": "https://git.<domain>/4nk/<name>/issues",
"authorized_emails": {
"to": [
{
"test": "AI.<name>.TEST@<domain>",
"pprod": "AI.<name>.PPROD@<domain>",
"prod": "AI.<name>.PROD@<domain>"
}
],
"from": ["<name>@<domain>"]
}
},
"smart_ide": {
"remote_data_access": {
"environments": {
"test": {
"ssh_host_alias": "<name>-test",
"remote_data_directories": []
},
"pprod": {
"ssh_host_alias": "<name>-pprod",
"remote_data_directories": []
},
"prod": {
"ssh_host_alias": "<name>-prod",
"remote_data_directories": []
}
}
}
}
} }

View File

@ -47,6 +47,15 @@
"remote_data_directories": [] "remote_data_directories": []
} }
} }
},
"workspace": {
"folders": [
{ "path": "../.." },
{ "path": "../../builazoo" }
],
"settings": {
"smartIde.activeProjectId": "builazoo"
}
} }
} }
} }

View File

@ -1,13 +0,0 @@
{
"folders": [
{
"path": "../.."
},
{
"path": "../../builazoo"
}
],
"settings": {
"smartIde.activeProjectId": "builazoo"
}
}

View File

@ -94,6 +94,16 @@
"test": "enso-test", "test": "enso-test",
"pprod": "enso-pprod", "pprod": "enso-pprod",
"prod": "enso-prod" "prod": "enso-prod"
},
"workspace": {
"folders": [
{ "path": "../.." },
{ "path": "../../enso" },
{ "path": "../../builazoo" }
],
"settings": {
"smartIde.activeProjectId": "enso"
}
} }
} }
} }

View File

@ -1,16 +0,0 @@
{
"folders": [
{
"path": "../.."
},
{
"path": "../../enso"
},
{
"path": "../../builazoo"
}
],
"settings": {
"smartIde.activeProjectId": "enso"
}
}

View File

@ -0,0 +1,61 @@
{
"id": "<name>",
"<name>": "<name>",
"cron": {
"git_pull": true
},
"project_path": ".",
"build_dirs": [],
"deploy": {},
"version": {
"package_json_paths": [],
"splash_app_<name>": "<name>"
},
"mail": {
"imap_bridge_env": ".secrets/git-issues/imap-bridge.env"
},
"git": {
"wiki_url": "https://git.<domain>/4nk/<name>/wiki",
"token_file": ".secrets/git-issues/token"
},
"tickets": {
"ticketing_url": "https://git.<domain>/4nk/<name>/issues",
"authorized_emails": {
"to": [
{
"test": "AI.<name>.TEST@<domain>",
"pprod": "AI.<name>.PPROD@<domain>",
"prod": "AI.<name>.PROD@<domain>"
}
],
"from": ["<name>@<domain>"]
}
},
"smart_ide": {
"remote_data_access": {
"environments": {
"test": {
"ssh_host_alias": "<name>-test",
"remote_data_directories": []
},
"pprod": {
"ssh_host_alias": "<name>-pprod",
"remote_data_directories": []
},
"prod": {
"ssh_host_alias": "<name>-prod",
"remote_data_directories": []
}
}
},
"workspace": {
"folders": [
{ "path": "../.." },
{ "path": "../../<name>" }
],
"settings": {
"smartIde.activeProjectId": "<name>"
}
}
}
}

View File

@ -1,10 +1,10 @@
# Exemple de configuration client OpenSSH (~/.ssh/config). # Exemple de configuration client OpenSSH (~/.ssh/config).
# Copier vers ~/.ssh/config ou inclure avec : Include /chemin/vers/smart_ide/projects/ssh-config.local # Copier vers ~/.ssh/config ou inclure avec : Include /chemin/vers/smart_ide/projects/example/ssh-config.local
# (ne pas versionner de fichier contenant des données personnelles non nécessaires). # (ne pas versionner de fichier contenant des données personnelles non nécessaires).
# #
# Alignement avec le dépôt : # Alignement avec le dépôt :
# - projects/<id>/conf.json → smart_ide.remote_data_access.environments.*.ssh_host_alias # - projects/<id>/conf.json → smart_ide.remote_data_access.environments.*.ssh_host_alias
# - projects/active-project.json.example → alias <name>-test | <name>-pprod | <name>-prod # - projects/active-project.json (gabarit : active-project.json.example) → id projet actif pour lIDE uniquement
# #
# Remplacer <SSH_USER>, <LAN_IP_*>, <forge_host>, <key_file> selon le poste. # Remplacer <SSH_USER>, <LAN_IP_*>, <forge_host>, <key_file> selon le poste.
# Bastion optionnel par Host : ProxyJump <SSH_USER>@<bastion_host> # Bastion optionnel par Host : ProxyJump <SSH_USER>@<bastion_host>

View File

@ -47,6 +47,12 @@
"remote_data_directories": [] "remote_data_directories": []
} }
} }
},
"workspace": {
"folders": [{ "path": "../.." }],
"settings": {
"smartIde.activeProjectId": "smart_ide"
}
} }
} }
} }