03 — Packaging : la vision complète des packages
Statut : accepté · Phase : transverse · Mis à jour : 02/11/2026.
Ce document est l'inventaire exhaustif. Il couvre tout ce qui existe aujourd'hui (le framework de sites, presentation-engine, emaki), ce qu'on garde, renomme ou supprime, ce qu'on crée, et les noms réservés sans être utilisés. Aucun projet du workspace ne doit exister sans une ligne dans ce document.
Légende des décisions :
- ✅ garder tel quel ;
- ✏️ renommer ou déplacer ;
- 🆕 créer ;
- 🗑️ supprimer ;
- 🔒 réserver le nom npm sans code ;
- 📅 planifié dans une phase ultérieure. Certains ont déjà un squelette privé
0.0.0(export {}) créé en P1 :packages/{data,time}etpackages/formats/{report,toon,book,roadmap,calendar,stories,paged}; le code arrive dans la phase.
1. Découpage en sous-projets
Le monorepo est découpé en groupes. Chacun est un dossier qui correspond à un glob pnpm :
| Groupe | Dossier | Rôle | Publié sur npm |
|---|---|---|---|
| Socle du framework de sites | packages/site/ | cœur du framework de sites forké, le seul vestige du dépôt d'origine | non |
| Fondations | packages/{core,theme,components,data,time,form,geo,scenario}/ | modèle Story, parseur, config, thèmes, composants partagés par tous les formats, données. Ne dépend d'aucun format ni de @recit/paged. Acceptées le 24/10 (plans 10, 13, 14) : form (P10), geo (P6), scenario (P16) ; pixel réservé sans package | oui |
| Formats | packages/formats/* | un package par format : deck, motion (+ motion-blocks, motion-render), report, toon, book, roadmap, calendar, stories. Acceptés le 24/10 : directory (P9, déclare deux formats, glossary et directory, qui partagent leur modèle, règle B11), atlas (P15). Un format expose une vue imprimable et ne dépend jamais de @recit/paged | oui |
| Intégrations | packages/integrations/* | branchements vers des hôtes : @recit/site aujourd'hui (plus tard Next, Astro, VS Code…) | oui |
| Distribution | packages/{cli,recit,create-recit,mcp}/ | ce que l'utilisateur installe ou lance | oui |
| Outils | packages/tools/* | paged (chaîne d'impression Node, importée par la CLI seulement, P6), app (coquille Tauri 2 des sites, 18-mobile-desktop.md), studio (squelette, import différé), site-kit : outillage interne ou spécialisé | paged et app oui, les autres non |
| Sites | sites/* | un site par sous-domaine (voir 07-domaines.md) | non |
| Exemples | examples/* | projets minimaux, gabarits de create-recit et fixtures e2e | non |
| Tests transverses | e2e/ | Playwright sur les sites et les exemples | non |
| Marque | brand/ | logos, icônes, générateurs (voir 01-assets.md) ; brand/tools est le projet privé @recit/brand-tools (scripts du logo) | non |
pnpm-workspace.yaml cible :
YAML
On retire les globs scripts, examples/**, website et docs. emaki est copié directement dans
ces dossiers (voir 05-video.md), sans glob temporaire.
2. Arborescence finale
Code
3. Inventaire du le framework de sites : ce qu'on garde, ce qu'on supprime
3.1 Projets du workspace
| Projet actuel | Nom npm | Décision | Raison |
|---|---|---|---|
packages/site | @recit/site 0.93.0 | ✅ garder, privé, non publié | socle de tous les sites et de @recit/site-stories, code de Récit ; sa publication est la décision D2 de 22 |
packages/create-site | create-site | 🗑️ supprimer | remplacé par packages/create-recit (on s'en inspire avant suppression, voir P0) |
packages/plugin-graphql | plugin du framework | 🗑️ supprimer | doc d'API GraphQL : hors sujet. Le cœur @recit/site garde sa dépendance graphql interne (Pothos), qui n'a rien à voir |
packages/plugin-search-algolia | plugin du framework | 🗑️ supprimer | Récit utilise Pagefind (intégré au cœur) |
docs/ | docs | ✏️ git mv vers sites/docs | la doc du framework de sites sert de base à docs.recit.dev (config, déploiement, vérification des liens, historique). Son contenu est remplacé par la doc Récit en P2. Patch n° 2 d'UPSTREAM.md |
examples/with-config | with-config | ✅ garder | fixture de packages/site/src/vite/config.test.ts. La supprimer casserait les tests du cœur |
examples/cosmo-cargo | cosmo-cargo | 🗑️ supprimer | démo OpenAPI, utilisée par e2e/cosmo-cargo.spec.ts et la CI du framework de sites. Remplacée par sites/docs et nos e2e |
examples/api-identity-plugin, api-key-service et les exemples de monétisation | — | 🗑️ supprimer | clés d'API et monétisation |
examples/auth-firebase, auth-supabase, with-auth0 | — | 🗑️ supprimer | authentification de portail développeur. Les providers restent disponibles dans le cœur |
examples/aws-lambda-ssr, cloudflare-ssr | — | 🗑️ supprimer | à réécrire si un site Récit passe en SSR (voir les notes de llm/) |
examples/graphql, many-apis, with-openapi-json, with-openapi-yaml, search-algolia | — | 🗑️ supprimer | OpenAPI, GraphQL ou Algolia |
examples/mermaid, with-base-path, with-vite-config | — | 🗑️ supprimer | couverts par nos exemples. base-path est à retester dans un e2e/site-*.spec.ts (pas encore fait) |
scripts/ (check-admonitions.mjs) | — | ✏️ garder et adapter | vérifie les admonitions des pages MDX : globs sites/**/pages/** au lieu de docs/ et examples/ |
website (glob sans dossier) | — | 🗑️ retirer du workspace | n'existe pas |
3.2 Fichiers racine et CI
| Fichier | Décision |
|---|---|
LICENSE.md | ✅ MIT, copyright de Récit et d'emaki (voir NOTICE.md) |
NOTICE.md, UPSTREAM.md | 🆕 créés (racine) |
README.md | ✏️ réécrit pour Récit, avec une section « Fork of the site framework » (exigence de NOTICE.md) |
CHANGELOG.md | 🗑️ celui du framework de sites. Un CHANGELOG.md racine unique est recréé par nx release à la première version Récit |
CONTRIBUTING.md | ✏️ réécrit (workflow Récit, synchronisation upstream) |
AGENTS.md / CLAUDE.md | ✏️ mis à jour en fin de P1. Les conventions de code restent, et une section pointe vers context.md et sites/plans/pages/ |
assets/github-hero.png | 🗑️ remplacé par brand/social/ |
llm/ (notes SSR du framework de sites) | ✅ garder : référence utile pour patcher le cœur |
graphql.config.yml, patches/, llm/, .nxignore, .cspell.json, .vscode/launch.json | 🗑️ supprimés le 25/10 (inutiles pour Récit ; liste des chemins supprimés d'UPSTREAM.md) |
nx.json | ✏️ release.projects : ["site", "create-site"] → la liste explicite des packages publiés (§10) |
playwright.config.ts | ✏️ serveur web : cosmo-cargo → sites/docs et examples/deck-showcase |
package.json racine | ✏️ name: "root" → "recit-monorepo". On retire release:pre / release:minor (workflows du framework de sites) et on ajoute recit:* (aucun pour l'instant) |
.github/workflows/build.yaml | ✏️ réécrit : pnpm check, nx affected -t build test typecheck, e2e. Sans publication canary de @recit/site |
.github/workflows/main.yaml (release du framework de sites, identité du bot d'origine) | 🗑️ remplacé par release.yaml Récit |
.github/workflows/preview-build.yaml (verdaccio + cosmo-cargo) | 🗑️ supprimer |
.github/workflows/release-monetization.yaml (déclenche un dépôt privé) | 🗑️ supprimer |
.github/workflows/dependabot.yaml, .github/dependabot.yml, .github/release.yaml | 🗑️ dependabot.yaml (auto-approbation) et release.yaml supprimés le 25/10 ; ✏️ dependabot.yml sans packages/site (audit ST-19) |
3.3 À l'intérieur de packages/site : on ne supprime rien
Les plugins internes (openapi, api-catalog, api-keys, search-inkeep, search-pagefind,
markdown, custom-pages), les providers d'authentification et le code propre à l'éditeur
d'origine restent. Les supprimer créerait des conflits à chaque synchronisation upstream. Ils ne
sont simplement pas activés par les sites Récit, et le tree-shaking de Vite les écarte du bundle.
S'ils pèsent quand même sur la taille ou la sécurité, on les désactive par configuration, jamais par
suppression de code.
4. Inventaire de presentation-engine
| Package actuel | Devient | Dossier |
|---|---|---|
@presentation/core | ✏️ @recit/core | packages/core |
@presentation/theme | ✏️ @recit/theme | packages/theme |
@presentation/components | ✏️ découpé : slides/ et mdx/builtins génériques → @recit/components, le reste (deck/, hooks/, tools/, MdxSlide) → @recit/deck | packages/components, packages/formats/deck |
@presentation/runtime | ✏️ fusionné dans @recit/deck (sous-chemin ./runtime) | packages/formats/deck/src/runtime |
@presentation/cli | ✏️ @recit/cli | packages/cli |
@presentation/site-extension | ✏️ @recit/site-stories | packages/integrations/site-stories |
@presentation/docs | ✏️ découpé en sites/docs (documentation) et sites/presentation (galerie et démos) | sites/* |
examples/{starter,tech-talk,showcase,pitch,course,mdx} | ✏️ examples/deck-* | examples/ |
examples/site-integrated | ✏️ examples/site-embed | examples/ |
website/ (ancien site) | 🗑️ non repris | — |
5. Inventaire d'emaki
| Package actuel | Devient | Dossier final |
|---|---|---|
@emaki/schema + @emaki/core + @emaki/extract | ✏️ @recit/motion (extract fusionné ici, sans React ; la commande recit extract reste) | packages/formats/motion |
@emaki/blocks + @emaki/ui | ✏️ @recit/motion-blocks | packages/formats/motion-blocks |
@emaki/themes | ✏️ d'abord dans @recit/motion-blocks, puis dans @recit/theme (V7) | packages/theme/src/motion |
@emaki/render | ✏️ @recit/motion-render | packages/formats/motion-render |
@emaki/mcp | ✏️ @recit/mcp (étendu au deck) | packages/mcp |
@emaki/cli | ✏️ fusionné dans @recit/cli | packages/cli |
@emaki/studio (privé) | 📅 squelette @recit/studio (privé) ; import différé tant que le studio est simulé (journal.md §5) | packages/tools/studio |
fixtures/*.deck.json, fixtures/assets | ✏️ packages/formats/motion/fixtures/ | — |
fixtures/goldens/*.png (16) | ✏️ packages/formats/motion-render/fixtures/goldens/ | — |
scripts/ (goldens, write-agents, write-readmes) | ✏️ goldens.mjs dans packages/formats/motion-render/scripts/, write-agents.ts dans packages/mcp/scripts/ ; write-readmes non repris | — |
templates/ | ✏️ gabarits motion de create-recit | packages/create-recit/templates/motion |
PUBLISHING.md, README.md, AGENTS.md, PLAN.md | non archivés : ils restent dans le dossier emaki d'origine (sites/plans/pages/archive/emaki/ abandonné) ; AGENTS.md régénéré dans packages/formats/motion/ | — |
@emaki/* déjà publiés sur npm | 🗑️ npm deprecate vers @recit/motion | — |
6. Tous les packages Récit
| Package | Groupe | Statut | Publié | Source | Contenu | Dépendances notables |
|---|---|---|---|---|---|---|
@recit/core | fondations | 🆕 P1 | oui | @presentation/core | parseur (scanner, split-scenes, frontmatter, markdown-ast, unified-pipeline), compileStory, plugins rehype, MDX, config (defineConfig, mergeConfig, theme-css), règles, types Story / Scene. Sous-chemins ./browser, ./config, ./schema (schémas zod et JSON Schema de chaque format), ./i18n (langues, repli, packs d'interface) : voir 09-langues-et-json.md. Sous-chemin ./print (contrat d'impression, code navigateur : ?print=1, recitReady, whenPrintable()) ; schémas des options PDF et ExportManifestSchema (manifeste exports.json commun à tous les exports) : voir 15-export-pdf.md. Sous-chemin ./jsonld (P10, fonctions pures partagées par calendar et directory, 12-glossaire-annuaire.md D11). Le plugin :term n'est pas ici : il vit dans @recit/components (règle B4) | unified, remark-parse/gfm/directive/math, rehype-katex/raw/sanitize, @shikijs/rehype + shiki 4.5, @mdx-js/mdx, yaml. zod 4 (catalogue) |
@recit/theme | fondations | 🆕 P1 | oui | @presentation/theme, puis @emaki/themes | tokens.css, fonts.css, deck.css, page.css, print.css, reset.css (copie du preflight de Tailwind 4.3.3, MIT, plan 19 STY5c : la base des sites, des decks et de Storybook), tokens TS, thèmes default, warm-editorial, saas-product. tailwind.css et site-compat.css retirés par le plan 19 | aucune (peer tailwindcss retiré, plan 19) |
@recit/components | fondations | 🆕 P1 | oui | @presentation/components/src/{slides,mdx/builtins} | composants par défaut, les mêmes dans tous les formats : Callout, CodeBlock, CodeGroup, Grid, Media, Mermaid, Points, Quote, badge, kbd… Un format fournit la mise en page, jamais ses propres versions de ces composants. Un module CSS par composant, compilé en ./styles.css (plan 19). Vitrine : components.recit.dev | react 19 (peer), @recit/theme. Jamais @recit/site (privé) |
@recit/deck | formats | 🆕 P1 | oui | @presentation/components + runtime | Presentation, SlideStage, SlideFrame, PresenterView, hooks, HtmlSlide, MdxSlide, outils (télécommande, HUD, annotations), i18n fr/en. ./runtime (DeckApp, mount) et ./page-data | react 19 (peer), motion, mermaid, qrcode, katex. shiki en import dynamique (CodeBlock), à déplacer côté build |
@recit/motion | formats | 🆕 P4 | oui | @emaki/schema + core + extract | schéma Deck zod, parseDeck, ops, timing, chargeur .md/.json, storyToHandover, deckToMarkdown. extract fusionné ici : handover vers Deck, extraction depuis une URL ou une app (commande recit extract) | zod 4 |
@recit/motion-blocks | formats | 🆕 P4 | oui | @emaki/blocks + ui | blocs title, chapter, statement, stat, list, compare-bars, ui-mock, ui-scene. Moteur de lecture navigateur | react 19, motion (unifié avec le deck) |
@recit/motion-render | formats | 🆕 P4 | oui | @emaki/render | rendu MP4 et GIF via Remotion | remotion 4, @remotion/bundler, @remotion/renderer, Chrome Headless Shell (environ 93 Mo). Remotion tire zod 4.4.3 dans l'arbre de ce seul package (05-video.md) |
@recit/report | formats | 📅 P6 | oui | — | rapports de données : layout continu, sommaire, :::kpi, HTML et PDF (spec : 08-formats.md §1) | @recit/data, @recit/core (vue imprimable ; @recit/paged n'est importé que par la CLI) |
@recit/data | fondations | 📅 P6 | oui | — | sources CSV/JSON/YAML, agrégations, :value, ::chart (d3 sans DOM, SVG au build : question 10 de 06-roadmap.md, tranchée le 24/10), ::table | d3-dsv, d3-scale, d3-shape (déjà dans le lockfile), partagés avec @recit/geo |
@recit/paged | outils (packages/tools/paged, tag scope:tool) | 📅 P6 | oui | logique PDF de @recit/cli | Node uniquement, importé par la CLI seulement (et les outils de rendu Node). Chaîne d'impression de tous les formats qui s'impriment (15-export-pdf.md) : sous-export ./runner, seul module « lancer Chromium, servir un build, attendre prêt, mesurer, imprimer ou capturer » (PDF, tranches du toon, images, cartes) ; PrintEngine (chromium pour tous, pagedjs pour book en P8 et en option du report), pageCss(options). Table des matières numérotée avec Paged.js (P8). Le stub actuel (packages/formats/paged) est déplacé en PDF1 | @recit/core ; Playwright en pair optionnelle (playwright-core pour les types) ; pagedjs chargé à la demande (P8, après le spike PDF3.0) |
@recit/app | outils (packages/tools/app, tag scope:tool) | 📅 APP1 (plan 18) | oui | — | Node uniquement, importé par la CLI seulement. Coquille Tauri 2 commune à tous les sites (18-mobile-desktop.md) : tauriConfig(), materializeShell() vers <site>/.recit/app/, serveLikeTauri(), runTauri(), isPortInUse() ; le dist/ prérendu est embarqué et servi hors ligne, desktop (.deb, .AppImage, .dmg, .msi) puis Android et iOS ; la section app: est typée dans @recit/core | @recit/core ; @tauri-apps/cli, seule dépendance nouvelle, épinglée au catalogue de pnpm-workspace.yaml ; aucun import de @recit/site |
@recit/toon | formats | 📅 P7 | oui | — | webtoons : cases, bulles, encarts, sfx, lecteur au scroll, traductions par scène, découpe en tranches, vue imprimable (PDF coupé entre les cases), pont vers motion (spec : 08-formats.md §2) | react 19, motion, sharp (découpe). Pas @recit/paged : la CLI capture par @recit/paged/runner, puis appelle la découpe du toon |
@recit/book | formats | 📅 P8 | oui | — | livres : multi-fichiers, notes, renvois, index, HTML intermédiaire partagé par le PDF et l'EPUB, PDF imprimable, EPUB 3, édition web via @recit/site-stories (spec : 08-formats.md §3) | @recit/core (pas @recit/paged : seule la CLI l'importe), fflate, hast-util-to-html |
@recit/roadmap | formats | 📅 P9 | oui | — | roadmaps : pistes, éléments, jalons, vues now-next-later, frise, kanban, exports ICS, RSS et PDF (spec : 08-formats.md §4) | @recit/time, @recit/core (PDF par la CLI et @recit/paged) |
@recit/calendar | formats | 📅 P10 | oui | — | calendriers : événements, récurrences, fuseaux, vues mois, semaine, agenda et année, ICS abonnable, JSON-LD (spec : 08-formats.md §5) | @recit/time |
@recit/stories | formats | 📅 P11 | oui | — | stories web : cartes 9:16, lecteur tap et swipe, CTA, export d'images, pont avec motion (spec : 08-formats.md §6) | react 19, motion, @recit/motion-blocks (peer optionnel) |
@recit/time | fondations | 📅 P9 | oui | — | dates, trimestres, fuseaux, rrule, ICS (lecture et écriture), formatage Intl. Utilisé par roadmap et calendar ; le report (P6) s'en passe (axes temporels par Intl et l'échelle temporelle de d3-scale) | rrule, polyfill Temporal |
@recit/form | fondations | 📅 P10 | oui | — | accepté le 24/10 (10-formulaires.md) : bloc :::form, client de soumission, contrat « Récit Form Submission API v1 », handler de référence ./server (P13), ./openapi plus tard | @recit/core, @recit/components, zod/mini. Aucune nouvelle |
@recit/directory | formats | 📅 P9 | oui | — | accepté le 24/10 (12-glossaire-annuaire.md) : formats glossary et directory, vues A–Z, fiches, tableau. Lot avancé en P9, complet en P14 | @recit/core, @recit/components, @recit/data (import, plus tard) |
@recit/geo | fondations | 📅 P6 | oui | — | accepté le 24/10 (13-cartes.md) : bloc ::map, projections, assets Natural Earth, GeoMap. Lot avancé en P6, choroplèthe en P15 | d3-geo, d3-scale, d3-scale-chromatic (déjà dans le lockfile, via mermaid) |
@recit/atlas | formats | 📅 P15 | oui | — | retenu (P15), accepté le 24/10 (13-cartes.md) : format atlas, une scène = une vue de carte, lecture au défilement | @recit/geo |
@recit/scenario | fondations | 📅 P16 | oui | — | accepté le 24/10 (14-ia-scenario.md) : bible de personnages (kind: "bible"), attributs de scène cast, set, pose, prompt, provenance des images (kind: "asset"), seulement si l'exemple du lot P7 en montre le besoin | @recit/core. Aucune nouvelle |
@recit/pixel | — | 🔒 | réservé | — | 11-images.md : pas de package pour l'instant (tranché le 24/10). Le module pixel vit dans @recit/components (P11), extrait ici seulement au second consommateur | — |
@recit/site-stories | intégrations | 🆕 P1 | oui | @presentation/site-extension | recitVitePlugin (./vite), recitPlugin, StoryEmbed, StoryGallery, index Pagefind, ./styles.css (jetons préfixés, deck.css, feuilles des paquets et modules, limitée au wrapper) | @recit/site (peer), vite 8 (peer) |
@recit/cli | distribution | 🆕 P1 | oui | @presentation/cli + @emaki/cli | Liste unique des commandes (une commande par besoin, règle B9). P1 : init, dev, build, export <file> (PDF par défaut, --html pour le HTML autonome : pas de sous-commande export html), validate, convert. P3 : convert --to json|md, validate sur un JSON, i18n status|extract|check, --locale (sur dev, build, export et convert). P4 : render (avec --all-locales), dur, extract, mcp serve. P6 : export --to pdf (par @recit/paged, avec --all-locales). P7 : export --to images. P8 : export --to epub. P9 et P10 : export --to ics, export --to rss. Une seule règle (audit DO-8) : export <file> avec --to <format>, jamais de sous-commande par format ; --html reste l'alias de --to html. P12 : migrate. P13 : form check-endpoint ; plus tard form schema. P14 : convert --to directory (CSV), puis validate --links. P16 : prompts build, assets register, skills export, contrôles de scénario dans validate --strict ; Fountain par convert (--to fountain, ou depuis un .fountain). Après P8, en option : export --to pdf --site (PDF4). Après la v1 : geocode | commander, esbuild (bundle JS et feuille d'un deck, plus de Tailwind depuis le plan 19), ws, qrcode, @recit/paged (runner ; Playwright en pair optionnelle, plus de lanceur de Chromium local), @recit/motion-render (optionnel, chargé à la demande) |
recit | distribution | 🆕 P1 | oui | — | alias sans scope (npx recit dev). Réexporte @recit/cli et defineConfig | @recit/cli |
create-recit | distribution | 🆕 P5 | oui | modèle : create-site | npm create recit, gabarits deck, motion, docs | — |
@recit/mcp | distribution | 🆕 P4 | oui | @emaki/mcp | outils motion (build_deck, apply_ops, render…), outils deck (build_story), describe_format(format) (JSON Schema et spec Markdown du format, 09-langues-et-json.md §7), guides recit://guide/* | @modelcontextprotocol/sdk, zod 4 |
@recit/studio | outils | 🆕 P4 (squelette) | non | @emaki/studio (import différé) | squelette seulement : l'import du studio d'emaki attend qu'il ne soit plus simulé (journal.md §5). Puis éditeur et prévisualisation (Monaco), motion puis deck | monaco-editor (à l'import) |
@recit/site-kit | outils | 🆕 P2 | non | — | en-tête inter-sites (Récit ▸ un lien par site ouvert, dans l'ordre de 07-domaines.md §4 : Presentation · Motion · Report · Webtoon · Book · Roadmap · Calendar · Story · Docs, puis les sites acceptés à leur ouverture), pied de page, logos, tokens, config du framework de sites partagée (createSiteConfig), composants de site de format (07-domaines.md §4), dont l'ExportPanel unique, qui lit exports.json (ExportManifestSchema de @recit/core, tous les kind). Porte tous les composants des sites (src/components/, avec leurs modules) : un site n'est que Markdown et config (plan 19, TST4b, scripts/biome-plugins/sites-markdown-only.grit) | @recit/site-stories, @recit/site, @recit/core |
@recit/brand-tools | marque (brand/tools) | 🆕 P0 | non | — | scripts de génération du logo et des signes (logo, logo:signs) | opentype.js, @fontsource (dev) |
@recit/docs | — | 🔒 | réservé | — | pas de package : le format docs est porté par @recit/site-stories. Nom réservé contre l'usurpation | — |
Noms npm à réserver en P0, même sans code : recit, create-recit, @recit/core, @recit/data,
@recit/time, @recit/paged, @recit/report, @recit/toon, @recit/book, @recit/roadmap,
@recit/calendar, @recit/stories, @recit/docs, et ceux des plans 10 à 14 (paragraphe suivant).
C'est la liste de P0.1 dans 06-roadmap.md. Pas de @recit/video : « video » n'est qu'une
redirection de domaine vers motion (voir 07-domaines.md).
Noms ajoutés par les plans 10 à 14 (ordre accepté le 24/10/2026), à réserver : @recit/form,
@recit/directory, @recit/geo, @recit/atlas, @recit/scenario, et @recit/pixel (nom réservé
seulement, sans package pour l'instant). Les commandes CLI qu'ils prévoient sont uniques par besoin
et figurent dans la ligne @recit/cli ci-dessus : recit form check-endpoint (P13),
recit validate --links (P14, une option plutôt qu'un verbe), recit validate --strict,
recit prompts build, recit assets register et recit skills export (P16), et recit geocode
après la v1 seulement (06-roadmap.md, règle B9).
7. Renommage complet
À appliquer partout : code, tests, docs, exemples, CSS, config, messages d'erreur, i18n.
7.1 Packages et dossiers
| Ancien | Nouveau |
|---|---|
@presentation/core | @recit/core |
@presentation/theme | @recit/theme |
@presentation/components | @recit/components + @recit/deck |
@presentation/runtime | @recit/deck/runtime |
@presentation/cli | @recit/cli |
@presentation/site-extension | @recit/site-stories |
@presentation/docs | sites/docs + sites/presentation |
@emaki/schema, @emaki/core | @recit/motion |
@emaki/blocks, @emaki/ui | @recit/motion-blocks |
@emaki/themes | @recit/theme (export ./motion) |
@emaki/render | @recit/motion-render |
@emaki/extract | @recit/motion (commande recit extract) |
@emaki/mcp | @recit/mcp |
@emaki/cli | @recit/cli |
@emaki/studio | @recit/studio (squelette, import différé) |
presentation-example-* | recit-example-deck-* |
7.2 Commandes, fichiers et config
| Ancien | Nouveau |
|---|---|
commande presentation, commande emaki | recit (emaki render → recit render, emaki convert → recit convert…) |
recit.config.ts / recit.config.tsx (sites) | recit.config.ts (fichier unique, options du framework de sites et options Récit au même niveau, voir 02-architecture.md §5). L'ancien nom est encore lu, avec un avertissement |
presentation.config.ts | recit.config.ts (l'ancien nom est encore lu, avec un avertissement, jusqu'à la 0.2) |
slides.md | slides.md ou story.md (les deux sont reconnus) |
*.deck.json (emaki) | *.deck.json (inchangé, format machine) et *.story.md |
<!-- type: …, id: … --> (spec emaki) | --- type=… id=… (commentaire accepté en alias) |
frontmatter aspect (emaki) | aspectRatio (aspect reste accepté en alias) |
frontmatter theme, wordsPerSecond (emaki) | theme, wordsPerSecond, à plat dans le frontmatter (08-formats.md) ; section motion: { theme, wordsPerSecond } dans recit.config.ts |
MCP claude mcp add emaki … | claude mcp add recit -- recit mcp serve |
ressource MCP emaki://guide | recit://guide/motion, recit://guide/deck |
7.3 API et identifiants
| Ancien | Nouveau |
|---|---|
compileDeck, CompiledDeck, CompiledSlide | compileStory, Story, Scene (alias dépréciés) |
split-slides.ts, splitSlides | split-scenes.ts, splitScenes |
presentationVitePlugin, presentationPlugin | recitVitePlugin, recitPlugin |
PresentationPluginOptions, SitePresentationPlugin | RecitPluginOptions, RecitStoriesPlugin |
virtual:presentation-decks | virtual:recit-stories |
${file}.presentation-slide-N.jsx | ${file}.recit-scene-N.jsx |
PresentationEmbed, PresentationGallery, PresentationViewer | StoryEmbed, StoryGallery, StoryViewer (anciens noms en alias) |
.site-presentation-wrapper, RECIT_WRAPPER_CLASS | .recit-wrapper, RECIT_WRAPPER_CLASS |
custom properties --slide-*, --slide-*, --card-*… | inchangées (aucun nom de marque, pas de rupture pour les thèmes utilisateurs) |
data-deck | data-story |
libellés i18n « Présentation », deckNotFound « … presentationVitePlugin … » | « Récit » / recitVitePlugin |
route par défaut /presentations (option du plugin) | /stories. Les sites utilisent /present |
getDecks(), findDeck(), getLoadedDecks() | getStories(), findStory(), getLoadedStories() |
7.4 Identité et infrastructure
| Ancien | Nouveau |
|---|---|
dépôt vguerand/recit | recit-dev/recit (transfert, à confirmer) |
package racine root | recit-monorepo |
logos du framework de sites, assets/github-hero.png | brand/ (marque Q07) |
| le site d'origine (doc du fork) | docs.recit.dev |
| identité Git de la CI d'origine | bot Récit, ou github-actions[bot] |
Méthode : un commit de renommage par package, puis
grep -rniE "presentation|emaki|site-presentation" packages sites examples doit être vide (hors
alias documentés et sites/plans/pages/archive/).
8. Exports
Chaque package expose exports avec trois conditions :
types;@recit/source, verssrc/*.ts(consommer les sources sans build en dev). Pasdevelopment: webpack et Next l'activent par défaut et livreraient notre TypeScript à un utilisateur qui ne le transpile pas (audit ST-3) ;default, versdist/*.js.
Les vite.config.ts des sites et des exemples ajoutent resolve.conditions: ["@recit/source"].
JSON
@recit/site-stories expose en plus ./vite et ./styles.css (CSS limitée au wrapper, construite
par scripts/build-css.mjs).
Feuilles de style publiées (plan 19). Plus de Tailwind dans aucun paquet. Chaque paquet qui
dessine publie une feuille unique, ./styles.css, compilée de ses modules CSS par Lightning CSS
(scripts/build-css-modules.js, table de classes typée X.module.css.ts à côté de chaque module) :
@recit/components, @recit/deck, @recit/motion-blocks, @recit/site-stories. @recit/theme
publie ses feuilles de base (tokens.css, fonts.css, deck.css, page.css, print.css) et
reset.css, que le site importe en couche theme, le deck en couche base et Storybook en couche
theme. La CLI assemble la feuille d'un deck avec esbuild : reset, jetons, feuilles du thème, des
paquets, modules de l'auteur, theme.customCss, dans cet ordre.
@recit/core expose aussi ./print (contrat d'impression, code navigateur sans dépendance au DOM
hors garde typeof window). @recit/paged est Node uniquement et expose ./runner ; aucun
format ne l'importe dans un bundle client (15-export-pdf.md §4).
Règle de dépendances entre groupes. Les formats et les intégrations dépendent des fondations.
Une intégration peut dépendre d'un format (@recit/site-stories → @recit/deck,
@recit/motion-blocks). Les fondations ne dépendent jamais d'un format. @recit/paged
(scope:tool) n'est importé que par la CLI et les outils de rendu Node : ni un format ni une
fondation n'en dépend, ils exposent une vue imprimable et rien d'autre (15-export-pdf.md §3.1).
Une capture (tranches du toon, PNG d'une carte, image d'une story) est donc lancée par la CLI à
travers @recit/paged/runner.
Les tags. Neuf, un par projet, dans nx.tags de son package.json. Cette liste est la seule
(06-roadmap.md en annonçait six, ce paragraphe quatre — audit ST-6).
| Tag | Projets |
|---|---|
scope:foundation | core, theme, components, data, time |
scope:format | packages/formats/* sauf paged |
scope:integration | packages/integrations/* |
scope:tool | paged, app, site-kit, studio, mcp, brand/tools |
scope:distribution | cli, recit, create-recit |
scope:site | sites/* |
scope:example | examples/* de Récit |
scope:test | e2e |
scope:vendor | packages/site et examples/with-config, qui viennent d'upstream |
Ce que chaque groupe a le droit d'importer. Une fondation ne voit que les fondations ; un format
voit les fondations et les formats ; une intégration y ajoute les intégrations ; un outil y ajoute
les outils ; la distribution y ajoute les outils et la distribution ; un site et un exemple voient
tout sauf la suite e2e ; scope:test voit tout. Les deux projets scope:vendor ne sont pas tagués
dans leur package.json : ce sont des fichiers d'origine externe, gardés tels quels (NOTICE.md).
scripts/check-package-boundaries.js lit ces tags et les dépendances workspace:*, refuse toute
arête hors du tableau, et tient la liste des violations connues : chacune porte le constat qui la
possède, et une entrée qui ne correspond plus à aucune arête échoue elle aussi. Il tourne dans
pnpm check. Une seule violation est tolérée aujourd'hui : @recit/site-stories → @recit/cli
(ST-5).
9. Outillage : on adopte celui du fork
| Sujet | presentation-engine | emaki | Récit (fork) |
Action | | ------------- | ---------------------------- | -------------------- | -------------------------------- | ---------------------------------------------------------------------------------------------- | ------------ | ----------------------------------------------------- | |
Orchestration | turbo 2.4 | turbo | nx 23.3 | supprimer les turbo.json. Un project.json par
package (ou cibles inférées), tags de groupe | | Lint | oxlint 1.88 | — | biome 2.5 | migrer les
règles utiles (no-shadow…) | | Format | oxfmt 0.73 | — | oxfmt 0.36 | "**/*.mdx" dans
ignorePatterns (oxfmt casse le .mdx) | | Build | tsc (+ build-css.mjs) | tsc | tsdown
0.23 | un tsdown.config.ts par package | | TypeScript | 5.7 | — | 6.0.3 | imports relatifs
en .js (convention AGENTS.md) | | Tests | vitest (88 unitaires, 7 e2e) | vitest + goldens PNG |
vitest 4.1 + playwright 1.63 | vitest.config.ts racine :
projects: ["packages/!(formats | integrations | tools)", "packages/{formats,integrations,tools}/\*"] | |
Hooks git | — | — | lefthook | rien à faire | | Node / pnpm | — | — | Node ≥ 22.22, pnpm ≥ 11 |
aligner les engines |
Versions du catalogue pnpm :
react/react-dom19.2.8,zod4.6.5,typescript6.0.3,@types/node22.20.5 ;vite8.1.5 (presentation-engine utilisait^8.3.5, à aligner) ;shiki4.5.0,@mdx-js/mdx3.1.1,react-router8.4.0 ;@mantine/*9.7.4 (plan 19, qui a retirétailwindcss) ;@recit/site: 0.86 → 0.93 (workspace).
Points d'attention :
minimumReleaseAge: 4320(3 jours) s'applique à Remotion et au SDK MCP (@tailwindcss/oxideest parti avec Tailwind, plan 19).allowBuilds: ajouter le compositor de Remotion si nécessaire.- Les peers
react >=18d'emaki passent à>=19.2.7.
10. Publication
- Versions
0.1.0-alpha.N, communes à tous les packages publiés (une seule version,nx releaseavecrelease.projects= packages publiés de la section 6, listés un par un : un package y entre quand il devient public,scripts/__tests__/release-workflow.spec.tsle vérifie). - Actions GitHub épinglées par SHA (Dependabot les met à jour), npm en version exacte dans le job
qui publie. Le même test passe chaque commande
nx releasedu workflow aux contrôles d'arguments de nx (--print-config). - Un seul workflow
release.yaml, déclenché à la main depuismain, sans publication canary de@recit/site:build.yamlrejoué, contrôle des version plans, dry run, puis job d'écriture derrière l'environnementnpmà relecteur obligatoire (version, changelog, commit, tag, push, GitHub Release, npm, dans cet ordre). - Version plans en 0.x :
preminorà la première release d'une phase,prereleaseensuite, un seul bump par plan. Sur une version 0.x stable (0.0.0), au moins un plan enpreminor.scripts/check-version-plans.js(danspnpm check) refusepatch,minoretmajor, que semver publierait en stable malgré lepreid. publintetsize-limit(.size-limit.json: le runtime du deck etexamples/site-embed).@recit/siteest privé aujourd'hui, alors que@recit/site-stories(en peer,>=0.93),recit-siteet@recit/appen dépendent : hors du dépôt, personne ne peut construire un site. Le publier avec l'alpha est la décision D2 de 22 · Alpha publique, question ouverte.- Aucune publication npm sans validation explicite.