@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.
|
|
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.
|
|
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
|
|
316
|
-
├── routes.tsx
|
|
317
|
-
├── queries.ts
|
|
318
|
-
├──
|
|
319
|
-
├──
|
|
320
|
-
|
|
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
|
-
-
|
|
371
|
-
|
|
372
|
-
|
|
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
|
-
//
|
|
135
|
-
//
|
|
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
|
|
143
|
+
cause: "status=draft while the manifest entry is in-progress or delivered",
|
|
144
144
|
suggestedFix:
|
|
145
|
-
"Move the spec to validated/implemented, or
|
|
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
|
}
|