/pwa — installable, mobile, hors ligne/pwa — installable, mobile, offline
Le skill /pwa transforme une application cliente générée en PWA installable (icône sur l'écran d'accueil, bannières d'installation et de mise à jour) avec des pages qui fonctionnent hors ligne. Il active aussi explicitement le shell mobile hérité du socle : navigation « descente par paliers » (Applications → Modules → Sections), barre inférieure transverse (Applications / Tâches / Activité / Compte) — ce shell est livré dans le paquet @atlashub/smartstack, rien à développer.
The /pwa skill turns a generated client app into an installable PWA (home-screen icon, install and update banners) with pages that work offline. It also explicitly wakes the socle's inherited mobile shell: "step-down" navigation (Applications → Modules → Sections), transverse bottom bar (Applications / Tasks / Activity / Account) — the shell ships inside the @atlashub/smartstack package, nothing to develop.
Deux niveaux de hors ligne, par pageTwo offline levels, per page
| ModeMode | Ce que l'utilisateur peut faire hors ligneWhat the user can do offline | MécaniqueMechanics |
|---|---|---|
read |
Consulter : la page se charge et affiche les dernières données vues ; les boutons de modification sont désactivésConsult: the page loads and shows the last seen data; mutation buttons are disabled | cache des lectures par le service worker (isolé par tenant et par langue)service-worker read cache (tenant- and language-isolated) |
write |
Saisir : les créations/modifications sont capturées localement (outbox), confirmées de façon optimiste, puis rejouées automatiquement au retour du réseau ; en cas de conflit avec une modification concurrente, le serveur gagne et l'utilisateur est informéEnter data: creates/updates are captured locally (outbox), optimistically confirmed, then replayed automatically when the network returns; on conflict with a concurrent change, the server wins and the user is told | outbox + rejeu idempotent + versionnage des lignes (409)outbox + idempotent replay + row versioning (409) |
Le choix se fait page par page : le skill lit les pagespecs BA, vous propose un plan de déploiement (quelles pages en read, lesquelles en write), et persiste vos choix dans les pagespecs — le BA reste la source de vérité, et les régénérations conservent le hors ligne. The choice is made page by page: the skill reads the BA pagespecs, proposes a rollout plan (which pages read, which write), and persists your choices back into the pagespecs — BA stays the source of truth, and regenerations preserve offline.
Ce que /pwa met en placeWhat /pwa sets up
- Service worker (cache isolé par tenant/langue, purge au login/logout — aucune fuite entre comptes) ;Service worker (tenant/language-isolated cache, purged on login/logout — no leak between accounts);
- manifest + icônes + métadonnées iOS → l'app s'installe sur mobile et desktop ;manifest + icons + iOS metas → the app installs on mobile and desktop;
- bannières « Installer l'application » et « Mise à jour disponible » ;"Install the app" and "Update available" banners;
- l'outbox et son indicateur d'état (éléments en attente d'envoi) ;the outbox and its status chip (items awaiting sync);
- l'audit
audit-dev-pwa(12 règles) vérifie le tout — y compris qu'aucune donnée d'un tenant ne peut fuiter vers un autre.theaudit-dev-pwaaudit (12 rules) verifies everything — including that no tenant's data can leak to another.
⚠️ Une page passée en write exige le versionnage de son entité (colonne RowVersion) : la migration EF est signalée et passe par le chemin sanctionné /efcore.
⚠️ A page switched to write requires its entity to be versioned (RowVersion column): the EF migration is signalled and goes through the sanctioned /efcore path.
Dans quel cas ?Which situation, which command?
| Je suis dans ce cas…I am in this situation… | …alors je fais…then I do |
|---|---|
| « L'app doit être installable sur les téléphones »"The app must install on phones" | /pwa |
| « Les techniciens doivent consulter leurs interventions sans réseau »"Technicians must view their jobs without network" | /pwa — pages concernées en mode read/pwa — the pages in read mode |
| « …et saisir leurs rapports hors ligne »"…and enter their reports offline" | /pwa — pages de saisie en mode write (+ migration RowVersion via /efcore)/pwa — the entry pages in write mode (+ RowVersion migration via /efcore) |
| Le hors ligne se comporte bizarrementOffline behaves oddly | audit-dev-pwa |