A new optional directive, layouts: 'templates', lays every entry on the decorated spreads of the book theme's archetype and its kin (design-templated.ts). An entry's photos are cut into page-sized parts that leave no frame empty, at most twelve of them, the first part carrying its story; each part takes the template that suits it best, poured from a page of the entry's photos and story so the title, place, date and story stay bound to the journal. A story longer than its frame is cut at a sentence and goes on over a page of words. Date marks are set as stamps, never in the classic styles. Loose gallery photos go to the entry they are linked to, then to the entry of their day, then to the entry with the fewest (shareGalleryByDay, beside distributeGallery, which stays as it is); what no entry has room for closes the book on up to three pages of more moments, and anything past that is said to be left out, so no photo is dropped without a word. The rest is the composer's: scope, the photo picker, the page budget, the stored pages kept, repair and findings. A book can bring its own theme object (BookDesignInput.theme), recoloured or not, and it is kept whole. Plan rows name the template a page was laid on. Without the directive every design is composed exactly as before, and classic is still buildBook. AUTODSN-001..015 cover the rules, and AUTODSN-020 pins a digest of every page on the auto layout's parity journeys and a fourth one in three themes. design-templated.parity.json was computed with the spec's own canonical form and digest over these inputs, run through tsx; CI checks it from here on.
@trek/shared
Single source of truth for TREK's API contracts, expressed as Zod schemas and consumed by both the server (request validation + inferred DTO types) and the client (typed requests/responses).
This package is part of the incremental NestJS + React 19 migration (see the "Brownfield Rewrite" board). It is intentionally dormant until modules start importing it — adding it changes nothing for users.
Rules
- One folder per domain:
src/<domain>/<domain>.schema.ts(+.spec.ts). - Domain-agnostic building blocks live in
src/common/. - A route is only considered migrated once its contract lives here.
- Schemas are the source of truth; server DTOs and client types are inferred from them
(
z.infer<typeof schema>), never hand-duplicated.
Consumption (dev)
Both apps resolve @trek/shared to this package's TypeScript source:
- Server (
tsx): viapathsinserver/tsconfig.json. - Client (
vite): viaresolve.aliasinclient/vite.config.ts(+pathsfor the type-checker).
Production packaging (Docker / workspace wiring) is introduced in card F2, when the server first depends on this package at runtime. Until then prod builds are untouched.
Not yet here
The canonical error envelope is finalised in card F5 (it must match TREK's current Express error responses byte-for-byte), so it is deliberately not invented in F1.