Fondations

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} et packages/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 :

GroupeDossierRôlePublié sur npm
Socle du framework de sitespackages/site/cœur du framework de sites forké, le seul vestige du dépôt d'originenon
Fondationspackages/{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 packageoui
Formatspackages/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/pagedoui
Intégrationspackages/integrations/*branchements vers des hôtes : @recit/site aujourd'hui (plus tard Next, Astro, VS Code…)oui
Distributionpackages/{cli,recit,create-recit,mcp}/ce que l'utilisateur installe ou lanceoui
Outilspackages/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
Sitessites/*un site par sous-domaine (voir 07-domaines.md)non
Exemplesexamples/*projets minimaux, gabarits de create-recit et fixtures e2enon
Tests transversese2e/Playwright sur les sites et les exemplesnon
Marquebrand/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 :

YAMLYAML
packages: - packages/* - packages/formats/* - packages/integrations/* - packages/tools/* - sites/* - examples/* - brand/tools - "!**/dist/**" - "!**/dist"

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
recit/ ├─ packages/ │ ├─ site/ site (privé) ← framework de sites, code de Récit │ ├─ core/ @recit/core │ ├─ data/ @recit/data (données et graphiques, P6) │ ├─ time/ @recit/time (dates, fuseaux, récurrences, ICS, P9) │ ├─ geo/ @recit/geo (bloc ::map, lot P6, complet en P15) │ ├─ form/ @recit/form (bloc :::form, lot P10, complet en P13) │ ├─ scenario/ @recit/scenario (bible et attributs de scénario, P16) │ ├─ theme/ @recit/theme │ ├─ components/ @recit/components (composants partagés par tous les formats) │ ├─ cli/ @recit/cli (binaire `recit`) │ ├─ recit/ recit (alias sans scope) │ ├─ create-recit/ create-recit (npm create recit) │ ├─ mcp/ @recit/mcp │ ├─ formats/ │ │ ├─ deck/ @recit/deck (+ @recit/deck/runtime) │ │ ├─ motion/ @recit/motion │ │ ├─ motion-blocks/ @recit/motion-blocks │ │ ├─ motion-render/ @recit/motion-render │ │ ├─ report/ @recit/report (P6) │ │ ├─ toon/ @recit/toon (webtoon, P7) │ │ ├─ book/ @recit/book (P8) │ │ ├─ roadmap/ @recit/roadmap (P9) │ │ ├─ calendar/ @recit/calendar (P10) │ │ ├─ stories/ @recit/stories (P11) │ │ ├─ directory/ @recit/directory (glossary et directory, lot P9, complet en P14) │ │ └─ atlas/ @recit/atlas (P15) │ ├─ integrations/ │ │ └─ site/ @recit/site-stories │ └─ tools/ │ ├─ paged/ @recit/paged (chaîne d'impression Node, P6 ; le stub de packages/formats/paged y est déplacé en PDF1) │ ├─ app/ @recit/app (coquille Tauri 2 : un site en application desktop et mobile, Node, importée par la CLI seulement ; `18-mobile-desktop.md`) │ ├─ studio/ @recit/studio (privé, squelette ; import d'emaki différé) │ └─ site-kit/ @recit/site-kit (privé : en-tête et pied communs aux sites) ├─ sites/ │ ├─ www/ recit.dev │ ├─ docs/ docs.recit.dev (ex-`docs/` du framework de sites, déplacé) │ ├─ components/ components.recit.dev │ ├─ presentation/ presentation.recit.dev │ ├─ motion/ motion.recit.dev │ ├─ report/ report.recit.dev (P6) │ ├─ webtoon/ webtoon.recit.dev (P7) │ ├─ book/ book.recit.dev (P8) │ ├─ roadmap/ roadmap.recit.dev (P9) │ ├─ calendar/ calendar.recit.dev (P10) │ ├─ story/ story.recit.dev (P11) │ ├─ form/ form.recit.dev (site d'outil, P13) │ ├─ directory/ directory.recit.dev (P14) │ ├─ maps/ maps.recit.dev (P15) │ └─ ai/ ai.recit.dev (site d'outil, P16) ├─ examples/ │ ├─ deck-starter/ deck-tech-talk/ deck-showcase/ deck-pitch/ deck-course/ deck-mdx/ │ ├─ motion-hello/ motion-saas/ │ ├─ report-quarterly/ report-study/ toon-episode/ book-novella/ │ ├─ roadmap-product/ calendar-meetups/ calendar-course/ stories-launch/ │ ├─ site-embed/ (récits intégrés dans une doc du framework de sites) │ ├─ site-i18n/ (doc du framework de sites multilingue, fixture de `e2e/site-i18n.spec.ts`) │ └─ with-config/ ✅ fixture des tests du cœur du framework de sites (gardée, voir §3.1) ├─ e2e/ deck-features.spec.ts, deck-render.spec.ts, site-*.spec.ts, site-embed.spec.ts, site-i18n.spec.ts ├─ brand/ ├─ sites/plans/pages/ ce plan ├─ README.md LICENSE.md AGENTS.md CLAUDE.md (lien vers AGENTS.md) └─ biome.jsonc nx.json package.json pnpm-workspace.yaml vitest.config.ts playwright.config.ts lefthook.yml

3. Inventaire du le framework de sites : ce qu'on garde, ce qu'on supprime

3.1 Projets du workspace

Projet actuelNom npmDécisionRaison
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-sitecreate-site🗑️ supprimerremplacé par packages/create-recit (on s'en inspire avant suppression, voir P0)
packages/plugin-graphqlplugin du framework🗑️ supprimerdoc 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-algoliaplugin du framework🗑️ supprimerRécit utilise Pagefind (intégré au cœur)
docs/docs✏️ git mv vers sites/docsla 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-configwith-config✅ garderfixture de packages/site/src/vite/config.test.ts. La supprimer casserait les tests du cœur
examples/cosmo-cargocosmo-cargo🗑️ supprimerdé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—🗑️ supprimerclés d'API et monétisation
examples/auth-firebase, auth-supabase, with-auth0—🗑️ supprimerauthentification 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—🗑️ supprimerOpenAPI, GraphQL ou Algolia
examples/mermaid, with-base-path, with-vite-config—🗑️ supprimercouverts par nos exemples. base-path est à retester dans un e2e/site-*.spec.ts (pas encore fait)
scripts/ (check-admonitions.mjs)—✏️ garder et adaptervérifie les admonitions des pages MDX : globs sites/**/pages/** au lieu de docs/ et examples/
website (glob sans dossier)—🗑️ retirer du workspacen'existe pas

3.2 Fichiers racine et CI

FichierDé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 actuelDevientDossier
@presentation/core✏️ @recit/corepackages/core
@presentation/theme✏️ @recit/themepackages/theme
@presentation/components✏️ découpé : slides/ et mdx/builtins génériques → @recit/components, le reste (deck/, hooks/, tools/, MdxSlide) → @recit/deckpackages/components, packages/formats/deck
@presentation/runtime✏️ fusionné dans @recit/deck (sous-chemin ./runtime)packages/formats/deck/src/runtime
@presentation/cli✏️ @recit/clipackages/cli
@presentation/site-extension✏️ @recit/site-storiespackages/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-embedexamples/
website/ (ancien site)🗑️ non repris—

5. Inventaire d'emaki

Package actuelDevientDossier 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-blockspackages/formats/motion-blocks
@emaki/themes✏️ d'abord dans @recit/motion-blocks, puis dans @recit/theme (V7)packages/theme/src/motion
@emaki/render✏️ @recit/motion-renderpackages/formats/motion-render
@emaki/mcp✏️ @recit/mcp (étendu au deck)packages/mcp
@emaki/cli✏️ fusionné dans @recit/clipackages/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-recitpackages/create-recit/templates/motion
PUBLISHING.md, README.md, AGENTS.md, PLAN.mdnon 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

PackageGroupeStatutPubliéSourceContenuDépendances notables
@recit/corefondations🆕 P1oui@presentation/coreparseur (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/themefondations🆕 P1oui@presentation/theme, puis @emaki/themestokens.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 19aucune (peer tailwindcss retiré, plan 19)
@recit/componentsfondations🆕 P1oui@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.devreact 19 (peer), @recit/theme. Jamais @recit/site (privé)
@recit/deckformats🆕 P1oui@presentation/components + runtimePresentation, SlideStage, SlideFrame, PresenterView, hooks, HtmlSlide, MdxSlide, outils (télécommande, HUD, annotations), i18n fr/en. ./runtime (DeckApp, mount) et ./page-datareact 19 (peer), motion, mermaid, qrcode, katex. shiki en import dynamique (CodeBlock), à déplacer côté build
@recit/motionformats🆕 P4oui@emaki/schema + core + extractsché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-blocksformats🆕 P4oui@emaki/blocks + uiblocs title, chapter, statement, stat, list, compare-bars, ui-mock, ui-scene. Moteur de lecture navigateurreact 19, motion (unifié avec le deck)
@recit/motion-renderformats🆕 P4oui@emaki/renderrendu MP4 et GIF via Remotionremotion 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/reportformats📅 P6oui—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/datafondations📅 P6oui—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), ::tabled3-dsv, d3-scale, d3-shape (déjà dans le lockfile), partagés avec @recit/geo
@recit/pagedoutils (packages/tools/paged, tag scope:tool)📅 P6ouilogique PDF de @recit/cliNode 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/appoutils (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/toonformats📅 P7oui—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/bookformats📅 P8oui—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/roadmapformats📅 P9oui—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/calendarformats📅 P10oui—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/storiesformats📅 P11oui—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/timefondations📅 P9oui—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/formfondations📅 P10oui—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/directoryformats📅 P9oui—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/geofondations📅 P6oui—accepté le 24/10 (13-cartes.md) : bloc ::map, projections, assets Natural Earth, GeoMap. Lot avancé en P6, choroplèthe en P15d3-geo, d3-scale, d3-scale-chromatic (déjà dans le lockfile, via mermaid)
@recit/atlasformats📅 P15oui—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/scenariofondations📅 P16oui—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-storiesintégrations🆕 P1oui@presentation/site-extensionrecitVitePlugin (./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/clidistribution🆕 P1oui@presentation/cli + @emaki/cliListe 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 : geocodecommander, 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)
recitdistribution🆕 P1oui—alias sans scope (npx recit dev). Réexporte @recit/cli et defineConfig@recit/cli
create-recitdistribution🆕 P5ouimodèle : create-sitenpm create recit, gabarits deck, motion, docs—
@recit/mcpdistribution🆕 P4oui@emaki/mcpoutils 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/studiooutils🆕 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 deckmonaco-editor (à l'import)
@recit/site-kitoutils🆕 P2non—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-toolsmarque (brand/tools)🆕 P0non—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

AncienNouveau
@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/docssites/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

AncienNouveau
commande presentation, commande emakirecit (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.tsrecit.config.ts (l'ancien nom est encore lu, avec un avertissement, jusqu'à la 0.2)
slides.mdslides.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://guiderecit://guide/motion, recit://guide/deck

7.3 API et identifiants

AncienNouveau
compileDeck, CompiledDeck, CompiledSlidecompileStory, Story, Scene (alias dépréciés)
split-slides.ts, splitSlidessplit-scenes.ts, splitScenes
presentationVitePlugin, presentationPluginrecitVitePlugin, recitPlugin
PresentationPluginOptions, SitePresentationPluginRecitPluginOptions, RecitStoriesPlugin
virtual:presentation-decksvirtual:recit-stories
${file}.presentation-slide-N.jsx${file}.recit-scene-N.jsx
PresentationEmbed, PresentationGallery, PresentationViewerStoryEmbed, 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-deckdata-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

AncienNouveau
dépôt vguerand/recitrecit-dev/recit (transfert, à confirmer)
package racine rootrecit-monorepo
logos du framework de sites, assets/github-hero.pngbrand/ (marque Q07)
le site d'origine (doc du fork)docs.recit.dev
identité Git de la CI d'originebot 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, vers src/*.ts (consommer les sources sans build en dev). Pas development : webpack et Next l'activent par défaut et livreraient notre TypeScript à un utilisateur qui ne le transpile pas (audit ST-3) ;
  • default, vers dist/*.js.

Les vite.config.ts des sites et des exemples ajoutent resolve.conditions: ["@recit/source"].

JSONJSON
// packages/core/package.json "exports": { ".": { "types": "./dist/index.d.ts", "@recit/source": "./src/index.ts", "default": "./dist/index.js" }, "./browser": { "types": "./dist/browser.d.ts", "@recit/source": "./src/browser.ts", "default": "./dist/browser.js" }, "./config": { "types": "./dist/config.d.ts", "@recit/source": "./src/config/index.ts", "default": "./dist/config.js" } // … même forme pour ./schema, ./i18n (P3), ./print (P6) et ./jsonld (P10), voir §6 }

@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).

TagProjets
scope:foundationcore, theme, components, data, time
scope:formatpackages/formats/* sauf paged
scope:integrationpackages/integrations/*
scope:toolpaged, app, site-kit, studio, mcp, brand/tools
scope:distributioncli, recit, create-recit
scope:sitesites/*
scope:exampleexamples/* de Récit
scope:teste2e
scope:vendorpackages/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-dom 19.2.8, zod 4.6.5, typescript 6.0.3, @types/node 22.20.5 ;
  • vite 8.1.5 (presentation-engine utilisait ^8.3.5, à aligner) ;
  • shiki 4.5.0, @mdx-js/mdx 3.1.1, react-router 8.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/oxide est parti avec Tailwind, plan 19).
  • allowBuilds : ajouter le compositor de Remotion si nécessaire.
  • Les peers react >=18 d'emaki passent à >=19.2.7.

10. Publication

  • Versions 0.1.0-alpha.N, communes à tous les packages publiés (une seule version, nx release avec release.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.ts le 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 release du workflow aux contrôles d'arguments de nx (--print-config).
  • Un seul workflow release.yaml, déclenché à la main depuis main, sans publication canary de @recit/site : build.yaml rejoué, contrôle des version plans, dry run, puis job d'écriture derrière l'environnement npm à 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, prerelease ensuite, un seul bump par plan. Sur une version 0.x stable (0.0.0), au moins un plan en preminor. scripts/check-version-plans.js (dans pnpm check) refuse patch, minor et major, que semver publierait en stable malgré le preid.
  • publint et size-limit (.size-limit.json : le runtime du deck et examples/site-embed).
  • @recit/site est privé aujourd'hui, alors que @recit/site-stories (en peer, >=0.93), recit-site et @recit/app en 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.