From 383dcc07ee8a7215d85fe58199010f22d88510de Mon Sep 17 00:00:00 2001 From: Harper Date: Fri, 23 Oct 2026 13:24:19 +0200 Subject: [PATCH 1/3] feat: agent doc and skills --- .claude/skills/scaffold-game/SKILL.md | 47 ++++++++++++++ AGENTS.md | 94 +++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 .claude/skills/scaffold-game/SKILL.md create mode 100644 AGENTS.md diff --git a/.claude/skills/scaffold-game/SKILL.md b/.claude/skills/scaffold-game/SKILL.md new file mode 100644 index 0000000..60b0650 --- /dev/null +++ b/.claude/skills/scaffold-game/SKILL.md @@ -0,0 +1,47 @@ +--- +name: scaffold-game +description: Utilise le CLI nf (construit depuis le code source de ce repo) pour scaffolder un projet, composant ou system Nanoforge via les schematics, afin de tester les générateurs pendant le développement du CLI. À utiliser quand l'utilisateur demande de créer un nouveau projet de test, un composant/system ECS, ou de vérifier qu'un générateur fonctionne. +--- + +# Scaffolding via le CLI nf (build local) + +Ce skill utilise le binaire `nf` construit depuis les sources de ce repo (pas une version publiée sur npm), pour tester les schematics (`libs/schematics`) pendant le développement du CLI. + +## 1. Builder le CLI + +```bash +pnpm install --frozen-lockfile +pnpm run build # tsc --noEmit && tsdown -> dist/nf.js +``` + +## 2. Découvrir la commande exacte avant de l'utiliser + +Ne pas supposer la syntaxe exacte des options : toujours vérifier l'aide avant d'exécuter une commande de scaffolding, les flags pouvant évoluer avec le repo. + +```bash +node dist/nf.js --help +node dist/nf.js new --help +node dist/nf.js create --help +``` + +La documentation détaillée des commandes est aussi dans `docs/docs/commands/` (une page par commande) et les schematics disponibles sont listés dans `libs/schematics/src/collection.json` (application, configuration, part-base, part-main, component, system, docker). + +## 3. Scaffolder dans un répertoire de test isolé + +Exécuter la commande choisie depuis un répertoire de test **en dehors de ce repo** (par exemple `/tmp` ou le scratchpad), jamais à la racine du repo CLI lui-même : + +```bash +cd /chemin/vers/un/dossier/de/test +node /chemin/absolu/vers/repos/CLI/dist/nf.js new +``` + +Pour un composant/system à l'intérieur d'un projet déjà généré, se placer dans ce projet puis utiliser la commande `create` (vérifier son usage exact via `--help`, voir étape 2). + +## 4. Vérifier le résultat + +Inspecter les fichiers générés (`ls`, `cat`) et comparer avec le schéma attendu dans `libs/schematics/src/libs//` (fichiers `files/` du schematic correspondant) pour confirmer que le template appliqué est correct. + +## Hors scope de ce skill + +- Ne publie jamais de package (`nf publish`) ni ne touche au registre de packages réel sans confirmation explicite de l'utilisateur. +- Ne modifie pas la configuration globale utilisateur (`nf login`/`nf logout`) sans demande explicite. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..8f6ae3f --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,94 @@ +# CLI + +## Rôle + +Ce repo contient le CLI (`nf`) de NanoForge, un moteur de jeu pour navigateur. Le CLI est l'outil en ligne de commande utilisé par les développeurs pour créer, développer, builder, démarrer, publier et gérer des projets NanoForge (et leurs composants/systèmes), ainsi que pour lancer l'éditeur et interagir avec le registre de packages NanoForge. + +## Stack technique + +- **Langage** : TypeScript (Node.js 26), package publié en ESM (`"type": "module"`) +- **Framework CLI** : [Commander](https://github.com/tj/commander.js), avec une séparation Command/Action maison (voir Conventions), prompts interactifs via `@inquirer/prompts` +- **Génération de code** : Angular DevKit Schematics (`@angular-devkit/schematics`, `@angular-devkit/schematics-cli`) pour générer projets, composants, systèmes et workspaces +- **Runtime d'exécution des projets** : Bun (le CLI embarque/utilise `bun` comme dépendance) +- **Build** : [tsdown](https://github.com/sxzz/tsdown) (bundler basé sur Rolldown) + vérification de types via `tsc --noEmit` +- **Monorepo** : pnpm workspaces + [Turborepo](https://turbo.build) pour orchestrer build/lint/format/test entre le package racine et les libs internes +- **Gestionnaire de paquets** : pnpm (avec catalogues de versions `pnpm-workspace.yaml`) +- **Environnement dev reproductible** : Nix (`flake.nix` : Node 24, pnpm, bun) +- **Dépendances internes au repo** (`workspace:*`) : `@nanoforge-dev/config` (lib de gestion de configuration, package `libs/config` de ce repo) et `@nanoforge-dev/schematics` (lib de schematics, package `libs/schematics` de ce repo) +- **Dépendances externes publiées notables** : `@nanoforge-dev/editor` (`catalog:core`), `@nanoforge-dev/loader-client` et `@nanoforge-dev/loader-server` (`catalog:loader`) + +## Structure du projet + +``` +src/ +├── bin/nf.ts # point d'entrée exécutable du binaire `nf` +├── command/ # définition des commandes Commander (interface CLI) +│ ├── abstract.command.ts +│ ├── command.loader.ts +│ └── commands/ # build, create, dev, editor, install, login, logout, +│ # new, publish, start, unpublish +├── action/ # logique métier exécutée par chaque commande +│ ├── abstract.action.ts +│ └── actions/ # une action par commande (build, create, dev, ...) +└── lib/ # bibliothèques internes partagées + ├── config/ # chargement/résolution de la config projet + ├── global-config/ # config globale utilisateur (ex: credentials) + ├── git/ # intégration git (ex: init de repo via --git) + ├── http/ # client HTTP (vers l'API NanoForge / registre) + ├── manifest/ # lecture du manifest de projet + ├── package-manager/ # détection/abstraction npm/yarn/pnpm/bun + ├── question/ # prompts interactifs (questions/questions) + ├── registry/ # interactions avec le registre de packages + ├── runner/ # exécution de process enfants (build/dev/start) + ├── schematics/ # pont vers les schematics Angular DevKit + ├── tree-kill/ # kill récursif d'arbres de process + └── ui/ # affichage terminal (spinners, couleurs) + +libs/ # packages internes publiés séparément (workspace pnpm) +├── config/ # @nanoforge-dev/config : définition/validation/merge de config +│ └── src/{defaults,define-config,merge,parse,types} +└── schematics/ # @nanoforge-dev/schematics : schematics (component, project, system, workspace) + └── src/{libs,utils,collection.json} + +docs/ # documentation (Docusaurus-like .mdx) + JSON Schemas publics +├── docs/{getting-started,configuration,commands,schematics}/ +├── guides/cli/ # guides pas-à-pas (créer un projet, dev local, build & déploiement, publier un package...) +└── *.schema.json # schémas JSON du fichier de config, du manifest, etc. + +e2e/ # tests end-to-end du binaire compilé (spawn du process `nf`) +``` + +## Commandes principales + +Le binaire généré s'utilise ainsi : `nf [command] [options]` (ex. `nf new`, `nf build`, `nf dev`, `nf editor`, `nf install`, `nf login`, `nf publish`...). Documentation complète des commandes dans `docs/docs/commands/`. + +Développement du CLI lui-même (depuis la racine du repo) : +```bash +pnpm run build # tsc --noEmit && tsdown +pnpm run build:dev # build en mode développement +pnpm run start # node dist/nf.js +pnpm run lint # prettier --check + eslint +pnpm run format # prettier --write + eslint --fix +pnpm run test # unit + e2e +pnpm run test:unit # vitest (vitest.config.ts) +pnpm run test:e2e # vitest (vitest.config.e2e.ts), exécute le binaire buildé +pnpm run changelog # git-cliff +pnpm run release # @favware/cliff-jumper +``` + +Orchestration monorepo (racine + `libs/*` via Turborepo) : +```bash +pnpm run repo:build # turbo run build (concurrency 5) +pnpm run repo:lint # turbo run lint +pnpm run repo:format # turbo run format +pnpm run repo:test # turbo run test:unit puis test:e2e +``` + +## Conventions + +- **Architecture Commande/Action** : chaque commande (`command/commands/*.command.ts`) ne fait que déclarer l'interface Commander (arguments/options) et délègue l'exécution à une classe Action correspondante (`action/actions/*.action.ts`) héritant de `abstract.action.ts` — séparation stricte interface CLI / logique métier. +- **Style de code** : config partagée via les packages externes publiés `@nanoforge-dev/utils-eslint-config` et `@nanoforge-dev/utils-prettier-config` (`catalog:lint`), avec `@trivago/prettier-plugin-sort-imports` pour l'ordre des imports (`@lib/*`, `@utils/*`, `~/*`, puis imports relatifs). +- **Commits** : Conventional Commits, vérifiés par Commitlint et des hooks Husky (`lint-staged` sur les fichiers stagés). +- **Releases** : `git-cliff` pour le changelog, `@favware/cliff-jumper` pour le bump de version, workflows GitHub Actions dédiés (`release.yml`, `pre-release.yml`, `alpha-release.yml` pour des releases alpha). +- **Variables d'environnement des projets générés** : convention de préfixes exposée aux jeux buildés par le CLI — `NANOFORGE_CLIENT_*` (client uniquement), `NANOFORGE_SERVER_*` (serveur uniquement), `NANOFORGE_*` (les deux) ; les préfixes sont retirés avant exposition aux libs consommatrices. +- **Schéma de configuration** : le fichier de config d'un projet généré est validé contre des JSON Schemas publiés (`docs/*.schema.json`), accessibles publiquement via `https://nanoforge-dev.github.io/docs/cli/config-schema.json`. From 4ac5483cd9d1861ebabfd85c936d4b2c09befb84 Mon Sep 17 00:00:00 2001 From: Harper Date: Fri, 23 Oct 2026 13:33:56 +0200 Subject: [PATCH 2/3] fix(agents-doc): update agents doc with last update (plugin schematics) --- AGENTS.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 8f6ae3f..1d8e0f0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -42,12 +42,14 @@ src/ ├── runner/ # exécution de process enfants (build/dev/start) ├── schematics/ # pont vers les schematics Angular DevKit ├── tree-kill/ # kill récursif d'arbres de process - └── ui/ # affichage terminal (spinners, couleurs) + ├── ui/ # affichage terminal (spinners, couleurs) + ├── input/, types/, utils/ # helpers d'entrée utilisateur, types partagés, utilitaires génériques + └── constants.ts # constantes partagées libs/ # packages internes publiés séparément (workspace pnpm) ├── config/ # @nanoforge-dev/config : définition/validation/merge de config │ └── src/{defaults,define-config,merge,parse,types} -└── schematics/ # @nanoforge-dev/schematics : schematics (component, project, system, workspace) +└── schematics/ # @nanoforge-dev/schematics : schematics (component, project, system, workspace, plugin) └── src/{libs,utils,collection.json} docs/ # documentation (Docusaurus-like .mdx) + JSON Schemas publics From 6d286636cb660408a417aac5a8f6093550d06f5f Mon Sep 17 00:00:00 2001 From: Harper Date: Fri, 23 Oct 2026 14:03:22 +0200 Subject: [PATCH 3/3] fix(agents-doc): translate to english --- .claude/skills/scaffold-game/SKILL.md | 34 ++++----- AGENTS.md | 106 +++++++++++++------------- 2 files changed, 70 insertions(+), 70 deletions(-) diff --git a/.claude/skills/scaffold-game/SKILL.md b/.claude/skills/scaffold-game/SKILL.md index 60b0650..984606a 100644 --- a/.claude/skills/scaffold-game/SKILL.md +++ b/.claude/skills/scaffold-game/SKILL.md @@ -1,22 +1,22 @@ --- name: scaffold-game -description: Utilise le CLI nf (construit depuis le code source de ce repo) pour scaffolder un projet, composant ou system Nanoforge via les schematics, afin de tester les générateurs pendant le développement du CLI. À utiliser quand l'utilisateur demande de créer un nouveau projet de test, un composant/system ECS, ou de vérifier qu'un générateur fonctionne. +description: Uses the nf CLI (built from this repo's source code) to scaffold a Nanoforge project, component, or system via the schematics, in order to test the generators during CLI development. Use when the user asks to create a new test project, an ECS component/system, or to verify that a generator works. --- -# Scaffolding via le CLI nf (build local) +# Scaffolding via the nf CLI (local build) -Ce skill utilise le binaire `nf` construit depuis les sources de ce repo (pas une version publiée sur npm), pour tester les schematics (`libs/schematics`) pendant le développement du CLI. +This skill uses the `nf` binary built from this repo's sources (not a version published on npm), to test the schematics (`libs/schematics`) during CLI development. -## 1. Builder le CLI +## 1. Build the CLI ```bash pnpm install --frozen-lockfile pnpm run build # tsc --noEmit && tsdown -> dist/nf.js ``` -## 2. Découvrir la commande exacte avant de l'utiliser +## 2. Discover the exact command before using it -Ne pas supposer la syntaxe exacte des options : toujours vérifier l'aide avant d'exécuter une commande de scaffolding, les flags pouvant évoluer avec le repo. +Do not assume the exact syntax of the options: always check the help before running a scaffolding command, as the flags may evolve with the repo. ```bash node dist/nf.js --help @@ -24,24 +24,24 @@ node dist/nf.js new --help node dist/nf.js create --help ``` -La documentation détaillée des commandes est aussi dans `docs/docs/commands/` (une page par commande) et les schematics disponibles sont listés dans `libs/schematics/src/collection.json` (application, configuration, part-base, part-main, component, system, docker). +Detailed command documentation is also in `docs/docs/commands/` (one page per command), and the available schematics are listed in `libs/schematics/src/collection.json` (application, configuration, part-base, part-main, component, system, docker). -## 3. Scaffolder dans un répertoire de test isolé +## 3. Scaffold in an isolated test directory -Exécuter la commande choisie depuis un répertoire de test **en dehors de ce repo** (par exemple `/tmp` ou le scratchpad), jamais à la racine du repo CLI lui-même : +Run the chosen command from a test directory **outside this repo** (for example `/tmp` or the scratchpad), never at the root of the CLI repo itself: ```bash -cd /chemin/vers/un/dossier/de/test -node /chemin/absolu/vers/repos/CLI/dist/nf.js new +cd /path/to/a/test/folder +node /absolute/path/to/repos/CLI/dist/nf.js new ``` -Pour un composant/system à l'intérieur d'un projet déjà généré, se placer dans ce projet puis utiliser la commande `create` (vérifier son usage exact via `--help`, voir étape 2). +For a component/system inside an already-generated project, move into that project and then use the `create` command (check its exact usage via `--help`, see step 2). -## 4. Vérifier le résultat +## 4. Verify the result -Inspecter les fichiers générés (`ls`, `cat`) et comparer avec le schéma attendu dans `libs/schematics/src/libs//` (fichiers `files/` du schematic correspondant) pour confirmer que le template appliqué est correct. +Inspect the generated files (`ls`, `cat`) and compare them against the expected schema in `libs/schematics/src/libs//` (the corresponding schematic's `files/` files) to confirm that the applied template is correct. -## Hors scope de ce skill +## Out of scope for this skill -- Ne publie jamais de package (`nf publish`) ni ne touche au registre de packages réel sans confirmation explicite de l'utilisateur. -- Ne modifie pas la configuration globale utilisateur (`nf login`/`nf logout`) sans demande explicite. +- Never publish a package (`nf publish`) or touch the real package registry without the user's explicit confirmation. +- Do not modify the global user configuration (`nf login`/`nf logout`) without an explicit request. diff --git a/AGENTS.md b/AGENTS.md index 1d8e0f0..bd56d7b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,96 +1,96 @@ # CLI -## Rôle +## Role -Ce repo contient le CLI (`nf`) de NanoForge, un moteur de jeu pour navigateur. Le CLI est l'outil en ligne de commande utilisé par les développeurs pour créer, développer, builder, démarrer, publier et gérer des projets NanoForge (et leurs composants/systèmes), ainsi que pour lancer l'éditeur et interagir avec le registre de packages NanoForge. +This repo contains NanoForge's CLI (`nf`), a game engine for the browser. The CLI is the command-line tool used by developers to create, develop, build, start, publish, and manage NanoForge projects (and their components/systems), as well as to launch the editor and interact with the NanoForge package registry. -## Stack technique +## Tech Stack -- **Langage** : TypeScript (Node.js 26), package publié en ESM (`"type": "module"`) -- **Framework CLI** : [Commander](https://github.com/tj/commander.js), avec une séparation Command/Action maison (voir Conventions), prompts interactifs via `@inquirer/prompts` -- **Génération de code** : Angular DevKit Schematics (`@angular-devkit/schematics`, `@angular-devkit/schematics-cli`) pour générer projets, composants, systèmes et workspaces -- **Runtime d'exécution des projets** : Bun (le CLI embarque/utilise `bun` comme dépendance) -- **Build** : [tsdown](https://github.com/sxzz/tsdown) (bundler basé sur Rolldown) + vérification de types via `tsc --noEmit` -- **Monorepo** : pnpm workspaces + [Turborepo](https://turbo.build) pour orchestrer build/lint/format/test entre le package racine et les libs internes -- **Gestionnaire de paquets** : pnpm (avec catalogues de versions `pnpm-workspace.yaml`) -- **Environnement dev reproductible** : Nix (`flake.nix` : Node 24, pnpm, bun) -- **Dépendances internes au repo** (`workspace:*`) : `@nanoforge-dev/config` (lib de gestion de configuration, package `libs/config` de ce repo) et `@nanoforge-dev/schematics` (lib de schematics, package `libs/schematics` de ce repo) -- **Dépendances externes publiées notables** : `@nanoforge-dev/editor` (`catalog:core`), `@nanoforge-dev/loader-client` et `@nanoforge-dev/loader-server` (`catalog:loader`) +- **Language**: TypeScript (Node.js 26), package published as ESM (`"type": "module"`) +- **CLI framework**: [Commander](https://github.com/tj/commander.js), with a custom Command/Action separation (see Conventions), interactive prompts via `@inquirer/prompts` +- **Code generation**: Angular DevKit Schematics (`@angular-devkit/schematics`, `@angular-devkit/schematics-cli`) to generate projects, components, systems, and workspaces +- **Project execution runtime**: Bun (the CLI bundles/uses `bun` as a dependency) +- **Build**: [tsdown](https://github.com/sxzz/tsdown) (Rolldown-based bundler) + type checking via `tsc --noEmit` +- **Monorepo**: pnpm workspaces + [Turborepo](https://turbo.build) to orchestrate build/lint/format/test across the root package and the internal libs +- **Package manager**: pnpm (with version catalogs via `pnpm-workspace.yaml`) +- **Reproducible dev environment**: Nix (`flake.nix`: Node 24, pnpm, bun) +- **Internal repo dependencies** (`workspace:*`): `@nanoforge-dev/config` (config management lib, `libs/config` package of this repo) and `@nanoforge-dev/schematics` (schematics lib, `libs/schematics` package of this repo) +- **Notable published external dependencies**: `@nanoforge-dev/editor` (`catalog:core`), `@nanoforge-dev/loader-client` and `@nanoforge-dev/loader-server` (`catalog:loader`) -## Structure du projet +## Project Structure ``` src/ -├── bin/nf.ts # point d'entrée exécutable du binaire `nf` -├── command/ # définition des commandes Commander (interface CLI) +├── bin/nf.ts # executable entry point for the `nf` binary +├── command/ # Commander command definitions (CLI interface) │ ├── abstract.command.ts │ ├── command.loader.ts │ └── commands/ # build, create, dev, editor, install, login, logout, │ # new, publish, start, unpublish -├── action/ # logique métier exécutée par chaque commande +├── action/ # business logic executed by each command │ ├── abstract.action.ts -│ └── actions/ # une action par commande (build, create, dev, ...) -└── lib/ # bibliothèques internes partagées - ├── config/ # chargement/résolution de la config projet - ├── global-config/ # config globale utilisateur (ex: credentials) - ├── git/ # intégration git (ex: init de repo via --git) - ├── http/ # client HTTP (vers l'API NanoForge / registre) - ├── manifest/ # lecture du manifest de projet - ├── package-manager/ # détection/abstraction npm/yarn/pnpm/bun - ├── question/ # prompts interactifs (questions/questions) - ├── registry/ # interactions avec le registre de packages - ├── runner/ # exécution de process enfants (build/dev/start) - ├── schematics/ # pont vers les schematics Angular DevKit - ├── tree-kill/ # kill récursif d'arbres de process - ├── ui/ # affichage terminal (spinners, couleurs) - ├── input/, types/, utils/ # helpers d'entrée utilisateur, types partagés, utilitaires génériques - └── constants.ts # constantes partagées +│ └── actions/ # one action per command (build, create, dev, ...) +└── lib/ # shared internal libraries + ├── config/ # project config loading/resolution + ├── global-config/ # user global config (e.g. credentials) + ├── git/ # git integration (e.g. repo init via --git) + ├── http/ # HTTP client (to the NanoForge API / registry) + ├── manifest/ # project manifest reading + ├── package-manager/ # npm/yarn/pnpm/bun detection/abstraction + ├── question/ # interactive prompts (questions/questions) + ├── registry/ # interactions with the package registry + ├── runner/ # child process execution (build/dev/start) + ├── schematics/ # bridge to Angular DevKit schematics + ├── tree-kill/ # recursive process tree kill + ├── ui/ # terminal display (spinners, colors) + ├── input/, types/, utils/ # user input helpers, shared types, generic utilities + └── constants.ts # shared constants -libs/ # packages internes publiés séparément (workspace pnpm) -├── config/ # @nanoforge-dev/config : définition/validation/merge de config +libs/ # internal packages published separately (pnpm workspace) +├── config/ # @nanoforge-dev/config: config definition/validation/merge │ └── src/{defaults,define-config,merge,parse,types} -└── schematics/ # @nanoforge-dev/schematics : schematics (component, project, system, workspace, plugin) +└── schematics/ # @nanoforge-dev/schematics: schematics (component, project, system, workspace, plugin) └── src/{libs,utils,collection.json} -docs/ # documentation (Docusaurus-like .mdx) + JSON Schemas publics +docs/ # documentation (Docusaurus-like .mdx) + public JSON Schemas ├── docs/{getting-started,configuration,commands,schematics}/ -├── guides/cli/ # guides pas-à-pas (créer un projet, dev local, build & déploiement, publier un package...) -└── *.schema.json # schémas JSON du fichier de config, du manifest, etc. +├── guides/cli/ # step-by-step guides (creating a project, local dev, build & deployment, publishing a package...) +└── *.schema.json # JSON schemas for the config file, the manifest, etc. -e2e/ # tests end-to-end du binaire compilé (spawn du process `nf`) +e2e/ # end-to-end tests of the compiled binary (spawns the `nf` process) ``` -## Commandes principales +## Main Commands -Le binaire généré s'utilise ainsi : `nf [command] [options]` (ex. `nf new`, `nf build`, `nf dev`, `nf editor`, `nf install`, `nf login`, `nf publish`...). Documentation complète des commandes dans `docs/docs/commands/`. +The generated binary is used as follows: `nf [command] [options]` (e.g. `nf new`, `nf build`, `nf dev`, `nf editor`, `nf install`, `nf login`, `nf publish`...). Full command documentation is in `docs/docs/commands/`. -Développement du CLI lui-même (depuis la racine du repo) : +Developing the CLI itself (from the repo root): ```bash pnpm run build # tsc --noEmit && tsdown -pnpm run build:dev # build en mode développement +pnpm run build:dev # build in development mode pnpm run start # node dist/nf.js pnpm run lint # prettier --check + eslint pnpm run format # prettier --write + eslint --fix pnpm run test # unit + e2e pnpm run test:unit # vitest (vitest.config.ts) -pnpm run test:e2e # vitest (vitest.config.e2e.ts), exécute le binaire buildé +pnpm run test:e2e # vitest (vitest.config.e2e.ts), runs the built binary pnpm run changelog # git-cliff pnpm run release # @favware/cliff-jumper ``` -Orchestration monorepo (racine + `libs/*` via Turborepo) : +Monorepo orchestration (root + `libs/*` via Turborepo): ```bash pnpm run repo:build # turbo run build (concurrency 5) pnpm run repo:lint # turbo run lint pnpm run repo:format # turbo run format -pnpm run repo:test # turbo run test:unit puis test:e2e +pnpm run repo:test # turbo run test:unit then test:e2e ``` ## Conventions -- **Architecture Commande/Action** : chaque commande (`command/commands/*.command.ts`) ne fait que déclarer l'interface Commander (arguments/options) et délègue l'exécution à une classe Action correspondante (`action/actions/*.action.ts`) héritant de `abstract.action.ts` — séparation stricte interface CLI / logique métier. -- **Style de code** : config partagée via les packages externes publiés `@nanoforge-dev/utils-eslint-config` et `@nanoforge-dev/utils-prettier-config` (`catalog:lint`), avec `@trivago/prettier-plugin-sort-imports` pour l'ordre des imports (`@lib/*`, `@utils/*`, `~/*`, puis imports relatifs). -- **Commits** : Conventional Commits, vérifiés par Commitlint et des hooks Husky (`lint-staged` sur les fichiers stagés). -- **Releases** : `git-cliff` pour le changelog, `@favware/cliff-jumper` pour le bump de version, workflows GitHub Actions dédiés (`release.yml`, `pre-release.yml`, `alpha-release.yml` pour des releases alpha). -- **Variables d'environnement des projets générés** : convention de préfixes exposée aux jeux buildés par le CLI — `NANOFORGE_CLIENT_*` (client uniquement), `NANOFORGE_SERVER_*` (serveur uniquement), `NANOFORGE_*` (les deux) ; les préfixes sont retirés avant exposition aux libs consommatrices. -- **Schéma de configuration** : le fichier de config d'un projet généré est validé contre des JSON Schemas publiés (`docs/*.schema.json`), accessibles publiquement via `https://nanoforge-dev.github.io/docs/cli/config-schema.json`. +- **Command/Action architecture**: each command (`command/commands/*.command.ts`) only declares the Commander interface (arguments/options) and delegates execution to a corresponding Action class (`action/actions/*.action.ts`) extending `abstract.action.ts` — strict separation between the CLI interface and the business logic. +- **Code style**: shared config via the published external packages `@nanoforge-dev/utils-eslint-config` and `@nanoforge-dev/utils-prettier-config` (`catalog:lint`), with `@trivago/prettier-plugin-sort-imports` for import ordering (`@lib/*`, `@utils/*`, `~/*`, then relative imports). +- **Commits**: Conventional Commits, checked by Commitlint and Husky hooks (`lint-staged` on staged files). +- **Releases**: `git-cliff` for the changelog, `@favware/cliff-jumper` for version bumping, dedicated GitHub Actions workflows (`release.yml`, `pre-release.yml`, `alpha-release.yml` for alpha releases). +- **Generated project environment variables**: prefix convention exposed to games built by the CLI — `NANOFORGE_CLIENT_*` (client only), `NANOFORGE_SERVER_*` (server only), `NANOFORGE_*` (both); the prefixes are stripped before being exposed to consuming libs. +- **Config schema**: a generated project's config file is validated against published JSON Schemas (`docs/*.schema.json`), publicly accessible via `https://nanoforge-dev.github.io/docs/cli/config-schema.json`.