monl-compiler 0.9.0b9__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. monl_compiler-0.9.0b9/LICENSE +105 -0
  2. monl_compiler-0.9.0b9/PKG-INFO +567 -0
  3. monl_compiler-0.9.0b9/README.md +522 -0
  4. monl_compiler-0.9.0b9/pyproject.toml +154 -0
  5. monl_compiler-0.9.0b9/setup.cfg +4 -0
  6. monl_compiler-0.9.0b9/src/monl/__init__.py +21 -0
  7. monl_compiler-0.9.0b9/src/monl/app_templates.py +529 -0
  8. monl_compiler-0.9.0b9/src/monl/artifacts.py +176 -0
  9. monl_compiler-0.9.0b9/src/monl/assets_tool/__init__.py +30 -0
  10. monl_compiler-0.9.0b9/src/monl/assets_tool/commandes.py +213 -0
  11. monl_compiler-0.9.0b9/src/monl/assets_tool/edition.py +228 -0
  12. monl_compiler-0.9.0b9/src/monl/assets_tool/fondations.py +44 -0
  13. monl_compiler-0.9.0b9/src/monl/assets_tool/resolution.py +129 -0
  14. monl_compiler-0.9.0b9/src/monl/assets_tool/specio.py +64 -0
  15. monl_compiler-0.9.0b9/src/monl/ast_validator/__init__.py +32 -0
  16. monl_compiler-0.9.0b9/src/monl/ast_validator/acces.py +332 -0
  17. monl_compiler-0.9.0b9/src/monl/ast_validator/assets.py +224 -0
  18. monl_compiler-0.9.0b9/src/monl/ast_validator/audit.py +84 -0
  19. monl_compiler-0.9.0b9/src/monl/ast_validator/capacites.py +274 -0
  20. monl_compiler-0.9.0b9/src/monl/ast_validator/capacites_de_liste.py +136 -0
  21. monl_compiler-0.9.0b9/src/monl/ast_validator/champs.py +241 -0
  22. monl_compiler-0.9.0b9/src/monl/ast_validator/champs_calcules.py +309 -0
  23. monl_compiler-0.9.0b9/src/monl/ast_validator/champs_serveur.py +195 -0
  24. monl_compiler-0.9.0b9/src/monl/ast_validator/collisions.py +189 -0
  25. monl_compiler-0.9.0b9/src/monl/ast_validator/commerce.py +252 -0
  26. monl_compiler-0.9.0b9/src/monl/ast_validator/core.py +199 -0
  27. monl_compiler-0.9.0b9/src/monl/ast_validator/cycle_de_vie.py +144 -0
  28. monl_compiler-0.9.0b9/src/monl/ast_validator/migrations.py +106 -0
  29. monl_compiler-0.9.0b9/src/monl/ast_validator/presentation.py +116 -0
  30. monl_compiler-0.9.0b9/src/monl/ast_validator/socle.py +99 -0
  31. monl_compiler-0.9.0b9/src/monl/ast_validator/uploads.py +137 -0
  32. monl_compiler-0.9.0b9/src/monl/cli/__init__.py +45 -0
  33. monl_compiler-0.9.0b9/src/monl/cli/__main__.py +10 -0
  34. monl_compiler-0.9.0b9/src/monl/cli/coherence.py +211 -0
  35. monl_compiler-0.9.0b9/src/monl/cli/consommation.py +119 -0
  36. monl_compiler-0.9.0b9/src/monl/cli/construction.py +197 -0
  37. monl_compiler-0.9.0b9/src/monl/cli/conteneur.py +75 -0
  38. monl_compiler-0.9.0b9/src/monl/cli/contenu_editorial.py +95 -0
  39. monl_compiler-0.9.0b9/src/monl/cli/couverture.py +198 -0
  40. monl_compiler-0.9.0b9/src/monl/cli/couverture_fetch.py +150 -0
  41. monl_compiler-0.9.0b9/src/monl/cli/delta.py +348 -0
  42. monl_compiler-0.9.0b9/src/monl/cli/dispatch.py +268 -0
  43. monl_compiler-0.9.0b9/src/monl/cli/emplacement.py +156 -0
  44. monl_compiler-0.9.0b9/src/monl/cli/lancement.py +80 -0
  45. monl_compiler-0.9.0b9/src/monl/cli/nomenclature.py +134 -0
  46. monl_compiler-0.9.0b9/src/monl/cli/retouche.py +215 -0
  47. monl_compiler-0.9.0b9/src/monl/cli/signature.py +220 -0
  48. monl_compiler-0.9.0b9/src/monl/content_import.py +148 -0
  49. monl_compiler-0.9.0b9/src/monl/content_tool.py +281 -0
  50. monl_compiler-0.9.0b9/src/monl/design_skills.py +89 -0
  51. monl_compiler-0.9.0b9/src/monl/design_system/__init__.py +48 -0
  52. monl_compiler-0.9.0b9/src/monl/design_system/manifeste.py +104 -0
  53. monl_compiler-0.9.0b9/src/monl/design_system/marqueurs.py +123 -0
  54. monl_compiler-0.9.0b9/src/monl/design_system/noms.py +17 -0
  55. monl_compiler-0.9.0b9/src/monl/design_system/profil.py +140 -0
  56. monl_compiler-0.9.0b9/src/monl/design_system/rendu.py +325 -0
  57. monl_compiler-0.9.0b9/src/monl/dialogue_engine/__init__.py +30 -0
  58. monl_compiler-0.9.0b9/src/monl/dialogue_engine/commerce.py +214 -0
  59. monl_compiler-0.9.0b9/src/monl/dialogue_engine/comptes.py +116 -0
  60. monl_compiler-0.9.0b9/src/monl/dialogue_engine/core.py +54 -0
  61. monl_compiler-0.9.0b9/src/monl/dialogue_engine/direction.py +167 -0
  62. monl_compiler-0.9.0b9/src/monl/dialogue_engine/emission.py +109 -0
  63. monl_compiler-0.9.0b9/src/monl/dialogue_engine/emission_parts.py +330 -0
  64. monl_compiler-0.9.0b9/src/monl/dialogue_engine/fondations.py +102 -0
  65. monl_compiler-0.9.0b9/src/monl/dialogue_engine/libre.py +205 -0
  66. monl_compiler-0.9.0b9/src/monl/dialogue_engine/parcours.py +254 -0
  67. monl_compiler-0.9.0b9/src/monl/dialogue_engine/questions.py +154 -0
  68. monl_compiler-0.9.0b9/src/monl/errors.py +47 -0
  69. monl_compiler-0.9.0b9/src/monl/frontend_ai/__init__.py +175 -0
  70. monl_compiler-0.9.0b9/src/monl/frontend_ai/agents.py +393 -0
  71. monl_compiler-0.9.0b9/src/monl/frontend_ai/controles_design.py +218 -0
  72. monl_compiler-0.9.0b9/src/monl/frontend_ai/controles_fichiers.py +207 -0
  73. monl_compiler-0.9.0b9/src/monl/frontend_ai/etages.py +318 -0
  74. monl_compiler-0.9.0b9/src/monl/frontend_ai/fondations.py +29 -0
  75. monl_compiler-0.9.0b9/src/monl/frontend_ai/fournisseurs.py +352 -0
  76. monl_compiler-0.9.0b9/src/monl/frontend_ai/images.py +236 -0
  77. monl_compiler-0.9.0b9/src/monl/frontend_ai/orchestration.py +266 -0
  78. monl_compiler-0.9.0b9/src/monl/frontend_ai/redaction.py +72 -0
  79. monl_compiler-0.9.0b9/src/monl/frontend_ai/reponse.py +205 -0
  80. monl_compiler-0.9.0b9/src/monl/frontend_ai/squelette.py +103 -0
  81. monl_compiler-0.9.0b9/src/monl/frontend_contract/__init__.py +32 -0
  82. monl_compiler-0.9.0b9/src/monl/frontend_contract/assemblage.py +168 -0
  83. monl_compiler-0.9.0b9/src/monl/frontend_contract/brief.py +366 -0
  84. monl_compiler-0.9.0b9/src/monl/frontend_contract/champs.py +99 -0
  85. monl_compiler-0.9.0b9/src/monl/frontend_contract/contrat_auth.py +163 -0
  86. monl_compiler-0.9.0b9/src/monl/frontend_contract/contrat_entites.py +249 -0
  87. monl_compiler-0.9.0b9/src/monl/frontend_contract/contrat_paiement.py +106 -0
  88. monl_compiler-0.9.0b9/src/monl/frontend_contract/contrat_routes.py +163 -0
  89. monl_compiler-0.9.0b9/src/monl/frontend_contract/emission.py +40 -0
  90. monl_compiler-0.9.0b9/src/monl/frontend_contract/fondations.py +75 -0
  91. monl_compiler-0.9.0b9/src/monl/frontend_contract/marqueurs.py +49 -0
  92. monl_compiler-0.9.0b9/src/monl/frontend_contract/notes_de_contrat.py +132 -0
  93. monl_compiler-0.9.0b9/src/monl/frontend_contract/projet.py +139 -0
  94. monl_compiler-0.9.0b9/src/monl/frontend_contract/roles_de_champs.py +148 -0
  95. monl_compiler-0.9.0b9/src/monl/generator/__init__.py +9 -0
  96. monl_compiler-0.9.0b9/src/monl/generator/admin_cli.py +324 -0
  97. monl_compiler-0.9.0b9/src/monl/generator/calculs.py +111 -0
  98. monl_compiler-0.9.0b9/src/monl/generator/core.py +295 -0
  99. monl_compiler-0.9.0b9/src/monl/generator/emitters.py +46 -0
  100. monl_compiler-0.9.0b9/src/monl/generator/modele.py +119 -0
  101. monl_compiler-0.9.0b9/src/monl/generator/paiement.py +60 -0
  102. monl_compiler-0.9.0b9/src/monl/generator/pipeline.py +171 -0
  103. monl_compiler-0.9.0b9/src/monl/generator/prealables.py +83 -0
  104. monl_compiler-0.9.0b9/src/monl/generator/proprietaire.py +298 -0
  105. monl_compiler-0.9.0b9/src/monl/generator/routes.py +40 -0
  106. monl_compiler-0.9.0b9/src/monl/generator/routes_acces.py +97 -0
  107. monl_compiler-0.9.0b9/src/monl/generator/routes_creation.py +391 -0
  108. monl_compiler-0.9.0b9/src/monl/generator/routes_lecture.py +307 -0
  109. monl_compiler-0.9.0b9/src/monl/generator/routes_lecture_filtree.py +296 -0
  110. monl_compiler-0.9.0b9/src/monl/generator/routes_modification.py +352 -0
  111. monl_compiler-0.9.0b9/src/monl/generator/routes_orchestration.py +55 -0
  112. monl_compiler-0.9.0b9/src/monl/generator/routes_paiement.py +366 -0
  113. monl_compiler-0.9.0b9/src/monl/generator/routes_prestataires.py +233 -0
  114. monl_compiler-0.9.0b9/src/monl/generator/routes_suppression.py +243 -0
  115. monl_compiler-0.9.0b9/src/monl/generator/routes_uploads.py +64 -0
  116. monl_compiler-0.9.0b9/src/monl/generator/runtime.py +90 -0
  117. monl_compiler-0.9.0b9/src/monl/generator/runtime_annexes.py +164 -0
  118. monl_compiler-0.9.0b9/src/monl/generator/runtime_connexion.py +265 -0
  119. monl_compiler-0.9.0b9/src/monl/generator/runtime_fonctions_auth.py +341 -0
  120. monl_compiler-0.9.0b9/src/monl/generator/runtime_jetons.py +195 -0
  121. monl_compiler-0.9.0b9/src/monl/generator/runtime_migrations.py +247 -0
  122. monl_compiler-0.9.0b9/src/monl/generator/runtime_montage.py +323 -0
  123. monl_compiler-0.9.0b9/src/monl/generator/runtime_pool.py +63 -0
  124. monl_compiler-0.9.0b9/src/monl/generator/runtime_preparation.py +207 -0
  125. monl_compiler-0.9.0b9/src/monl/generator/runtime_socle.py +372 -0
  126. monl_compiler-0.9.0b9/src/monl/generator/sandbox.py +17 -0
  127. monl_compiler-0.9.0b9/src/monl/generator/schemas.py +181 -0
  128. monl_compiler-0.9.0b9/src/monl/generator/sql.py +100 -0
  129. monl_compiler-0.9.0b9/src/monl/generator/sql_colonnes.py +238 -0
  130. monl_compiler-0.9.0b9/src/monl/generator/sql_schema.py +194 -0
  131. monl_compiler-0.9.0b9/src/monl/image_ai.py +289 -0
  132. monl_compiler-0.9.0b9/src/monl/ir.py +334 -0
  133. monl_compiler-0.9.0b9/src/monl/ir_types.py +187 -0
  134. monl_compiler-0.9.0b9/src/monl/main.py +99 -0
  135. monl_compiler-0.9.0b9/src/monl/parser/__init__.py +19 -0
  136. monl_compiler-0.9.0b9/src/monl/parser/erreurs.py +82 -0
  137. monl_compiler-0.9.0b9/src/monl/parser/grammaire.py +455 -0
  138. monl_compiler-0.9.0b9/src/monl/parser/lecture.py +94 -0
  139. monl_compiler-0.9.0b9/src/monl/parser/transformer.py +31 -0
  140. monl_compiler-0.9.0b9/src/monl/parser/transformer_blocs.py +162 -0
  141. monl_compiler-0.9.0b9/src/monl/parser/transformer_regles.py +163 -0
  142. monl_compiler-0.9.0b9/src/monl/parser/transformer_structure.py +128 -0
  143. monl_compiler-0.9.0b9/src/monl/planning.py +149 -0
  144. monl_compiler-0.9.0b9/src/monl/policies.py +113 -0
  145. monl_compiler-0.9.0b9/src/monl/section_substance.py +206 -0
  146. monl_compiler-0.9.0b9/src/monl/serving.py +55 -0
  147. monl_compiler-0.9.0b9/src/monl/smoke_test/__init__.py +105 -0
  148. monl_compiler-0.9.0b9/src/monl/smoke_test/etapes.py +280 -0
  149. monl_compiler-0.9.0b9/src/monl/smoke_test/fichiers_reclames.py +94 -0
  150. monl_compiler-0.9.0b9/src/monl/smoke_test/fondations.py +190 -0
  151. monl_compiler-0.9.0b9/src/monl/smoke_test/sondes.py +77 -0
  152. monl_compiler-0.9.0b9/src/monl/tui.py +283 -0
  153. monl_compiler-0.9.0b9/src/monl/ui_patterns.py +242 -0
  154. monl_compiler-0.9.0b9/src/monl/usage.py +293 -0
  155. monl_compiler-0.9.0b9/src/monl/validation_pipeline/__init__.py +15 -0
  156. monl_compiler-0.9.0b9/src/monl/validation_pipeline/contrats.py +84 -0
  157. monl_compiler-0.9.0b9/src/monl/validation_pipeline/defaut.py +68 -0
  158. monl_compiler-0.9.0b9/src/monl/validation_pipeline/passes.py +302 -0
  159. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/PKG-INFO +567 -0
  160. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/SOURCES.txt +358 -0
  161. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/dependency_links.txt +1 -0
  162. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/entry_points.txt +4 -0
  163. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/requires.txt +26 -0
  164. monl_compiler-0.9.0b9/src/monl_compiler.egg-info/top_level.txt +2 -0
  165. monl_compiler-0.9.0b9/src/monl_platform/__init__.py +10 -0
  166. monl_compiler-0.9.0b9/src/monl_platform/__main__.py +111 -0
  167. monl_compiler-0.9.0b9/src/monl_platform/account.py +163 -0
  168. monl_compiler-0.9.0b9/src/monl_platform/administration.py +321 -0
  169. monl_compiler-0.9.0b9/src/monl_platform/app.py +80 -0
  170. monl_compiler-0.9.0b9/src/monl_platform/app_api_routes.py +282 -0
  171. monl_compiler-0.9.0b9/src/monl_platform/app_http.py +220 -0
  172. monl_compiler-0.9.0b9/src/monl_platform/app_lifecycle.py +66 -0
  173. monl_compiler-0.9.0b9/src/monl_platform/app_pages.py +163 -0
  174. monl_compiler-0.9.0b9/src/monl_platform/app_templates.py +59 -0
  175. monl_compiler-0.9.0b9/src/monl_platform/backup_healthcheck.py +81 -0
  176. monl_compiler-0.9.0b9/src/monl_platform/brand.py +274 -0
  177. monl_compiler-0.9.0b9/src/monl_platform/builder_auth_routes.py +130 -0
  178. monl_compiler-0.9.0b9/src/monl_platform/builder_build_routes.py +73 -0
  179. monl_compiler-0.9.0b9/src/monl_platform/builder_host.py +65 -0
  180. monl_compiler-0.9.0b9/src/monl_platform/builder_routes.py +31 -0
  181. monl_compiler-0.9.0b9/src/monl_platform/builder_runtime.py +147 -0
  182. monl_compiler-0.9.0b9/src/monl_platform/coloration.py +123 -0
  183. monl_compiler-0.9.0b9/src/monl_platform/compilation.py +83 -0
  184. monl_compiler-0.9.0b9/src/monl_platform/console.py +27 -0
  185. monl_compiler-0.9.0b9/src/monl_platform/console_script.py +405 -0
  186. monl_compiler-0.9.0b9/src/monl_platform/console_template.py +343 -0
  187. monl_compiler-0.9.0b9/src/monl_platform/dialogue.py +145 -0
  188. monl_compiler-0.9.0b9/src/monl_platform/docs_page.py +121 -0
  189. monl_compiler-0.9.0b9/src/monl_platform/downloads.py +111 -0
  190. monl_compiler-0.9.0b9/src/monl_platform/evolution.py +152 -0
  191. monl_compiler-0.9.0b9/src/monl_platform/examples.py +336 -0
  192. monl_compiler-0.9.0b9/src/monl_platform/guide.py +214 -0
  193. monl_compiler-0.9.0b9/src/monl_platform/guide_data.py +212 -0
  194. monl_compiler-0.9.0b9/src/monl_platform/guide_template.py +117 -0
  195. monl_compiler-0.9.0b9/src/monl_platform/hosting.py +366 -0
  196. monl_compiler-0.9.0b9/src/monl_platform/hosting_admission.py +93 -0
  197. monl_compiler-0.9.0b9/src/monl_platform/identity.py +33 -0
  198. monl_compiler-0.9.0b9/src/monl_platform/identity_admin.py +186 -0
  199. monl_compiler-0.9.0b9/src/monl_platform/identity_auth.py +126 -0
  200. monl_compiler-0.9.0b9/src/monl_platform/identity_credentials.py +50 -0
  201. monl_compiler-0.9.0b9/src/monl_platform/identity_database.py +123 -0
  202. monl_compiler-0.9.0b9/src/monl_platform/identity_keys.py +59 -0
  203. monl_compiler-0.9.0b9/src/monl_platform/identity_limits.py +43 -0
  204. monl_compiler-0.9.0b9/src/monl_platform/identity_primitives.py +14 -0
  205. monl_compiler-0.9.0b9/src/monl_platform/identity_projects.py +59 -0
  206. monl_compiler-0.9.0b9/src/monl_platform/identity_recovery.py +89 -0
  207. monl_compiler-0.9.0b9/src/monl_platform/journal.py +135 -0
  208. monl_compiler-0.9.0b9/src/monl_platform/landing.py +261 -0
  209. monl_compiler-0.9.0b9/src/monl_platform/landing_cas.py +202 -0
  210. monl_compiler-0.9.0b9/src/monl_platform/landing_pourquoi.py +299 -0
  211. monl_compiler-0.9.0b9/src/monl_platform/landing_vitrine.py +123 -0
  212. monl_compiler-0.9.0b9/src/monl_platform/legal.py +298 -0
  213. monl_compiler-0.9.0b9/src/monl_platform/mcp_page.py +48 -0
  214. monl_compiler-0.9.0b9/src/monl_platform/mcp_server.py +257 -0
  215. monl_compiler-0.9.0b9/src/monl_platform/oauth.py +321 -0
  216. monl_compiler-0.9.0b9/src/monl_platform/paths.py +56 -0
  217. monl_compiler-0.9.0b9/src/monl_platform/security.py +57 -0
  218. monl_compiler-0.9.0b9/src/monl_platform/service.py +291 -0
  219. monl_compiler-0.9.0b9/src/monl_platform/session.py +45 -0
  220. monl_compiler-0.9.0b9/src/monl_platform/static/favicon.ico +0 -0
  221. monl_compiler-0.9.0b9/src/monl_platform/static/monl-social.png +0 -0
  222. monl_compiler-0.9.0b9/src/monl_platform/static/monl-wordmark.png +0 -0
  223. monl_compiler-0.9.0b9/src/monl_platform/store.py +20 -0
  224. monl_compiler-0.9.0b9/src/monl_platform/store_core.py +315 -0
  225. monl_compiler-0.9.0b9/src/monl_platform/store_projects.py +159 -0
  226. monl_compiler-0.9.0b9/src/monl_platform/theme.py +220 -0
  227. monl_compiler-0.9.0b9/src/monl_platform/theme_fragments.py +396 -0
  228. monl_compiler-0.9.0b9/tests/test_access_parties.py +356 -0
  229. monl_compiler-0.9.0b9/tests/test_administration.py +451 -0
  230. monl_compiler-0.9.0b9/tests/test_admission_compilation.py +181 -0
  231. monl_compiler-0.9.0b9/tests/test_agregation.py +392 -0
  232. monl_compiler-0.9.0b9/tests/test_analyse_mise_en_cache.py +114 -0
  233. monl_compiler-0.9.0b9/tests/test_app_templates.py +638 -0
  234. monl_compiler-0.9.0b9/tests/test_architecture.py +985 -0
  235. monl_compiler-0.9.0b9/tests/test_archive_rangee.py +175 -0
  236. monl_compiler-0.9.0b9/tests/test_artifact_publishing.py +109 -0
  237. monl_compiler-0.9.0b9/tests/test_assets.py +309 -0
  238. monl_compiler-0.9.0b9/tests/test_assets_tool.py +603 -0
  239. monl_compiler-0.9.0b9/tests/test_authentification_b4.py +739 -0
  240. monl_compiler-0.9.0b9/tests/test_backup_healthcheck.py +81 -0
  241. monl_compiler-0.9.0b9/tests/test_beta3_regressions.py +364 -0
  242. monl_compiler-0.9.0b9/tests/test_bloc_custom_absent.py +106 -0
  243. monl_compiler-0.9.0b9/tests/test_bornes_memoire.py +284 -0
  244. monl_compiler-0.9.0b9/tests/test_briques_comportement.py +344 -0
  245. monl_compiler-0.9.0b9/tests/test_caracteres_de_controle.py +53 -0
  246. monl_compiler-0.9.0b9/tests/test_champ_texte_non_vide.py +195 -0
  247. monl_compiler-0.9.0b9/tests/test_chemins_et_arguments.py +194 -0
  248. monl_compiler-0.9.0b9/tests/test_ci_la_couverture_porte_sur_tout.py +223 -0
  249. monl_compiler-0.9.0b9/tests/test_ci_les_sauts_se_voient.py +91 -0
  250. monl_compiler-0.9.0b9/tests/test_cli_commandes.py +112 -0
  251. monl_compiler-0.9.0b9/tests/test_cli_dispatch.py +268 -0
  252. monl_compiler-0.9.0b9/tests/test_codes_de_secours.py +249 -0
  253. monl_compiler-0.9.0b9/tests/test_colonne_compteur_independante_de_l_ordre.py +98 -0
  254. monl_compiler-0.9.0b9/tests/test_compile_all.py +115 -0
  255. monl_compiler-0.9.0b9/tests/test_compile_pipeline.py +75 -0
  256. monl_compiler-0.9.0b9/tests/test_console_choix.py +137 -0
  257. monl_compiler-0.9.0b9/tests/test_console_javascript.py +130 -0
  258. monl_compiler-0.9.0b9/tests/test_content_tool.py +197 -0
  259. monl_compiler-0.9.0b9/tests/test_contraintes_de_champ.py +444 -0
  260. monl_compiler-0.9.0b9/tests/test_contrat_authentification.py +188 -0
  261. monl_compiler-0.9.0b9/tests/test_couverture_parcours.py +349 -0
  262. monl_compiler-0.9.0b9/tests/test_demo.py +58 -0
  263. monl_compiler-0.9.0b9/tests/test_demo_cycle.py +107 -0
  264. monl_compiler-0.9.0b9/tests/test_deploiement.py +352 -0
  265. monl_compiler-0.9.0b9/tests/test_deploiement_production.py +397 -0
  266. monl_compiler-0.9.0b9/tests/test_depot_depuis_le_dialogue.py +167 -0
  267. monl_compiler-0.9.0b9/tests/test_derivation.py +308 -0
  268. monl_compiler-0.9.0b9/tests/test_design_archetypes.py +114 -0
  269. monl_compiler-0.9.0b9/tests/test_design_contract.py +248 -0
  270. monl_compiler-0.9.0b9/tests/test_design_skills.py +33 -0
  271. monl_compiler-0.9.0b9/tests/test_design_system.py +197 -0
  272. monl_compiler-0.9.0b9/tests/test_devise.py +217 -0
  273. monl_compiler-0.9.0b9/tests/test_dialogue_engine.py +412 -0
  274. monl_compiler-0.9.0b9/tests/test_diff.py +220 -0
  275. monl_compiler-0.9.0b9/tests/test_documentation.py +342 -0
  276. monl_compiler-0.9.0b9/tests/test_errors.py +30 -0
  277. monl_compiler-0.9.0b9/tests/test_exploit.py +80 -0
  278. monl_compiler-0.9.0b9/tests/test_exploit_all.py +281 -0
  279. monl_compiler-0.9.0b9/tests/test_fedapay.py +446 -0
  280. monl_compiler-0.9.0b9/tests/test_fiche_obligatoire.py +418 -0
  281. monl_compiler-0.9.0b9/tests/test_fichiers_reclames.py +205 -0
  282. monl_compiler-0.9.0b9/tests/test_filtrage_tri.py +262 -0
  283. monl_compiler-0.9.0b9/tests/test_frontend_chunks.py +389 -0
  284. monl_compiler-0.9.0b9/tests/test_golden_artifacts.py +248 -0
  285. monl_compiler-0.9.0b9/tests/test_horodatage.py +405 -0
  286. monl_compiler-0.9.0b9/tests/test_identifiant_de_compte.py +582 -0
  287. monl_compiler-0.9.0b9/tests/test_images_generees.py +778 -0
  288. monl_compiler-0.9.0b9/tests/test_indexation_et_decodage.py +279 -0
  289. monl_compiler-0.9.0b9/tests/test_invariants_performance.py +255 -0
  290. monl_compiler-0.9.0b9/tests/test_invariants_securite.py +135 -0
  291. monl_compiler-0.9.0b9/tests/test_ir.py +249 -0
  292. monl_compiler-0.9.0b9/tests/test_journal_de_conception.py +82 -0
  293. monl_compiler-0.9.0b9/tests/test_lecture_privee.py +117 -0
  294. monl_compiler-0.9.0b9/tests/test_liberation.py +431 -0
  295. monl_compiler-0.9.0b9/tests/test_liens_de_pied.py +186 -0
  296. monl_compiler-0.9.0b9/tests/test_liens_pied_de_page.py +118 -0
  297. monl_compiler-0.9.0b9/tests/test_limite_corps_http.py +149 -0
  298. monl_compiler-0.9.0b9/tests/test_limites_du_guide.py +187 -0
  299. monl_compiler-0.9.0b9/tests/test_masquage_hidden.py +121 -0
  300. monl_compiler-0.9.0b9/tests/test_messages.py +466 -0
  301. monl_compiler-0.9.0b9/tests/test_migrations.py +420 -0
  302. monl_compiler-0.9.0b9/tests/test_numerotation.py +476 -0
  303. monl_compiler-0.9.0b9/tests/test_oauth.py +551 -0
  304. monl_compiler-0.9.0b9/tests/test_orchestrator.py +1332 -0
  305. monl_compiler-0.9.0b9/tests/test_package_metadata.py +127 -0
  306. monl_compiler-0.9.0b9/tests/test_packaging.py +16 -0
  307. monl_compiler-0.9.0b9/tests/test_paiement.py +682 -0
  308. monl_compiler-0.9.0b9/tests/test_paiement_transitif.py +300 -0
  309. monl_compiler-0.9.0b9/tests/test_parser_errors.py +36 -0
  310. monl_compiler-0.9.0b9/tests/test_planning.py +262 -0
  311. monl_compiler-0.9.0b9/tests/test_platform_adressage.py +111 -0
  312. monl_compiler-0.9.0b9/tests/test_platform_coloration.py +203 -0
  313. monl_compiler-0.9.0b9/tests/test_platform_comptes.py +140 -0
  314. monl_compiler-0.9.0b9/tests/test_platform_console.py +198 -0
  315. monl_compiler-0.9.0b9/tests/test_platform_couverture.py +649 -0
  316. monl_compiler-0.9.0b9/tests/test_platform_dialogue.py +230 -0
  317. monl_compiler-0.9.0b9/tests/test_platform_downloads.py +145 -0
  318. monl_compiler-0.9.0b9/tests/test_platform_entrypoint.py +36 -0
  319. monl_compiler-0.9.0b9/tests/test_platform_exploitation.py +882 -0
  320. monl_compiler-0.9.0b9/tests/test_platform_guide.py +177 -0
  321. monl_compiler-0.9.0b9/tests/test_platform_hebergement.py +488 -0
  322. monl_compiler-0.9.0b9/tests/test_platform_identity.py +87 -0
  323. monl_compiler-0.9.0b9/tests/test_platform_journal.py +124 -0
  324. monl_compiler-0.9.0b9/tests/test_platform_landing.py +855 -0
  325. monl_compiler-0.9.0b9/tests/test_platform_marque.py +493 -0
  326. monl_compiler-0.9.0b9/tests/test_platform_mcp_boucle.py +247 -0
  327. monl_compiler-0.9.0b9/tests/test_platform_mot_de_passe_oublie.py +200 -0
  328. monl_compiler-0.9.0b9/tests/test_platform_persistance.py +99 -0
  329. monl_compiler-0.9.0b9/tests/test_platform_service.py +96 -0
  330. monl_compiler-0.9.0b9/tests/test_platform_socle.py +127 -0
  331. monl_compiler-0.9.0b9/tests/test_platform_web.py +301 -0
  332. monl_compiler-0.9.0b9/tests/test_pool_de_connexions.py +183 -0
  333. monl_compiler-0.9.0b9/tests/test_postgresql.py +619 -0
  334. monl_compiler-0.9.0b9/tests/test_projets_homonymes.py +159 -0
  335. monl_compiler-0.9.0b9/tests/test_projets_metier.py +285 -0
  336. monl_compiler-0.9.0b9/tests/test_propriete_transitive.py +379 -0
  337. monl_compiler-0.9.0b9/tests/test_publication.py +252 -0
  338. monl_compiler-0.9.0b9/tests/test_publication_conditionnelle.py +203 -0
  339. monl_compiler-0.9.0b9/tests/test_rate_limit_shared.py +179 -0
  340. monl_compiler-0.9.0b9/tests/test_rattachement.py +576 -0
  341. monl_compiler-0.9.0b9/tests/test_routage_modeles.py +151 -0
  342. monl_compiler-0.9.0b9/tests/test_section_substance.py +232 -0
  343. monl_compiler-0.9.0b9/tests/test_seed.py +163 -0
  344. monl_compiler-0.9.0b9/tests/test_seed_parent.py +367 -0
  345. monl_compiler-0.9.0b9/tests/test_smoke_and_frontend_ai.py +1240 -0
  346. monl_compiler-0.9.0b9/tests/test_sql_emission.py +150 -0
  347. monl_compiler-0.9.0b9/tests/test_stock.py +569 -0
  348. monl_compiler-0.9.0b9/tests/test_support_serveur.py +137 -0
  349. monl_compiler-0.9.0b9/tests/test_transitive_profondeur.py +473 -0
  350. monl_compiler-0.9.0b9/tests/test_tui.py +80 -0
  351. monl_compiler-0.9.0b9/tests/test_type_uuid.py +209 -0
  352. monl_compiler-0.9.0b9/tests/test_ui_patterns.py +89 -0
  353. monl_compiler-0.9.0b9/tests/test_unicite_composite.py +132 -0
  354. monl_compiler-0.9.0b9/tests/test_uploads.py +243 -0
  355. monl_compiler-0.9.0b9/tests/test_usage.py +296 -0
  356. monl_compiler-0.9.0b9/tests/test_valeur_parmi_une_liste.py +312 -0
  357. monl_compiler-0.9.0b9/tests/test_validateur_refus.py +1190 -0
  358. monl_compiler-0.9.0b9/tests/test_validation_pipeline.py +478 -0
  359. monl_compiler-0.9.0b9/tests/test_verrou_paiement.py +422 -0
  360. monl_compiler-0.9.0b9/tests/test_yandex_uri.py +176 -0
@@ -0,0 +1,105 @@
1
+ # Functional Source License, Version 1.1, ALv2 Future License
2
+
3
+ ## Abbreviation
4
+
5
+ FSL-1.1-ALv2
6
+
7
+ ## Notice
8
+
9
+ Copyright 2026 Bodichane
10
+
11
+ ## Terms and Conditions
12
+
13
+ ### Licensor ("We")
14
+
15
+ The party offering the Software under these Terms and Conditions.
16
+
17
+ ### The Software
18
+
19
+ The "Software" is each version of the software that we make available under
20
+ these Terms and Conditions, as indicated by our inclusion of these Terms and
21
+ Conditions with the Software.
22
+
23
+ ### License Grant
24
+
25
+ Subject to your compliance with this License Grant and the Patents,
26
+ Redistribution and Trademark clauses below, we hereby grant you the right to
27
+ use, copy, modify, create derivative works, publicly perform, publicly display
28
+ and redistribute the Software for any Permitted Purpose identified below.
29
+
30
+ ### Permitted Purpose
31
+
32
+ A Permitted Purpose is any purpose other than a Competing Use. A Competing Use
33
+ means making the Software available to others in a commercial product or
34
+ service that:
35
+
36
+ 1. substitutes for the Software;
37
+
38
+ 2. substitutes for any other product or service we offer using the Software
39
+ that exists as of the date we make the Software available; or
40
+
41
+ 3. offers the same or substantially similar functionality as the Software.
42
+
43
+ Permitted Purposes specifically include using the Software:
44
+
45
+ 1. for your internal use and access;
46
+
47
+ 2. for non-commercial education;
48
+
49
+ 3. for non-commercial research; and
50
+
51
+ 4. in connection with professional services that you provide to a licensee
52
+ using the Software in accordance with these Terms and Conditions.
53
+
54
+ ### Patents
55
+
56
+ To the extent your use for a Permitted Purpose would necessarily infringe our
57
+ patents, the license grant above includes a license under our patents. If you
58
+ make a claim against any party that the Software infringes or contributes to
59
+ the infringement of any patent, then your patent license to the Software ends
60
+ immediately.
61
+
62
+ ### Redistribution
63
+
64
+ The Terms and Conditions apply to all copies, modifications and derivatives of
65
+ the Software.
66
+
67
+ If you redistribute any copies, modifications or derivatives of the Software,
68
+ you must include a copy of or a link to these Terms and Conditions and not
69
+ remove any copyright notices provided in or with the Software.
70
+
71
+ ### Disclaimer
72
+
73
+ THE SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTIES OF ANY KIND, EXPRESS OR
74
+ IMPLIED, INCLUDING WITHOUT LIMITATION WARRANTIES OF FITNESS FOR A PARTICULAR
75
+ PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT.
76
+
77
+ IN NO EVENT WILL WE HAVE ANY LIABILITY TO YOU ARISING OUT OF OR RELATED TO THE
78
+ SOFTWARE, INCLUDING INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES,
79
+ EVEN IF WE HAVE BEEN INFORMED OF THEIR POSSIBILITY IN ADVANCE.
80
+
81
+ ### Trademarks
82
+
83
+ Except for displaying the License Details and identifying us as the origin of
84
+ the Software, you have no right under these Terms and Conditions to use our
85
+ trademarks, trade names, service marks or product names.
86
+
87
+ ## Grant of Future License
88
+
89
+ We hereby irrevocably grant you an additional license to use the Software under
90
+ the Apache License, Version 2.0 that is effective on the second anniversary of
91
+ the date we make the Software available. On or after that date, you may use the
92
+ Software under the Apache License, Version 2.0, in which case the following
93
+ will apply:
94
+
95
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
96
+ this file except in compliance with the License.
97
+
98
+ You may obtain a copy of the License at
99
+
100
+ http://www.apache.org/licenses/LICENSE-2.0
101
+
102
+ Unless required by applicable law or agreed to in writing, software distributed
103
+ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
104
+ CONDITIONS OF ANY KIND, either express or implied. See the License for the
105
+ specific language governing permissions and limitations under the License.
@@ -0,0 +1,567 @@
1
+ Metadata-Version: 2.4
2
+ Name: monl-compiler
3
+ Version: 0.9.0b9
4
+ Summary: Compilateur d'intention logicielle : dialogue dirigé (sans IA) → spec DSL déterministe → backend FastAPI sécurisé + contrat frontend.
5
+ Author: Itchane Bodi
6
+ License-Expression: LicenseRef-FSL-1.1-ALv2
7
+ Project-URL: Repository, https://github.com/Bodichane/monl-compiler
8
+ Project-URL: Documentation, https://github.com/Bodichane/monl-compiler/tree/main/docs
9
+ Project-URL: Issues, https://github.com/Bodichane/monl-compiler/issues
10
+ Keywords: dsl,compiler,fastapi,codegen,low-code
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3 :: Only
15
+ Classifier: Programming Language :: Python :: 3.10
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.14
18
+ Classifier: Topic :: Software Development :: Code Generators
19
+ Classifier: Topic :: Software Development :: Compilers
20
+ Requires-Python: >=3.10
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: fastapi<1.0,>=0.110
24
+ Requires-Dist: uvicorn<1.0,>=0.29
25
+ Requires-Dist: lark<2.0,>=1.1
26
+ Requires-Dist: PyJWT<3.0,>=2.8
27
+ Requires-Dist: python-multipart<1.0,>=0.0.9
28
+ Provides-Extra: ai
29
+ Requires-Dist: requests<3.0,>=2.31; extra == "ai"
30
+ Requires-Dist: Pillow<13.0,>=10.0; extra == "ai"
31
+ Provides-Extra: dev
32
+ Requires-Dist: pytest<9.0,>=8.0; extra == "dev"
33
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
34
+ Requires-Dist: ruff>=0.6; extra == "dev"
35
+ Requires-Dist: mypy<2.0,>=1.10; extra == "dev"
36
+ Requires-Dist: vulture<3.0,>=2.11; extra == "dev"
37
+ Requires-Dist: requests<3.0,>=2.31; extra == "dev"
38
+ Requires-Dist: packaging<27,>=24; extra == "dev"
39
+ Requires-Dist: PyYAML<7.0,>=6.0; extra == "dev"
40
+ Requires-Dist: Pillow<13.0,>=10.0; extra == "dev"
41
+ Requires-Dist: tomli>=2.0; python_version < "3.11" and extra == "dev"
42
+ Provides-Extra: postgres
43
+ Requires-Dist: psycopg[pool]<4.0,>=3.1; extra == "postgres"
44
+ Dynamic: license-file
45
+
46
+ # monl-compiler
47
+
48
+ **Un compilateur qui transforme une spécification déclarative en backend complet, déterministe et sûr.**
49
+
50
+ [![CI](https://github.com/Bodichane/monl-compiler/actions/workflows/ci.yml/badge.svg)](https://github.com/Bodichane/monl-compiler/actions/workflows/ci.yml)
51
+ [![Version](https://img.shields.io/badge/version-0.9.0--beta.9-blue)](CHANGELOG.md)
52
+ [![Python](https://img.shields.io/badge/python-3.10%2B-blue)](pyproject.toml)
53
+ [![Tests](https://img.shields.io/badge/tests-CI-brightgreen)](tests/)
54
+ [![Couverture](https://img.shields.io/badge/couverture-CI-brightgreen)](#qualité-et-vérification)
55
+ [![Licence](https://img.shields.io/badge/licence-FSL--1.1--ALv2-blue)](LICENSE)
56
+
57
+ On décrit l'intention d'une application dans un DSL dédié ; monl-compiler en génère la base
58
+ de données, l'API REST, l'authentification et le contrôle d'accès — puis produit un
59
+ contrat que le frontend doit respecter. **La spécification est l'unique source de
60
+ vérité** : on ne maintient pas le code d'infrastructure à la main.
61
+
62
+ Un dialogue guidé aide à rédiger cette spécification sans connaître la syntaxe.
63
+ Son mode express demande seulement le type de site, son nom et une phrase de
64
+ description ; monl-compiler prépare ensuite la structure, les données de démonstration et
65
+ un brief éditorial complet. Le seul recours à l'IA se situe au bout de la chaîne,
66
+ pour construire le frontend à partir du contrat garanti par le compilateur —
67
+ **jamais** pour le backend, les permissions ni la logique métier.
68
+
69
+ ---
70
+
71
+ ## Sommaire
72
+
73
+ - [Démarrage rapide](#démarrage-rapide)
74
+ - [Pourquoi monl-compiler ?](#pourquoi-monl-compiler-)
75
+ - [Architecture](#architecture)
76
+ - [Commandes](#commandes)
77
+ - [La spécification](#la-spécification)
78
+ - [Le backend généré](#le-backend-généré)
79
+ - [Photos, logo et favicon](#vos-fichiers--photos-logo-favicon)
80
+ - [Remplacer le contenu sans ouvrir le DSL](#remplacer-le-contenu-sans-ouvrir-le-dsl)
81
+ - [Le frontend : contrat et IA spécialisée](#le-frontend--contrat-et-ia-spécialisée)
82
+ - [Qualité et vérification](#qualité-et-vérification)
83
+ - [Structure du dépôt](#structure-du-dépôt)
84
+ - [Documentation](#documentation)
85
+
86
+ ---
87
+
88
+ ## Démarrage rapide
89
+
90
+ `monl` ouvre le dialogue guidé. Choisissez une catégorie, puis **Création rapide
91
+ avec l'IA** : trois réponses suffisent pour produire la spécification, le backend
92
+ et le contrat frontend. Cette première étape reste déterministe, sans modèle et
93
+ sans appel réseau. L'IA intervient ensuite uniquement pour dessiner l'interface.
94
+
95
+ ```bash
96
+ pip install .
97
+ monl
98
+ monl frontend MonProjet --provider codex
99
+ monl run MonProjet
100
+ ```
101
+
102
+ Les fournisseurs frontend par API nécessitent l'extra optionnel :
103
+ `pip install '.[ai]'`. Les agents locaux et `monl import` n'en ont
104
+ pas besoin.
105
+
106
+ Yandex Cloud AI Studio est disponible par son API compatible OpenAI. La clé et
107
+ le dossier restent dans l'environnement ; l'identifiant de modèle est celui
108
+ affiché par AI Studio :
109
+
110
+ ```bash
111
+ export YANDEX_API_KEY='…'
112
+ export YANDEX_FOLDER_ID='…'
113
+ monl frontend MonProjet --provider yandex \
114
+ --model "gpt://$YANDEX_FOLDER_ID/yandexgpt/latest"
115
+ ```
116
+
117
+ Si un modèle lent dépasse le délai HTTP, réduire le plafond de réponse pour cet
118
+ appel : `MONL_AI_MAX_TOKENS=8000 monl frontend …`.
119
+
120
+ Chaque appel API mesurable ajoute dans le projet une ligne à
121
+ `.monl_ai_usage.jsonl` (ignoré par Git) : fournisseur, modèle, durée et jetons,
122
+ sans prompt, réponse ni clé. Ce journal permet de chiffrer une construction et
123
+ une retouche avant de fixer le prix du service.
124
+
125
+ Le parcours **Personnalisation détaillée** reste disponible pour choisir chaque
126
+ option, rôle, contenu éditorial et intention visuelle. Sans agent local ni clé
127
+ API, ouvrez `FRONTEND_PROMPT.md` dans l'IA de votre choix, puis installez le ZIP
128
+ ou le fichier HTML obtenu avec `monl import`.
129
+
130
+ > **Ubuntu / Debian.** Le Python système est protégé (PEP 668) : préférez
131
+ > `pipx install .` à `pip install . --break-system-packages`.
132
+
133
+ Le parcours complet, interface comprise, est détaillé dans
134
+ [QUICKSTART.md](QUICKSTART.md).
135
+
136
+ ## Pourquoi monl-compiler ?
137
+
138
+ | | Framework classique<br><sub>Django, Rails, FastAPI…</sub> | Générateur d'IA<br><sub>v0, Bolt, assistants de code</sub> | **monl-compiler** |
139
+ |---|---|---|---|
140
+ | **Code d'infrastructure** | écrit et maintenu à la main | produit une fois, à reprendre ensuite | **dérivé de la spec, jamais maintenu** |
141
+ | **Deux compilations identiques** | sans objet | résultat différent à chaque fois | **sources backend identiques à entrée et version de compilateur identiques** |
142
+ | **Contrôle d'accès** | vérifié route par route, à la vigilance | ce que le modèle a compris | **vérifié à la compilation : une collision de privilèges empêche de compiler** |
143
+ | **Cohérence schéma / API / règles** | trois endroits à synchroniser | aucune garantie | **une source unique, propagée à la recompilation** |
144
+ | **Sécurité** | dépend de l'auteur | dépend du code produit et de sa revue | **contrôles générés : requêtes paramétrées, rôle issu du compte réel, secret hors du code** |
145
+ | **Rôle de l'IA** | aucun | écrit tout, backend compris | **cantonnée au frontend, encadrée par un contrat et un smoke test** |
146
+ | **Évolution du schéma** | migrations à écrire | à reprendre à la main | **additive et non destructive, données préservées** |
147
+
148
+ **Ce que vous écrivez :** une spécification d'une page. **Ce que vous
149
+ modifiez, ensuite :** la même page. Le code produit se recompile ; il n'est
150
+ jamais un point de départ à retoucher.
151
+
152
+ Ces contrôles couvrent les règles prises en charge par le compilateur ; ils
153
+ ne garantissent pas la sécurité globale d'une application. La pertinence des
154
+ permissions déclarées, le code `custom`, le frontend, les dépendances et
155
+ l'exploitation demandent leurs propres vérifications. Les sources générées
156
+ sont déterministes ; les secrets créés pour chaque projet et les données
157
+ d'exécution ne font pas partie de cette identité. Voir le
158
+ [modèle de sécurité](docs/SECURITE.md) et le [guide d'exploitation](docs/EXPLOITATION.md).
159
+
160
+ ## Architecture
161
+
162
+ <img alt="Dialogue express ou détaillé et contenu CSV vers spec.ml ; compilation et audit vers backend et contrat ; frontend écrit par une IA puis ensemble vérifié par monl run" src="docs/images/architecture-clair.svg" width="100%">
163
+
164
+ Le dialogue produit la spécification ; le compilateur en dérive **à la fois** le
165
+ backend et le contrat frontend ; l'IA écrit l'interface contre ce contrat ;
166
+ `monl run` vérifie que les trois restent cohérents avant de lancer l'application.
167
+
168
+ ## Commandes
169
+
170
+ ### Plateforme web et MCP
171
+
172
+ Le compilateur peut aussi être utilisé sans cloner le dépôt sur la machine de
173
+ l'utilisateur. La plateforme web explique Monl, valide une spec, compile le
174
+ backend, expose son contrat et livre une archive sans secret :
175
+
176
+ ```bash
177
+ monl-platform --port 8022
178
+ ```
179
+
180
+ Les agents compatibles MCP peuvent appeler le même pipeline avec `monl-mcp`
181
+ en stdio ou le point HTTP `/mcp`. Aucun second générateur n'est maintenu : CLI,
182
+ web et MCP délèguent tous à `compile_project`.
183
+
184
+ Voir [Plateforme web et serveur MCP](docs/PLATFORME_ET_MCP.md).
185
+
186
+ En production, `compose.platform.yaml` lance l'application comme utilisateur
187
+ non-root avec stockage persistant, readiness, quotas partagés et compilations
188
+ isolées. Le port reste lié à localhost pour être publié derrière un reverse
189
+ proxy HTTPS. La procédure reproductible (variables, DNS, TLS, sauvegardes et
190
+ sondes) est détaillée dans [le runbook de déploiement](deploy/README.md).
191
+
192
+ | Commande | Ce qu'elle fait |
193
+ |---|---|
194
+ | `monl` | Dialogue guidé → `spec.ml` + backend + contrat frontend |
195
+ | `monl compile <spec.ml> --output <dir>` | Compile une spécification existante |
196
+ | `monl frontend <App>` | L'IA écrit l'interface dans `frontend/` |
197
+ | `monl import <zip\|html\|dossier> <App>` | Installe un frontend obtenu sans clé API |
198
+ | `monl retouche "<ce qui cloche>" <App>` | Corrige un défaut d'affichage sans reconstruire le site |
199
+ | `monl run <App>` | Vérifie la cohérence, joue le smoke test, puis lance |
200
+ | `monl diff <App>` | Montre le delta du contrat **sans rien recompiler ni écrire** |
201
+ | `monl update <App>` | Recompile après évolution de la spec, préserve les données |
202
+ | `monl migrate <App> --name <nom>` | Applique (ou défait avec `--down`) une migration de schéma nommée |
203
+ | `monl usage <App>` | Mesure la consommation IA et le coût déclaré du projet |
204
+ | `monl assets add <fichier> --for "<fiche>"` | Installe une photo et la déclare dans la spec |
205
+ | `monl assets list <App>` | Ce que la spec déclare, ce qui est présent, ce qui traîne |
206
+ | `monl content export <App>` | Exporte les fiches de démonstration vers `content/*.csv` |
207
+ | `monl content import <App>` | Remplace les fiches depuis les CSV, puis revalide toute la spec |
208
+
209
+ Chaque projet se compile dans son propre dossier via `--output`, afin de ne pas
210
+ écraser le précédent. Les spécifications portent l'extension `.ml`.
211
+
212
+ ## La spécification
213
+
214
+ Une spec décrit des **entités** (tables et champs), des **acteurs** (rôles) et des
215
+ **règles** d'accès. Le compilateur en dérive le schéma, les routes CRUD et le
216
+ contrôle d'accès. Les identifiants sont contraints par la grammaire, ce qui exclut
217
+ toute injection par les noms de tables ou de colonnes.
218
+
219
+ **Le contrôle d'accès s'exprime au niveau de l'enregistrement, lecture comprise :**
220
+
221
+ | Règle | Effet |
222
+ |---|---|
223
+ | `rule Entite.Action ownedBy Acteur` | Seul le propriétaire (relation auto-peuplée à la création) peut agir — **le filtrage couvre aussi la lecture**, liste et accès direct |
224
+ | `rule Entite.Action accessibleBy col1, col2` | Réservé aux parties référencées par l'enregistrement (messagerie privée : expéditeur et destinataire) |
225
+ | `rule Entite.Action public` | Retire l'authentification d'une action précise (galerie publique, formulaire de contact) |
226
+ | `rule Article.Read publicWhen status "published"` | Lecture publique **sous condition** : liste filtrée, détail en 404. Un `sharedBy` sur la même référence exempte les modérateurs ; le propriétaire retrouve toujours les siens |
227
+ | `rule Vote.Create oncePer Participant, Entry` | Index unique composite : un compte ne peut effectuer l'action qu'une fois par cible |
228
+
229
+ **Les contraintes de champ sont appliquées, pas seulement déclarées :**
230
+
231
+ | Règle | Effet |
232
+ |---|---|
233
+ | `rule Produit.prix min 0` | Borne d'entrée — **422 avant tout INSERT**. Valeur sur les types nombre, longueur sur les types texte |
234
+ | `rule Membre.pseudo unique` | Index unique en base — un doublon répond 409, à la création comme à la modification |
235
+ | `rule Produit.nom required` | Assertion vérifiée : le champ doit exister (les schémas rendent déjà tout champ obligatoire) |
236
+ | `rule Ligne.Create decrements Produit.stock by quantite` | Décompte **la quantité demandée**, et refuse en 409 de passer sous le `min` déclaré |
237
+ | `rule Commande.passeeLe timestamp` | Date de création écrite par le **serveur** (ISO 8601 UTC), absente des corps de requête — création comme modification |
238
+ | `rule Commande.statut oneOf "panier", "expédiée"` | Refuse toute autre valeur à la création comme à la modification |
239
+ | `rule Commande.statut "annulée" releases Ligne` | Rend le stock une seule fois lorsque la commande est annulée |
240
+ | `rule Commande.statut writableAfterPayment Admin` | Réserve ce champ à une route authentifiée dédiée ; les totaux calculés restent inaccessibles |
241
+
242
+ D'autres marqueurs affinent champs et comportement : `hidden`, `generated`,
243
+ `categorized`, `derivedFrom` / `sumOf` (montants calculés par le serveur),
244
+ `payable` (encaissement, ci-dessous), ainsi qu'un bloc `seed` idempotent qui
245
+ pré-remplit la base au démarrage. Une règle sans effet est **refusée à la
246
+ compilation** plutôt qu'ignorée en silence — et une règle qui désigne un champ
247
+ inexistant aussi : une contrainte à laquelle rien ne correspond laisse croire à
248
+ une protection qui n'existe pas.
249
+
250
+ <details>
251
+ <summary><b>Encaisser : <code>rule Commande.total payable</code></b></summary>
252
+
253
+ <br>
254
+
255
+ La règle nomme le champ qui porte le **montant** ; l'entité qui le contient est
256
+ celle qu'on encaisse. monl-compiler en dérive deux colonnes de suivi et deux routes —
257
+ `POST /commande/{id}/paiement`, qui ouvre une session de règlement, et
258
+ `POST /paiement/webhook`, qui reçoit la confirmation du prestataire.
259
+
260
+ **Le montant vient de la base, jamais du client.** La route de règlement
261
+ n'accepte aucun corps de requête : elle relit le champ à chaque appel. Un panier
262
+ qui envoie son propre prix est un panier qu'on peut négocier. Le webhook, lui,
263
+ vérifie la signature du prestataire avant d'écrire quoi que ce soit — c'est le
264
+ seul endroit du backend généré où un tiers non authentifié touche à la base.
265
+
266
+ Six situations sont refusées **à la compilation** plutôt qu'au moment
267
+ d'encaisser : entité ou champ inexistant, champ non numérique, cumul avec
268
+ `hidden` (un montant illisible est invérifiable par celui qui le règle), deux
269
+ champs `payable` sur une même entité (plus rien ne dit lequel encaisser), et
270
+ création `public` (un paiement exige un appelant identifié).
271
+
272
+ Les clés (`STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`) viennent de
273
+ l'environnement, comme le secret JWT. Absentes, les routes répondent 503 **en
274
+ nommant la variable manquante** et le reste du serveur fonctionne normalement :
275
+ un projet fraîchement compilé se lance et se teste hors ligne.
276
+
277
+ </details>
278
+
279
+ <details>
280
+ <summary><b>Inscription : pourquoi un rôle ne s'obtient pas en un appel HTTP</b></summary>
281
+
282
+ <br>
283
+
284
+ Un acteur n'est pas inscriptible par défaut. `actor Client selfRegister` ouvre
285
+ `POST /register` à ce rôle ; un `actor Admin` sans marqueur ne peut être obtenu que
286
+ par provisionnement hors ligne (`manage.py`, généré à côté du backend). Laisser le
287
+ client choisir son rôle à l'inscription serait une élévation de privilège en un
288
+ appel HTTP.
289
+
290
+ </details>
291
+
292
+ **Cinq spécifications de référence**, commentées, dans
293
+ [`exemples/`](exemples/) : un fichier `.ml` d'une page par application —
294
+ portfolio, boutique, réseau social, kanban, classement — dont monl-compiler dérive tout
295
+ le reste.
296
+
297
+ <details>
298
+ <summary><b>Direction visuelle : elle ne vient pas du compilateur</b></summary>
299
+
300
+ <br>
301
+
302
+ monl-compiler n'a **aucun** avis sur le visuel — ni palette, ni typographie, ni grille.
303
+ Il ne sait pas à quoi un projet doit ressembler ; il ne connaît que des noms de
304
+ tables. La direction est celle que l'auteur formule dans le dialogue (registre
305
+ visuel, place des images) : elle voyage dans le brief, et c'est l'IA
306
+ d'interface qui la sert.
307
+
308
+ Deux exigences seulement subsistent, et ce ne sont pas des questions de goût :
309
+ le **contraste** (WCAG AA), qui rend l'interface lisible, et l'**autonomie** du
310
+ frontend, qui la rend vérifiable par le smoke test.
311
+
312
+ </details>
313
+
314
+ ## Le backend généré
315
+
316
+ **Comptes et rôles.** `POST /register` n'accepte que les rôles marqués
317
+ `selfRegister` ; tout autre est refusé (403). Les comptes privilégiés se créent
318
+ avec le `manage.py` généré, sur la machine qui héberge la base :
319
+ `python3 manage.py adduser <utilisateur> <role>`. La même commande gère rôle, mot
320
+ de passe, liste des comptes et révocation globale des sessions.
321
+
322
+ **Authentification.** Registre d'utilisateurs propre à chaque application (table
323
+ `_monl_users`, mots de passe en PBKDF2-HMAC-SHA256, sel unique par compte,
324
+ comparaison à temps constant). Flux : `POST /register` → `POST /login` (jeton JWT)
325
+ → `POST /logout` (révocation avant expiration). **Le rôle et l'identité portés par
326
+ le jeton proviennent du compte réel**, jamais d'une déclaration du client.
327
+
328
+ **Secret JWT.** Généré aléatoirement à la première compilation, stocké dans
329
+ `.jwt_secret` (jamais versionné). En production, `MONL_JWT_SECRET` est prioritaire
330
+ et permet de livrer un projet sans secret sur le disque.
331
+
332
+ **Multi-workers.** Révocation de jetons et limitation de débit (5 tentatives /
333
+ 60 s / IP sur `/register` et `/login`) sont persistées en base, donc partagées :
334
+ `uvicorn app:app --workers N` n'en démultiplie pas les quotas. Derrière un reverse
335
+ proxy de confiance, `MONL_TRUST_PROXY=1` fait lire l'IP réelle dans
336
+ `X-Forwarded-For` ; sans ce réglage l'en-tête est ignoré, pour empêcher toute
337
+ usurpation.
338
+
339
+ **Migrations.** Recompiler dans le même dossier, en conservant `app.db`, ajoute les
340
+ colonnes par `ALTER TABLE ADD COLUMN` sans toucher aux données. Les changements
341
+ destructifs ne sont pas automatisés, à dessein — voir [docs/MIGRATIONS.md](docs/MIGRATIONS.md).
342
+
343
+ **Routes servies.** `/docs` (Swagger, toujours disponible) · `/` (redirige vers
344
+ `/docs`) · `/site` (l'interface, si `frontend/` existe et que l'app est lancée par
345
+ `monl run`).
346
+
347
+ ## Vos fichiers : photos, logo, favicon
348
+
349
+ Une image cassée ne se voit qu'à l'œil, en ligne — le pire endroit pour découvrir
350
+ une faute de frappe. Les fichiers que vous fournissez se déclarent donc dans la
351
+ spec, et le compilateur **refuse de compiler s'ils ne sont pas là** :
352
+
353
+ ```monl
354
+ assets
355
+ dir: "assets"
356
+ logo: "logo.svg"
357
+
358
+ entity Produit
359
+ photo: Image # un fichier LOCAL, vérifié présent
360
+ ```
361
+
362
+ `Image` désigne un fichier du projet : une URL y est refusée, parce que monl ne
363
+ fait aucun appel réseau et ne pourrait rien affirmer d'une adresse distante —
364
+ `String` reste là pour ce cas, non vérifié. Le dossier vit **hors de
365
+ `frontend/`**, qui est renommé à chaque reconstruction du frontend.
366
+
367
+ Pour ne pas écrire ces chemins à la main :
368
+
369
+ ```bash
370
+ monl assets add ~/photos/IMG_4821.jpg --for "Halo RS" # → assets/halo-rs.jpg
371
+ monl assets add ~/logo.svg --logo
372
+ monl assets list # présents, manquants, orphelins
373
+ ```
374
+
375
+ La commande copie le fichier, le renomme en slug, écrit la déclaration — puis fait
376
+ **revalider la spec obtenue par le compilateur avant de l'enregistrer**. En cas de
377
+ refus, ni la spec ni le dossier ne sont modifiés. Elle ne supprime jamais un
378
+ fichier : remplacer une photo signale l'ancienne comme orpheline, elle ne l'efface
379
+ pas.
380
+
381
+ ## Remplacer le contenu sans ouvrir le DSL
382
+
383
+ Le seed de démonstration permet de voir immédiatement une interface, mais il
384
+ n'est pas destiné à devenir le vrai catalogue. Un humain peut remplacer textes,
385
+ prix et noms de photos avec un tableur :
386
+
387
+ ```bash
388
+ monl content export MonProjet
389
+ # modifier content/Produit.csv et déposer les photos dans assets/
390
+ monl content import MonProjet
391
+ monl update MonProjet
392
+ ```
393
+
394
+ Chaque CSV conserve l'ordre des champs et des fiches. `LISEZMOI.txt` explique en
395
+ français les valeurs permises, les champs obligatoires, les bornes et les images
396
+ attendues. Une cellule vide est omise : c'est le vrai compilateur qui décide si
397
+ elle était obligatoire. Les nombres invalides, fichiers absents, chemins suspects
398
+ et blocs ambigus sont refusés avant toute écriture. L'import remplace le contenu
399
+ complet de l'entité ; il ne fusionne jamais silencieusement deux sources de
400
+ vérité.
401
+
402
+ ## Le frontend : contrat et IA spécialisée
403
+
404
+ L'interface est écrite par une IA, à partir d'un contrat métier et d'une
405
+ direction visuelle préparée avant le code. Chaque compilation produit :
406
+
407
+ - `frontend_contract.json` — description machine-lisible des routes destinées à
408
+ l'interface, de l'authentification et des règles de champ, dérivée de la même
409
+ spec que le backend ;
410
+ - `FRONTEND_PROMPT.md` — un brief prêt à confier à une IA d'interface : structure,
411
+ rôles, contenu et intention déclarée, sans aucune prescription visuelle.
412
+ - `DESIGN_SYSTEM.md` — pattern de page, tokens de départ, anti-patterns et
413
+ checklist UX déterminés depuis le contrat ; il est lu avant le HTML/CSS/JS.
414
+ - `DESIGN_SPEC.md` — synthèse visuelle éditable ; si l'auteur la remplace, elle
415
+ devient prioritaire et Monl ne l'écrase pas.
416
+ - `ASSET_MANIFEST.json` — plan d'assets et marqueurs de sections. Il est
417
+ d'abord `planned`, puis devient vérifiable après `monl frontend` ou `monl import`.
418
+
419
+ Le système de design sélectionne aussi un catalogue local de patterns Monl —
420
+ hero, catalogue, éditorial, réassurance, FAQ, contact et CTA final — avec des
421
+ variantes adaptées au type d'application. Ces patterns sont des structures
422
+ HTML/CSS/JS autonomes, pas des composants React à installer.
423
+
424
+ L'IA écrit dans `frontend/` (point d'entrée `index.html`), que `monl run` sert sur
425
+ `/site` sans jamais toucher au backend. Plusieurs voies, mêmes garde-fous :
426
+
427
+ | Voie | Commande | Authentification |
428
+ |---|---|---|
429
+ | Manuelle | déposer les fichiers dans `frontend/` | — |
430
+ | Copier-coller | `monl import <zip\|html\|dossier> <App>` | aucune |
431
+ | Agent local | `monl frontend <App> --provider claude-code\|codex\|gemini` | abonnement de l'agent |
432
+ | Agent quelconque | `monl frontend <App> --agent-command "<cmd> {instruction}"` | celle de l'agent |
433
+ | API Anthropic | `monl frontend <App> --provider claude` | `ANTHROPIC_API_KEY` |
434
+ | API tierce | `monl frontend <App> --provider groq --model <id>` | `GROQ_API_KEY`, etc. |
435
+
436
+ **N'importe quelle clé fait l'affaire.** Les fournisseurs au dialecte OpenAI —
437
+ `groq`, `openai`, `openrouter`, `deepseek`, `mistral`, `together`, `xai`,
438
+ `ollama` — sont préréglés, chacun lisant sa propre variable d'environnement. Pour
439
+ un point de terminaison absent de cette liste, `--provider openai-compatible`
440
+ avec `MONL_AI_BASE_URL` et `MONL_AI_API_KEY`. Hors voie Anthropic, `--model` est
441
+ exigé : monl ne code aucun identifiant de modèle en dur, les catalogues changeant
442
+ trop vite pour qu'une valeur figée reste vraie. La clé se lit toujours dans
443
+ l'environnement, jamais en argument — le shell l'archiverait.
444
+
445
+ Garde-fous communs : extensions en liste blanche, protection contre le zip-slip,
446
+ frontend autonome sans CDN, direction de design injectée avant la génération,
447
+ et re-vérification systématique des routes, assets et sections obligatoires.
448
+
449
+ ### Sans clé API, sans carte bancaire, sans réseau
450
+
451
+ **Le compilateur n'appelle jamais l'extérieur.** `monl compile` produit `app.py`,
452
+ `schema.sql`, `manage.py`, le contrat et le brief entièrement hors ligne : le
453
+ parseur, le validateur et le générateur ne contiennent aucun appel réseau. Tout
454
+ le backend — routes, base, JWT, contrôle d'accès, paiement, back-office —
455
+ s'obtient sans compte chez qui que ce soit.
456
+
457
+ L'IA n'intervient qu'à l'étape frontend, et cette étape a une voie **sans aucune
458
+ clé** :
459
+
460
+ ```bash
461
+ monl compile boutique.ml --output ./Boutique # hors ligne
462
+ # coller le contenu de Boutique/docs/FRONTEND_PROMPT.md dans n'importe quel
463
+ # assistant accessible par navigateur, récupérer le résultat…
464
+ monl import interface.zip ./Boutique # mêmes garde-fous, même vérification
465
+ monl run ./Boutique
466
+ ```
467
+
468
+ `monl import` n'est pas une porte dérobée : la source vient d'une conversation,
469
+ elle est donc traitée comme une entrée non fiable — liste blanche d'extensions,
470
+ refus du zip-slip, refus des CDN, `index.html` obligatoire, puis contrôle de
471
+ cohérence et smoke test, exactement comme une réponse d'API.
472
+
473
+ Restent, selon ce que vous avez sous la main : `--provider ollama` pour un modèle
474
+ entièrement local, les agents en ligne de commande qui s'authentifient par
475
+ abonnement plutôt que par clé, et les fournisseurs au dialecte OpenAI dont
476
+ plusieurs proposent un palier gratuit. monl n'en privilégie aucun et n'en revend
477
+ aucun : il ne consomme aucun jeton pour son propre compte.
478
+
479
+ > **Ce qui est prouvé, et ce qui ne l'est pas.** Le parcours hors ligne, la voie
480
+ > copier-coller et la voie Anthropic sont éprouvés de bout en bout contre un vrai
481
+ > serveur. Les préréglages `codex` et `gemini` sont écrits et couverts au niveau
482
+ > de la plomberie, mais n'ont pas été éprouvés contre les binaires réels — les
483
+ > employer, c'est essuyer les plâtres.
484
+
485
+ **Avant tout lancement**, `monl run` exécute un smoke test comportemental sur un
486
+ serveur éphémère à base neuve : chaque route du contrat est éprouvée en HTTP réel
487
+ et, si Node.js est présent, `frontend/index.html` est exécuté dans jsdom contre ce
488
+ serveur. Toute exception ou tout appel hors contrat bloque le lancement
489
+ (`--skip-smoke` pour outrepasser en connaissance de cause).
490
+
491
+ ## Qualité et vérification
492
+
493
+ | | |
494
+ |---|---|
495
+ | **Tests publiés par la CI** | Validations unitaires et serveurs éphémères pour les parcours HTTP ; consulter l'exécution CI de la révision concernée |
496
+ | **Couverture publiée par la CI** | Compilateur et plateforme mesurés séparément, avec un seuil de 90 % pour chacun |
497
+ | **Audit offensif** | Usurpation de rôle, JWT forgé, élévation de privilège |
498
+ | **Frontières d'architecture** | Contrats d'import vérifiés par les tests, notamment l'indépendance de l'analyse vis-à-vis des émetteurs |
499
+ | **Lint** | `ruff check src tests` — zéro signalement, exceptions justifiées dans `pyproject.toml` |
500
+ | **CI** | Workflow configuré pour Python 3.10, 3.12 et 3.14 à chaque push et pull request |
501
+
502
+ ```bash
503
+ python3 -m pytest tests/ -rs --cov=src/monl --cov-report=term-missing
504
+ python3 -m pytest tests/test_platform_*.py tests/test_oauth.py tests/test_administration.py tests/test_codes_de_secours.py -rs --cov=src/monl_platform --cov-report=term --cov-fail-under=90
505
+ ```
506
+
507
+ ```bash
508
+ ruff check src tests
509
+ ```
510
+
511
+ ```bash
512
+ python3 -m mypy src/monl/ir.py src/monl/ir_types.py src/monl/planning.py src/monl/policies.py src/monl/errors.py src/monl/generator/emitters.py --strict
513
+ vulture src/monl --min-confidence 90
514
+ ```
515
+
516
+ monl-compiler ne dépend d'aucun modèle d'IA et ne fait aucun appel réseau :
517
+ dialogue, spécification et génération du backend sont entièrement déterministes.
518
+ Les blocs `custom` produisent des coquilles vides sûres dans `sandbox_ai.py`, dont
519
+ la logique métier est écrite à la main — aucune génération de code n'est
520
+ automatisée.
521
+
522
+ ## Structure du dépôt
523
+
524
+ | Dossier | Contenu |
525
+ |---|---|
526
+ | `src/monl/` | Le paquet : parseur, validateur, dialogue, design system, contrat frontend, CLI |
527
+ | `src/monl/generator/` | Le générateur de backend, une couche par module |
528
+ | `exemples/` | Cinq spécifications `.ml` d'une page, compilées à chaque test |
529
+ | `demo/` | La démo StudioNova : sa spécification et son frontend |
530
+ | `tests/` | Non-régression, audit offensif, frontières d'architecture |
531
+ | `docs/` | Décisions de conception, sécurité, migrations |
532
+
533
+ ## Documentation
534
+
535
+ | Fichier | Contenu |
536
+ |---|---|
537
+ | [QUICKSTART.md](QUICKSTART.md) | Le parcours complet, en trois étapes |
538
+ | [docs/design_decisions.md](docs/design_decisions.md) | Le journal du projet : 115 points, chacun avec son *pourquoi* |
539
+ | [docs/SECURITE.md](docs/SECURITE.md) | Modèle de sécurité |
540
+ | [docs/MIGRATIONS.md](docs/MIGRATIONS.md) | Évolution du schéma sans perte |
541
+ | [docs/BETA.md](docs/BETA.md) | État de la bêta et feuille de route |
542
+ | [docs/DEPRECATIONS.md](docs/DEPRECATIONS.md) | Compatibilités historiques et politique de retrait |
543
+ | [docs/PUBLICATION.md](docs/PUBLICATION.md) | Publication PyPI et image de plateforme GHCR |
544
+ | [deploy/README.md](deploy/README.md) | Runbook de déploiement Docker, DNS, TLS et smoke test |
545
+ | [CHANGELOG.md](CHANGELOG.md) | Historique des versions |
546
+ | [CONTRIBUTING.md](CONTRIBUTING.md) | Méthode de travail, règles du dépôt, checklist avant PR |
547
+
548
+ ## Licence
549
+
550
+ **FSL-1.1-ALv2** — *Functional Source License*, avec bascule automatique vers
551
+ **Apache-2.0 deux ans après la publication de chaque version**
552
+ ([LICENSE](LICENSE)).
553
+
554
+ Vous pouvez utiliser monl-compiler librement, y compris en contexte
555
+ professionnel, le modifier, le redistribuer, et **vous en servir pour livrer
556
+ des applications à vos clients**. La seule restriction est l'usage
557
+ *concurrent* : en faire un produit ou un service commercial qui se substitue à
558
+ monl-compiler. Les applications *produites* à partir de vos propres
559
+ spécifications vous appartiennent.
560
+
561
+ Le détail en français : [LICENSE-FAQ.md](LICENSE-FAQ.md).
562
+
563
+ Les rapports de bug et remarques sont bienvenus dans les *issues*.
564
+
565
+ ---
566
+
567
+ **monl-compiler 0.9.0-beta.9**