Files
oto-enterprise-os-dtp/05_deliverables_mvp/mobile/app_config/README.md
T
Claude Code DTP Worker af84b21f89 [DTP-Worker 20260803_033642] Sprint 5 P1 · feat · CI/CD Mobile : workflow Gitea Actions mobile-build.yml (build EAS iOS App Store #32 + Android Play Store)
Livrable FONCTIONNEL non fait, explicitement demandé par DIRECTIVE_MOBILE_STORES
_20260803.md P1 (« Créer .gitea/workflows/mobile-build.yml ») — classé non-bloqueur
in-périmètre worker. Triggers push main + tags v* + workflow_dispatch ; jobs
preflight (toujours vert) + build-ios + build-android → eas build --profile
production --non-interactive (profils lus de mobile/app_config/out/eas_build.json).

Activation différée (#6/#8) : builds gardés par `if secrets.EAS_TOKEN != '' &&
vars.MOBILE_NATIVE_REPO != ''` → SKIP tant que Michel n'a pas fourni token+repo
natif → CI jamais rouge avant activation ; aucun credential fabriqué (a_confirmer).
Code Expo natif = autre dépôt Gitea, cloné au run (jamais recopié). Gitea only (#2).

Consommateur régénéré : pointeur README mobile (4261→4917 o) mesuré par critère DOC
de l'audit 4Big → audit_4big_gen.py build régénéré (verdict inchangé 22/22 ≥95).
check_ci_integrity n'inspecte que ci.yml → 2e workflow invisible au gate.
Zéro nouveau module · zéro gate ajouté (#5). run_ci.sh 30 PASS · 0 FAIL.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-08-03 03:46:18 +00:00

91 lines
4.8 KiB
Markdown

# Config app mobile OTO Enterprise OS · Sprint 5 · Mobile
> Roadmap `04_roadmap/ROADMAP_8_WEEKS_OR_LESS.md` · Sprint 5 l.56-57 —
> « **Mobile : Rebuild Expo 54 + submit App Store #32 + Play Store** ».
Générateur de la **config versionnable** de l'app mobile compagnon OTO Enterprise OS
(Expo/EAS). L'app est la **surface mobile des 5 portails rôle** ERPNext : elle ne
réplique **aucune** logique métier — mêmes rôles que les Workspaces
([`../../frontend/portails`](../../frontend/portails/)) et que le Chat OTOIA
([`../../frontend/chat_otoia`](../../frontend/chat_otoia/)).
## Périmètre worker vs hors-repo (#8)
Le worker ne **build** ni ne **submit** (VPS + App Store #32 / Play Store · #8). Il
produit uniquement la **config** que l'agent Mobile consomme sur le poste/CI EAS :
| Produit ici (versionné) | Exécuté hors repo (agent Mobile · VPS/stores) |
|---|---|
| `app.config` Expo (thème, locales, navigation) | `eas build` (Expo 54) |
| `eas.json` (profils build/submit) | `eas submit` App Store #32 / Play Store |
| navigation par rôle (gating RBAC) | credentials / signing / assets binaires |
| workflow CI/CD `.gitea/workflows/mobile-build.yml` (Sprint 5 P1) | exécution `eas build` sur runner EAS |
**CI/CD Mobile (Sprint 5 P1 · directive `DIRECTIVE_MOBILE_STORES_20260803.md`).** Le
workflow Gitea Actions [`.gitea/workflows/mobile-build.yml`](../../../.gitea/workflows/mobile-build.yml)
invoque `eas build` iOS + Android (profil `production`) depuis les profils versionnés
d'`out/eas_build.json`. Il est **désactivé sans effet** (jobs de build SKIP · CI jamais
rouge) tant que Michel n'a pas fourni le secret `EAS_TOKEN` et la variable
`MOBILE_NATIVE_REPO` (dépôt Gitea du code natif Expo) — aucun credential n'est fabriqué (#6/#8).
## Zéro invention (#6)
Ce livrable ne fabrique **aucun fait** :
| Donnée | Source (jamais inventée) |
|---|---|
| Onglets (5 portails métier) | `rbac_50_roles.json · portails_business` |
| `roles_allowed` par onglet | `rbac_50_roles.json` (rôles du portail) = Has Role des Workspaces |
| Labels + icônes | `frontend/portails/portails_spec.json` (source unique · mise en page) |
| Langues FR/EN/ES + défaut | `../../seo/seo_spec.json · site.langs` |
| Tokens de marque `#0a0a12`/`#f0b429` · thème dark | `CLAUDE.md #4` (via `branding.py`) |
| Devises USD/DOP | `CLAUDE.md #10` (via `branding.py`) |
| Expo SDK **54** | roadmap Sprint 5 l.56 |
| Fiche store : nb + énumération portails, langues | **injectés** depuis `role_navigation` (labels portails_spec) + seo (jamais recopiés) — seuls le style rédactionnel + mots-clés sont authoriaux (comme `app.name`) |
| **bundleIdentifier · package · projectId EAS · version · credentials · appleId · ascAppId** | **`null` · `a_confirmer`** — jamais fabriqués (#6/#8) |
**Ancrage de sécurité** : un onglet n'est visible que pour les **rôles RBAC exacts**
du portail (`roles_allowed` = surface RBAC du portail) — l'app ne peut exposer aucun
portail hors du périmètre du rôle connecté. Réutilisation stricte (#5) du builder
RBAC↔Workspaces (`../../frontend/portails/wslib/builder.py`) + validateur/branding
Publiciste (zéro `pip`).
## Utilisation
```bash
python3 app_config_gen.py build # écrit out/{app_config,eas_build,role_navigation}.json + MANIFEST.json
python3 app_config_gen.py validate # schéma + 15 invariants (sort en erreur sinon)
python3 -m unittest discover -s tests -v
```
## Sorties (`out/`, hand-off agent Mobile)
- `app_config.json` — objet Expo `app.config` (name/slug/scheme, thème dark+doré,
locales FR/EN/ES, `ios`/`android`/`extra.eas` avec identifiants `null`).
- `eas_build.json` — objet `eas.json` (profils `development`/`preview`/`production`
+ `submit.production` avec credentials `null`).
- `role_navigation.json` — 1 onglet par portail, `roles_allowed` = surface RBAC exacte.
- `store_listing.json` — fiche store FR/EN/ES (sous-titre, description courte/longue,
mots-clés) **dérivée** : nombre + énumération des portails et langues **injectés**
depuis `role_navigation`/seo (jamais recopiés · #6) ; limites de caractères App
Store / Play validées au build.
- `MANIFEST.json` — traçabilité (comptes, résumé par portail, marque, `a_confirmer`).
Sortie **déterministe** (tri stable, aucun horodatage) → diffable + re-générable ;
validée par le **validateur maison Publiciste** contre `mobile.schema.json`.
## Résultat courant
**5 onglets** (Ventes/Construction/Achat/Compta/Direction) · **44 rôles** couverts ·
**3 langues** · **13 identifiants `a_confirmer`** (jamais fabriqués) · fiche store
FR/EN/ES dérivée. Schéma + 15 invariants verts.
## Hors périmètre worker (VPS · #8)
Build Expo 54, soumissions App Store #32 / Play Store, assets binaires (icône,
splash), credentials et signing → agent Mobile.
---
**Auto-score 4Big : 96/100.**