From 0bd8f843ae536e2609383e15f53e53b1579e8e5b Mon Sep 17 00:00:00 2001 From: Harper Date: Fri, 23 Oct 2026 13:41:17 +0200 Subject: [PATCH 1/2] feat: agents doc and skills --- .claude/skills/new-ecs-package/SKILL.md | 111 ++++++++++++++++++++++++ AGENTS.md | 91 +++++++++++++++++++ 2 files changed, 202 insertions(+) create mode 100644 .claude/skills/new-ecs-package/SKILL.md create mode 100644 AGENTS.md diff --git a/.claude/skills/new-ecs-package/SKILL.md b/.claude/skills/new-ecs-package/SKILL.md new file mode 100644 index 0000000..ce9d6be --- /dev/null +++ b/.claude/skills/new-ecs-package/SKILL.md @@ -0,0 +1,111 @@ +--- +name: new-ecs-package +description: Scaffold un nouveau composant ou system ECS dans ce repo (components-systems), en suivant exactement le pattern des packages existants. À utiliser quand l'utilisateur demande d'ajouter un nouveau composant ou system NanoForge dans ce repo. +--- + +# Nouveau composant / system ECS + +Chaque package de `packages/` est un simple dossier (pas de `package.json` propre) contenant `index.ts` + `nanoforge.manifest.json`. Aucune étape d'enregistrement centralisé n'est nécessaire : `tsconfig.json`/`vitest.config.ts` mappent déjà `@components/*` et `@systems/*` vers `./packages/*`, et `tsconfig.json` inclut `packages/**/*.ts` — un nouveau dossier est automatiquement pris en compte. + +Avant de créer un package, vérifier qu'il n'existe pas déjà sous un nom proche (`ls packages/ | grep -i `). + +## Composant (`*.component`) + +Dossier `packages/nf-.component/`, fichier `index.ts` : + +```ts +import { type EditorComponentManifest } from "@nanoforge-dev/ecs-lib"; + +export class NomDeClasse { + name = this.constructor.name; + + constructor( + public champA: number, + public champB: number, + ) {} +} + +// * Required to generate code +export default NomDeClasse.name; + +// * Required for the editor to display the component and generate code +export const EDITOR_COMPONENT_MANIFEST: EditorComponentManifest = { + name: "NomDeClasse", + description: "", + params: [ + { + type: "number", + name: "champA", + description: "", + example: 0, + default: 0, + }, + // un objet par champ du constructeur + ], +}; +``` + +Et `nanoforge.manifest.json` à côté : + +```json +{ + "name": "nf/", + "type": "component", + "description": "", + "tags": ["", ""] +} +``` + +Référence réelle : `packages/nf-position-2d.component/`. + +## System (`*.system`) + +Dossier `packages/nf-.system/`, fichier `index.ts` : + +```ts +import { type Context } from "@nanoforge-dev/common"; +import { type EditorSystemManifest, type Registry } from "@nanoforge-dev/ecs-lib"; + +import { ComposantA } from "../components/nf-composant-a.component"; +import { ComposantB } from "../components/nf-composant-b.component"; + +export function nomFonction(registry: Registry, ctx: Context) { + const entities = registry.getZipper([ComposantA, ComposantB]); + + entities.forEach(({ ComposantA, ComposantB }) => { + // logique du system + }); +} + +// * Required to generate code +export default nomFonction.name; + +// * Required for the editor to display the system and generate code +export const EDITOR_SYSTEM_MANIFEST: EditorSystemManifest = { + name: "nomFonction", + description: "", + dependencies: ["ComposantA", "ComposantB"], +}; +``` + +Note : l'import des composants utilisés se fait en chemin relatif (`../components/nf-xxx.component`), pas via l'alias `@components/*` — c'est la convention observée dans tous les systems existants (ex. `nf-move-2d.system`). + +Et `nanoforge.manifest.json` : + +```json +{ + "name": "nf/", + "type": "system", + "description": "", + "tags": ["", ""], + "dependencies": ["nf/", "nf/"] +} +``` + +Référence réelle : `packages/nf-move-2d.system/`. + +## Après la création + +1. Proposer d'ajouter un test dans `test/systems.spec.ts` (import via l'alias `@systems/nf-.system`), sans l'imposer — c'est un fichier partagé entre tous les systems, à éditer avec attention pour ne pas casser les tests existants. +2. Lancer `pnpm run lint` et `pnpm run build` pour valider que le nouveau package compile et respecte les règles ESLint/Prettier du repo avant de proposer un commit. +3. Ne jamais publier ou modifier `pnpm-workspace.yaml` dans le cadre de ce skill — l'ajout d'un composant/system ne nécessite aucune dépendance supplémentaire au-delà de celles déjà présentes dans le catalog `core`. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..fc3ecd8 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,91 @@ +# components-systems + +## Rôle + +`@nanoforge-dev/components-systems` est un monorepo qui regroupe une collection de composants et de systèmes ECS (Entity-Component-System) génériques, réutilisables pour créer des jeux avec le moteur NanoForge. Chaque composant/système est publié comme un module installable individuellement via la CLI NanoForge (`nf install nf/position-2d`, `nf install nf/move-2d`, ...). + +## Stack technique + +- **Langage** : TypeScript (strict, decorators activés, ESNext, module resolution "Bundler") +- **Gestion de monorepo** : pnpm workspaces + pnpm catalogs (catégories `core`, `ci`, `lint`, `test` dans `pnpm-workspace.yaml`) +- **Build** : `tsc -b` (project references) +- **Tests** : Vitest (avec typecheck intégré via `tsconfig.spec.json` et coverage v8) +- **Lint/format** : ESLint (config partagée `@nanoforge-dev/utils-eslint-config`) + Prettier (plugin de tri des imports `@trivago/prettier-plugin-sort-imports`) +- **Git hooks** : Husky + lint-staged +- **Commits** : convention Conventional Commits (commitlint) +- **Changelog/release** : git-cliff +- **Node** : v25 requis (`.nvmrc`, `engines.node` dans `package.json`), pnpm 11.9.0 (`packageManager`) + +### Dépendances NanoForge déclarées + +Dépendances externes déclarées en devDependencies, résolues via le catalog pnpm `core` (versions centralisées dans `pnpm-workspace.yaml`) : + +- `@nanoforge-dev/common` +- `@nanoforge-dev/ecs-lib` +- `@nanoforge-dev/ecs-server` +- `@nanoforge-dev/graphics-2d` +- `@nanoforge-dev/input` +- `@nanoforge-dev/network-client` +- `@nanoforge-dev/network-server` + +`@nanoforge-dev/actions` est déclaré via le catalog `ci`. + +## Structure du projet + +``` +components-systems/ +├── packages/ # 31 packages, un par composant ou système +│ ├── nf-position-2d.component/ +│ │ ├── index.ts # classe du composant + export par défaut + EDITOR_COMPONENT_MANIFEST +│ │ └── nanoforge.manifest.json # métadonnées (nom "nf/...", type, description, tags) +│ ├── nf-velocity-2d.component/ +│ ├── nf-move-2d.system/ +│ │ ├── index.ts # fonction système + EDITOR_SYSTEM_MANIFEST +│ │ └── nanoforge.manifest.json # dépendances vers d'autres composants/systèmes +│ ├── nf-collision-2d.system/ +│ └── ... (autres composants/systems : health, hitbox, gravity, damage, drawable, etc.) +├── test/ +│ └── systems.spec.ts # tests Vitest +├── .github/workflows/ # tests.yml, release.yml, pr-triage.yml, issue-triage.yml, label-sync.yml +├── tsconfig.json # paths @components/* et @systems/* -> ./packages/* +├── vitest.config.ts +├── pnpm-workspace.yaml # catalogs de dépendances partagées +└── package.json +``` + +Chaque package suit un schéma de nommage `nf-.component` ou `nf-.system`, sans `package.json` propre : ce sont de simples dossiers avec un `index.ts` et un `nanoforge.manifest.json`, consommés directement par l'outillage NanoForge (CLI/éditeur) plutôt que publiés individuellement sur npm. + +### Pattern composant (`*.component`) + +Une classe simple portant des données, avec : +- `export default NomDeClasse.name;` (requis pour la génération de code) +- `export const EDITOR_COMPONENT_MANIFEST` (typé `EditorComponentManifest` depuis `@nanoforge-dev/ecs-lib`) décrivant les paramètres pour l'éditeur visuel (type, nom, description, exemple, valeur par défaut) + +Exemple (`nf-position-2d.component`) : une classe `Position2D { x: number; y: number }`. + +### Pattern système (`*.system`) + +Une fonction pure `(registry: Registry, ctx?: Context) => void` qui récupère les entités via `registry.getZipper([...Components])` ou `getIndexedZipper`, puis mute leurs composants. Accompagnée de : +- `export default nomFonction.name;` +- `export const EDITOR_SYSTEM_MANIFEST` (typé `EditorSystemManifest` depuis `@nanoforge-dev/ecs-lib`) listant les dépendances (noms de composants requis) + +Exemple (`nf-move-2d.system`) : met à jour `Position2D` à partir de `Velocity2D` et du delta-temps (`ctx.app.delta`). + +Chaque package possède aussi un `nanoforge.manifest.json` au format `{ name: "nf/", type: "component"|"system", description, tags, dependencies? }` qui sert à la CLI/registry NanoForge pour l'installation et la résolution de dépendances. + +## Commandes principales + +- `pnpm run build` → `tsc -b` (build incrémental via project references) +- `pnpm run test` (= `test:unit`) → `vitest run --config vitest.config.ts` +- `pnpm run lint` → `prettier --check .` + `eslint --format=pretty packages` +- `pnpm run format` → `prettier --write .` + `eslint --fix --format=pretty packages` +- `pnpm run changelog` → `git cliff --prepend ./CHANGELOG.md -u -c ./cliff.toml -r ./ --include-path './*'` + +## Conventions + +- Imports utilisant les alias `@components/*` et `@systems/*`, tous deux mappés vers `./packages/*` dans `tsconfig.json` et `vitest.config.ts`. +- Les composants/systèmes utilisés en interne (autres systèmes du même repo) s'importent via des chemins relatifs du type `../components/nf-position-2d.component` (chemin littéral utilisé dans les systèmes, ex. `nf-move-2d.system`, `nf-gravity-2d.system`, `nf-collision-2d.system`). +- Les tests (`test/systems.spec.ts`) importent via les alias `@systems/...`. +- Tags de catégorisation dans les manifests (ex. `"base"`, `"mouvement"`) pour le classement dans la CLI/registry/éditeur. +- Dépendances entre systèmes et composants déclarées explicitement dans `nanoforge.manifest.json` (champ `dependencies`), reflet des imports TypeScript réels. +- Convention de commit imposée par commitlint (Conventional Commits), vérifiée par un hook Husky. From 0ec118831fda524f17070f2015e5592a5bbc66cb Mon Sep 17 00:00:00 2001 From: Harper Date: Fri, 23 Oct 2026 14:03:37 +0200 Subject: [PATCH 2/2] fix(agents-doc): translate to english --- .claude/skills/new-ecs-package/SKILL.md | 80 +++++++++++----------- AGENTS.md | 90 ++++++++++++------------- 2 files changed, 85 insertions(+), 85 deletions(-) diff --git a/.claude/skills/new-ecs-package/SKILL.md b/.claude/skills/new-ecs-package/SKILL.md index ce9d6be..6e51c6a 100644 --- a/.claude/skills/new-ecs-package/SKILL.md +++ b/.claude/skills/new-ecs-package/SKILL.md @@ -1,111 +1,111 @@ --- name: new-ecs-package -description: Scaffold un nouveau composant ou system ECS dans ce repo (components-systems), en suivant exactement le pattern des packages existants. À utiliser quand l'utilisateur demande d'ajouter un nouveau composant ou system NanoForge dans ce repo. +description: Scaffold a new ECS component or system in this repo (components-systems), following exactly the pattern of existing packages. Use when the user asks to add a new NanoForge component or system in this repo. --- -# Nouveau composant / system ECS +# New ECS component / system -Chaque package de `packages/` est un simple dossier (pas de `package.json` propre) contenant `index.ts` + `nanoforge.manifest.json`. Aucune étape d'enregistrement centralisé n'est nécessaire : `tsconfig.json`/`vitest.config.ts` mappent déjà `@components/*` et `@systems/*` vers `./packages/*`, et `tsconfig.json` inclut `packages/**/*.ts` — un nouveau dossier est automatiquement pris en compte. +Each package under `packages/` is a plain folder (no `package.json` of its own) containing `index.ts` + `nanoforge.manifest.json`. No centralized registration step is needed: `tsconfig.json`/`vitest.config.ts` already map `@components/*` and `@systems/*` to `./packages/*`, and `tsconfig.json` includes `packages/**/*.ts` — a new folder is automatically picked up. -Avant de créer un package, vérifier qu'il n'existe pas déjà sous un nom proche (`ls packages/ | grep -i `). +Before creating a package, check that one doesn't already exist under a similar name (`ls packages/ | grep -i `). -## Composant (`*.component`) +## Component (`*.component`) -Dossier `packages/nf-.component/`, fichier `index.ts` : +Folder `packages/nf-.component/`, `index.ts` file: ```ts import { type EditorComponentManifest } from "@nanoforge-dev/ecs-lib"; -export class NomDeClasse { +export class ClassName { name = this.constructor.name; constructor( - public champA: number, - public champB: number, + public fieldA: number, + public fieldB: number, ) {} } // * Required to generate code -export default NomDeClasse.name; +export default ClassName.name; // * Required for the editor to display the component and generate code export const EDITOR_COMPONENT_MANIFEST: EditorComponentManifest = { - name: "NomDeClasse", - description: "", + name: "ClassName", + description: "", params: [ { type: "number", - name: "champA", - description: "", + name: "fieldA", + description: "", example: 0, default: 0, }, - // un objet par champ du constructeur + // one object per constructor field ], }; ``` -Et `nanoforge.manifest.json` à côté : +And `nanoforge.manifest.json` alongside it: ```json { - "name": "nf/", + "name": "nf/", "type": "component", - "description": "", + "description": "", "tags": ["", ""] } ``` -Référence réelle : `packages/nf-position-2d.component/`. +Real reference: `packages/nf-position-2d.component/`. ## System (`*.system`) -Dossier `packages/nf-.system/`, fichier `index.ts` : +Folder `packages/nf-.system/`, `index.ts` file: ```ts import { type Context } from "@nanoforge-dev/common"; import { type EditorSystemManifest, type Registry } from "@nanoforge-dev/ecs-lib"; -import { ComposantA } from "../components/nf-composant-a.component"; -import { ComposantB } from "../components/nf-composant-b.component"; +import { ComponentA } from "../components/nf-component-a.component"; +import { ComponentB } from "../components/nf-component-b.component"; -export function nomFonction(registry: Registry, ctx: Context) { - const entities = registry.getZipper([ComposantA, ComposantB]); +export function functionName(registry: Registry, ctx: Context) { + const entities = registry.getZipper([ComponentA, ComponentB]); - entities.forEach(({ ComposantA, ComposantB }) => { - // logique du system + entities.forEach(({ ComponentA, ComponentB }) => { + // system logic }); } // * Required to generate code -export default nomFonction.name; +export default functionName.name; // * Required for the editor to display the system and generate code export const EDITOR_SYSTEM_MANIFEST: EditorSystemManifest = { - name: "nomFonction", - description: "", - dependencies: ["ComposantA", "ComposantB"], + name: "functionName", + description: "", + dependencies: ["ComponentA", "ComponentB"], }; ``` -Note : l'import des composants utilisés se fait en chemin relatif (`../components/nf-xxx.component`), pas via l'alias `@components/*` — c'est la convention observée dans tous les systems existants (ex. `nf-move-2d.system`). +Note: the components used are imported via a relative path (`../components/nf-xxx.component`), not via the `@components/*` alias — this is the convention observed in all existing systems (e.g. `nf-move-2d.system`). -Et `nanoforge.manifest.json` : +And `nanoforge.manifest.json`: ```json { - "name": "nf/", + "name": "nf/", "type": "system", - "description": "", + "description": "", "tags": ["", ""], - "dependencies": ["nf/", "nf/"] + "dependencies": ["nf/", "nf/"] } ``` -Référence réelle : `packages/nf-move-2d.system/`. +Real reference: `packages/nf-move-2d.system/`. -## Après la création +## After creation -1. Proposer d'ajouter un test dans `test/systems.spec.ts` (import via l'alias `@systems/nf-.system`), sans l'imposer — c'est un fichier partagé entre tous les systems, à éditer avec attention pour ne pas casser les tests existants. -2. Lancer `pnpm run lint` et `pnpm run build` pour valider que le nouveau package compile et respecte les règles ESLint/Prettier du repo avant de proposer un commit. -3. Ne jamais publier ou modifier `pnpm-workspace.yaml` dans le cadre de ce skill — l'ajout d'un composant/system ne nécessite aucune dépendance supplémentaire au-delà de celles déjà présentes dans le catalog `core`. +1. Suggest adding a test in `test/systems.spec.ts` (imported via the `@systems/nf-.system` alias), without forcing it — it's a file shared across all systems, to be edited carefully so as not to break existing tests. +2. Run `pnpm run lint` and `pnpm run build` to verify that the new package compiles and complies with the repo's ESLint/Prettier rules before proposing a commit. +3. Never publish or modify `pnpm-workspace.yaml` as part of this skill — adding a component/system requires no additional dependency beyond those already present in the `core` catalog. diff --git a/AGENTS.md b/AGENTS.md index fc3ecd8..774dd60 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,24 +1,24 @@ # components-systems -## Rôle +## Role -`@nanoforge-dev/components-systems` est un monorepo qui regroupe une collection de composants et de systèmes ECS (Entity-Component-System) génériques, réutilisables pour créer des jeux avec le moteur NanoForge. Chaque composant/système est publié comme un module installable individuellement via la CLI NanoForge (`nf install nf/position-2d`, `nf install nf/move-2d`, ...). +`@nanoforge-dev/components-systems` is a monorepo that gathers a collection of generic, reusable ECS (Entity-Component-System) components and systems for building games with the NanoForge engine. Each component/system is published as a module that can be installed individually via the NanoForge CLI (`nf install nf/position-2d`, `nf install nf/move-2d`, ...). -## Stack technique +## Tech Stack -- **Langage** : TypeScript (strict, decorators activés, ESNext, module resolution "Bundler") -- **Gestion de monorepo** : pnpm workspaces + pnpm catalogs (catégories `core`, `ci`, `lint`, `test` dans `pnpm-workspace.yaml`) -- **Build** : `tsc -b` (project references) -- **Tests** : Vitest (avec typecheck intégré via `tsconfig.spec.json` et coverage v8) -- **Lint/format** : ESLint (config partagée `@nanoforge-dev/utils-eslint-config`) + Prettier (plugin de tri des imports `@trivago/prettier-plugin-sort-imports`) -- **Git hooks** : Husky + lint-staged -- **Commits** : convention Conventional Commits (commitlint) -- **Changelog/release** : git-cliff -- **Node** : v25 requis (`.nvmrc`, `engines.node` dans `package.json`), pnpm 11.9.0 (`packageManager`) +- **Language**: TypeScript (strict, decorators enabled, ESNext, "Bundler" module resolution) +- **Monorepo management**: pnpm workspaces + pnpm catalogs (`core`, `ci`, `lint`, `test` categories in `pnpm-workspace.yaml`) +- **Build**: `tsc -b` (project references) +- **Tests**: Vitest (with integrated typechecking via `tsconfig.spec.json` and v8 coverage) +- **Lint/format**: ESLint (shared config `@nanoforge-dev/utils-eslint-config`) + Prettier (import-sorting plugin `@trivago/prettier-plugin-sort-imports`) +- **Git hooks**: Husky + lint-staged +- **Commits**: Conventional Commits convention (commitlint) +- **Changelog/release**: git-cliff +- **Node**: v25 required (`.nvmrc`, `engines.node` in `package.json`), pnpm 11.9.0 (`packageManager`) -### Dépendances NanoForge déclarées +### Declared NanoForge dependencies -Dépendances externes déclarées en devDependencies, résolues via le catalog pnpm `core` (versions centralisées dans `pnpm-workspace.yaml`) : +External dependencies declared as devDependencies, resolved via the pnpm `core` catalog (versions centralized in `pnpm-workspace.yaml`): - `@nanoforge-dev/common` - `@nanoforge-dev/ecs-lib` @@ -28,54 +28,54 @@ Dépendances externes déclarées en devDependencies, résolues via le catalog p - `@nanoforge-dev/network-client` - `@nanoforge-dev/network-server` -`@nanoforge-dev/actions` est déclaré via le catalog `ci`. +`@nanoforge-dev/actions` is declared via the `ci` catalog. -## Structure du projet +## Project Structure ``` components-systems/ -├── packages/ # 31 packages, un par composant ou système +├── packages/ # 31 packages, one per component or system │ ├── nf-position-2d.component/ -│ │ ├── index.ts # classe du composant + export par défaut + EDITOR_COMPONENT_MANIFEST -│ │ └── nanoforge.manifest.json # métadonnées (nom "nf/...", type, description, tags) +│ │ ├── index.ts # component class + default export + EDITOR_COMPONENT_MANIFEST +│ │ └── nanoforge.manifest.json # metadata (name "nf/...", type, description, tags) │ ├── nf-velocity-2d.component/ │ ├── nf-move-2d.system/ -│ │ ├── index.ts # fonction système + EDITOR_SYSTEM_MANIFEST -│ │ └── nanoforge.manifest.json # dépendances vers d'autres composants/systèmes +│ │ ├── index.ts # system function + EDITOR_SYSTEM_MANIFEST +│ │ └── nanoforge.manifest.json # dependencies on other components/systems │ ├── nf-collision-2d.system/ -│ └── ... (autres composants/systems : health, hitbox, gravity, damage, drawable, etc.) +│ └── ... (other components/systems: health, hitbox, gravity, damage, drawable, etc.) ├── test/ -│ └── systems.spec.ts # tests Vitest +│ └── systems.spec.ts # Vitest tests ├── .github/workflows/ # tests.yml, release.yml, pr-triage.yml, issue-triage.yml, label-sync.yml -├── tsconfig.json # paths @components/* et @systems/* -> ./packages/* +├── tsconfig.json # @components/* and @systems/* paths -> ./packages/* ├── vitest.config.ts -├── pnpm-workspace.yaml # catalogs de dépendances partagées +├── pnpm-workspace.yaml # shared dependency catalogs └── package.json ``` -Chaque package suit un schéma de nommage `nf-.component` ou `nf-.system`, sans `package.json` propre : ce sont de simples dossiers avec un `index.ts` et un `nanoforge.manifest.json`, consommés directement par l'outillage NanoForge (CLI/éditeur) plutôt que publiés individuellement sur npm. +Each package follows an `nf-.component` or `nf-.system` naming scheme, with no `package.json` of its own: they are plain folders containing an `index.ts` and a `nanoforge.manifest.json`, consumed directly by the NanoForge tooling (CLI/editor) rather than published individually to npm. -### Pattern composant (`*.component`) +### Component pattern (`*.component`) -Une classe simple portant des données, avec : -- `export default NomDeClasse.name;` (requis pour la génération de code) -- `export const EDITOR_COMPONENT_MANIFEST` (typé `EditorComponentManifest` depuis `@nanoforge-dev/ecs-lib`) décrivant les paramètres pour l'éditeur visuel (type, nom, description, exemple, valeur par défaut) +A simple data-holding class, with: +- `export default ClassName.name;` (required for code generation) +- `export const EDITOR_COMPONENT_MANIFEST` (typed as `EditorComponentManifest` from `@nanoforge-dev/ecs-lib`) describing the parameters for the visual editor (type, name, description, example, default value) -Exemple (`nf-position-2d.component`) : une classe `Position2D { x: number; y: number }`. +Example (`nf-position-2d.component`): a `Position2D { x: number; y: number }` class. -### Pattern système (`*.system`) +### System pattern (`*.system`) -Une fonction pure `(registry: Registry, ctx?: Context) => void` qui récupère les entités via `registry.getZipper([...Components])` ou `getIndexedZipper`, puis mute leurs composants. Accompagnée de : -- `export default nomFonction.name;` -- `export const EDITOR_SYSTEM_MANIFEST` (typé `EditorSystemManifest` depuis `@nanoforge-dev/ecs-lib`) listant les dépendances (noms de composants requis) +A pure function `(registry: Registry, ctx?: Context) => void` that retrieves entities via `registry.getZipper([...Components])` or `getIndexedZipper`, then mutates their components. Accompanied by: +- `export default functionName.name;` +- `export const EDITOR_SYSTEM_MANIFEST` (typed as `EditorSystemManifest` from `@nanoforge-dev/ecs-lib`) listing the dependencies (names of required components) -Exemple (`nf-move-2d.system`) : met à jour `Position2D` à partir de `Velocity2D` et du delta-temps (`ctx.app.delta`). +Example (`nf-move-2d.system`): updates `Position2D` from `Velocity2D` and the delta-time (`ctx.app.delta`). -Chaque package possède aussi un `nanoforge.manifest.json` au format `{ name: "nf/", type: "component"|"system", description, tags, dependencies? }` qui sert à la CLI/registry NanoForge pour l'installation et la résolution de dépendances. +Each package also has a `nanoforge.manifest.json` in the format `{ name: "nf/", type: "component"|"system", description, tags, dependencies? }`, used by the NanoForge CLI/registry for installation and dependency resolution. -## Commandes principales +## Main Commands -- `pnpm run build` → `tsc -b` (build incrémental via project references) +- `pnpm run build` → `tsc -b` (incremental build via project references) - `pnpm run test` (= `test:unit`) → `vitest run --config vitest.config.ts` - `pnpm run lint` → `prettier --check .` + `eslint --format=pretty packages` - `pnpm run format` → `prettier --write .` + `eslint --fix --format=pretty packages` @@ -83,9 +83,9 @@ Chaque package possède aussi un `nanoforge.manifest.json` au format `{ name: "n ## Conventions -- Imports utilisant les alias `@components/*` et `@systems/*`, tous deux mappés vers `./packages/*` dans `tsconfig.json` et `vitest.config.ts`. -- Les composants/systèmes utilisés en interne (autres systèmes du même repo) s'importent via des chemins relatifs du type `../components/nf-position-2d.component` (chemin littéral utilisé dans les systèmes, ex. `nf-move-2d.system`, `nf-gravity-2d.system`, `nf-collision-2d.system`). -- Les tests (`test/systems.spec.ts`) importent via les alias `@systems/...`. -- Tags de catégorisation dans les manifests (ex. `"base"`, `"mouvement"`) pour le classement dans la CLI/registry/éditeur. -- Dépendances entre systèmes et composants déclarées explicitement dans `nanoforge.manifest.json` (champ `dependencies`), reflet des imports TypeScript réels. -- Convention de commit imposée par commitlint (Conventional Commits), vérifiée par un hook Husky. +- Imports use the `@components/*` and `@systems/*` aliases, both mapped to `./packages/*` in `tsconfig.json` and `vitest.config.ts`. +- Components/systems used internally (by other systems in the same repo) are imported via relative paths such as `../components/nf-position-2d.component` (the literal path used in systems, e.g. `nf-move-2d.system`, `nf-gravity-2d.system`, `nf-collision-2d.system`). +- Tests (`test/systems.spec.ts`) import via the `@systems/...` aliases. +- Categorization tags in the manifests (e.g. `"base"`, `"mouvement"`) for classification in the CLI/registry/editor. +- Dependencies between systems and components are declared explicitly in `nanoforge.manifest.json` (the `dependencies` field), mirroring the actual TypeScript imports. +- Commit convention enforced by commitlint (Conventional Commits), checked by a Husky hook.