@ogygie/cli 0.17.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -15952,6 +15952,18 @@ var governedChecksumsByVersion = {
15952
15952
  "scripts/verify-specs.ts": "03d58baa11822ad7ae67080f990f7a82f4f94d223b12777728b8b9ddd7ebd843",
15953
15953
  "tsconfig.base.json": "0f8919e9ed8bbc88e0308fa2fa91471dabb18d1df721bd78c04076597eba89a2"
15954
15954
  },
15955
+ "0.18.0": {
15956
+ ".github/workflows/ogygie-gates.yml": "48c40efe9fe66dd0f9c3b94287026d80eae9afd6782b5833fdf8846d8662babf",
15957
+ "AGENTS.md": "8356696ef27c53cad164ab0086163454348b18852b121eca9fb050fb73e625f0",
15958
+ "CLAUDE.md": "785ee8d90e368806d8cf0b4d84a15f29d1dc961168bda86cf1a6c60a923c8c9b",
15959
+ "scripts/lint-interdits.ts": "4644e1aaabc1d19ed42a0bdf8e2e55b9451f789d87d59754bce3432de7c357e7",
15960
+ "scripts/ogygie-design-brief.ts": "aba1585717b30808dd0bc8930a37a1ad2d83ee6869f969dbd06ca595e37a4a89",
15961
+ "scripts/ogygie-impact.ts": "f06cc8b4a46ddfbcfb32ba747c2454548ca49918123d04ab13d210b4a89c1fb9",
15962
+ "scripts/verify-contracts.ts": "9cd64c88dcc3b54b65bf1e1b7a68eb00353ee16f2a9ce8bca3c49ba063c2a08b",
15963
+ "scripts/verify-manifest.ts": "6c448fa3a19b87666f686ca57c6ca834d9e169b1380e4fe6e4c19b995bf94f3c",
15964
+ "scripts/verify-specs.ts": "92d54aa5111fe0753aa9d6eb3b4ac89a7f24fa06578ea3369ccb0dc9d4c3dd88",
15965
+ "tsconfig.base.json": "0f8919e9ed8bbc88e0308fa2fa91471dabb18d1df721bd78c04076597eba89a2"
15966
+ },
15955
15967
  "0.2.0": {
15956
15968
  ".github/workflows/ogygie-gates.yml": "48c40efe9fe66dd0f9c3b94287026d80eae9afd6782b5833fdf8846d8662babf",
15957
15969
  "AGENTS.md": "ca73ab619d8c55fac11858d815bf5fbab6537ecebe7ae4123cbdeb3e3e36bf1a",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ogygie/cli",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Ogygie framework CLI: deterministic scaffolding (init), governed-file upgrades (upgrade) and lockstep verification (check) for Ogygie products.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -17,7 +17,7 @@
17
17
  "access": "public"
18
18
  },
19
19
  "devDependencies": {
20
- "@ogygie/core": "0.17.0",
20
+ "@ogygie/core": "0.18.0",
21
21
  "@types/node": "^24.0.0",
22
22
  "esbuild": "^0.28.0",
23
23
  "tsx": "^4.20.0",
@@ -311,14 +311,21 @@ Tailwind du produit déclare le paquet comme source
311
311
 
312
312
  ### Structure d'une feature front (miroir de l'API)
313
313
  ```
314
- apps/web/features/orders/
315
- ├── index.ts # seul export public
316
- ├── routes.tsx # définition TanStack Router de la feature
317
- ├── queries.ts # hooks TanStack Query (fetch + invalidations)
318
- ├── OrdersList.tsx # écrans = composition de patterns, rien d'autre
319
- ├── OrderForm.tsx
320
- └── OrdersList.test.tsx # un test par état UI de la spec
314
+ apps/web/src/features/orders/
315
+ ├── index.ts # seul export public
316
+ ├── routes.tsx # fabrique createRoute de la feature, que le routeur de l'app ajoute à ses enfants
317
+ ├── queries.ts # hooks TanStack Query de LECTURE (clés de cache dérivées du manifeste)
318
+ ├── writes.ts # hooks de MUTATION (invalidations dérivées du manifeste)
319
+ ├── OrdersScreen.container.tsx # le CONTENEUR : lit les hooks, déroule les états par ScreenState, passe au corps des données servies
320
+ ├── OrdersScreen.tsx # le CORPS : reçoit data, QueryLike et MutationLike — jamais un hook ; compose les vues
321
+ ├── views/OrdersList.tsx # une vue = un pattern (DataTable, ContractForm, VarianceChart…) sur UNE opération
322
+ ├── views/OrderForm.tsx
323
+ └── OrdersScreen.test.tsx # un test par état UI de la spec : le conteneur sous un fetch simulé, ou le corps sur des QueryLike
321
324
  ```
325
+ Une feature générée porte les mêmes fichiers à l'infixe `.gen` près
326
+ (`queries.gen.ts`, `writes.gen.ts`, `OrdersScreen.container.gen.tsx`,
327
+ `views/OrdersList.gen.tsx`, `routes.gen.tsx`) ; son corps `OrdersScreen.tsx`
328
+ et ses vues `custom` restent écrits.
322
329
 
323
330
  ### Template canonique — hook de requête
324
331
  ```ts
@@ -367,9 +374,11 @@ export function OrdersList() {
367
374
  - Un écran est une COMPOSITION de patterns : jamais de `<table>`, `<form>` ou fetch nus
368
375
  dans une feature. Si un pattern manque, on le crée dans `patterns/` (et on met à jour
369
376
  `design/patterns.md`), on ne bricole pas dans la feature.
370
- - Les états d'un écran — accès refusé, erreur, chargement, vide — passent par
371
- `ScreenState`, jamais par une cascade de `if` propre à l'écran : le corps ne reçoit
372
- que des données servies.
377
+ - Un écran est un CONTENEUR et un CORPS. Le conteneur lit les hooks (route, lectures,
378
+ écritures) et déroule les états — accès refusé, erreur, chargement — par
379
+ `ScreenState`, jamais par une cascade de `if` ; le corps reçoit la lecture
380
+ principale SERVIE, les autres lectures en `QueryLike` et les écritures en
381
+ `MutationLike`, jamais un hook : il se teste sans client de requêtes ni réseau.
373
382
  - Chaque état UI listé dans la spec (vide/chargement/nominal/erreur) a son test.
374
383
  - Toute chaîne visible passe par Lingui (`<Trans>`/`t`) — la CI casse sinon.
375
384
  - Chiffres financiers : `tabular-nums`, alignés à droite, unité explicite.
@@ -131,8 +131,8 @@ for (const fileName of specFiles) {
131
131
 
132
132
  if (frontmatter.status === "draft") {
133
133
  // What counts as an implementation is the core's rule, not this script's:
134
- // a package's folder is REQUIRED by the manifest gate, so its existence
135
- // proves nothing (see hasImplementation).
134
+ // the STATUS the map declares, never a folder (see hasImplementation) — a
135
+ // generated folder waits on its branch while the spec awaits its signature.
136
136
  const implemented =
137
137
  owner !== undefined && hasImplementation(owner, ownerDir !== null && existsSync(ownerDir));
138
138
  if (implemented) {
@@ -140,9 +140,9 @@ for (const fileName of specFiles) {
140
140
  code: "SPEC_DRAFT_ALREADY_IMPLEMENTED",
141
141
  message: `Spec ${fileName} is draft but an implementation exists.`,
142
142
  file: specPath,
143
- cause: "status=draft with code or a non-skeleton manifest entry",
143
+ cause: "status=draft while the manifest entry is in-progress or delivered",
144
144
  suggestedFix:
145
- "Move the spec to validated/implemented, or remove the premature implementation.",
145
+ "Move the spec to validated/implemented, or declare the entry skeleton while the spec awaits its validation — a folder on a branch is a proposal, not a delivery.",
146
146
  });
147
147
  }
148
148
  }