codex-django-cli 0.2.0__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 (258) hide show
  1. codex_django_cli-0.2.0/.gitignore +12 -0
  2. codex_django_cli-0.2.0/PKG-INFO +66 -0
  3. codex_django_cli-0.2.0/README.md +28 -0
  4. codex_django_cli-0.2.0/docs/changelog.md +1 -0
  5. codex_django_cli-0.2.0/docs/en/api/cli.md +21 -0
  6. codex_django_cli-0.2.0/docs/en/api/internal/cli.md +25 -0
  7. codex_django_cli-0.2.0/docs/en/architecture/cli/README.md +19 -0
  8. codex_django_cli-0.2.0/docs/en/architecture/cli/blueprints.md +153 -0
  9. codex_django_cli-0.2.0/docs/en/architecture/cli/commands.md +157 -0
  10. codex_django_cli-0.2.0/docs/en/architecture/cli/engine.md +143 -0
  11. codex_django_cli-0.2.0/docs/en/architecture/cli/entrypoints.md +148 -0
  12. codex_django_cli-0.2.0/docs/en/architecture/cli/module.md +128 -0
  13. codex_django_cli-0.2.0/docs/en/architecture/cli/project-output.md +188 -0
  14. codex_django_cli-0.2.0/docs/en/getting-started.md +68 -0
  15. codex_django_cli-0.2.0/docs/en/guides/blueprints-and-scaffolding.md +45 -0
  16. codex_django_cli-0.2.0/docs/en/guides/installation-modes.md +64 -0
  17. codex_django_cli-0.2.0/docs/en/guides/runtime-vs-cli.md +55 -0
  18. codex_django_cli-0.2.0/docs/evolution/roadmap.md +37 -0
  19. codex_django_cli-0.2.0/docs/index.md +5 -0
  20. codex_django_cli-0.2.0/docs/javascripts/mermaid.js +16 -0
  21. codex_django_cli-0.2.0/docs/ru/architecture/cli/README.md +19 -0
  22. codex_django_cli-0.2.0/docs/ru/architecture/cli/blueprints.md +153 -0
  23. codex_django_cli-0.2.0/docs/ru/architecture/cli/commands.md +156 -0
  24. codex_django_cli-0.2.0/docs/ru/architecture/cli/engine.md +143 -0
  25. codex_django_cli-0.2.0/docs/ru/architecture/cli/entrypoints.md +148 -0
  26. codex_django_cli-0.2.0/docs/ru/architecture/cli/module.md +128 -0
  27. codex_django_cli-0.2.0/docs/ru/architecture/cli/project-output.md +188 -0
  28. codex_django_cli-0.2.0/docs/ru/getting-started.md +68 -0
  29. codex_django_cli-0.2.0/docs/ru/guides/blueprints-and-scaffolding.md +45 -0
  30. codex_django_cli-0.2.0/docs/ru/guides/installation-modes.md +64 -0
  31. codex_django_cli-0.2.0/docs/ru/guides/runtime-vs-cli.md +55 -0
  32. codex_django_cli-0.2.0/docs/stylesheets/extra.css +13 -0
  33. codex_django_cli-0.2.0/mkdocs.yml +64 -0
  34. codex_django_cli-0.2.0/pyproject.toml +113 -0
  35. codex_django_cli-0.2.0/src/codex_django_cli/__init__.py +12 -0
  36. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/__init__.py +0 -0
  37. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/admin/__init__.py +0 -0
  38. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/apps.py.j2 +0 -0
  39. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/forms/__init__.py +0 -0
  40. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/models/__init__.py +0 -0
  41. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/modules/__init__.py +0 -0
  42. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/selector/__init__.py +0 -0
  43. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/services/__init__.py +0 -0
  44. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/tests/__init__.py +0 -0
  45. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/translations.py.j2 +0 -0
  46. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/urls.py.j2 +0 -0
  47. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/views/__init__.py +0 -0
  48. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/.dockerignore.j2 +24 -0
  49. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/.env.example.j2 +64 -0
  50. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/backend/Dockerfile.j2 +36 -0
  51. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/backend/entrypoint.sh.j2 +20 -0
  52. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/Dockerfile.local.j2 +14 -0
  53. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/nginx-main.conf.j2 +67 -0
  54. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/site-local.conf.j2 +66 -0
  55. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/worker/Dockerfile.j2 +25 -0
  56. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/base.Dockerfile.j2 +38 -0
  57. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/django.Dockerfile.j2 +27 -0
  58. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/entrypoint.sh.j2 +19 -0
  59. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.apps.yml.j2 +41 -0
  60. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.infra.yml.j2 +80 -0
  61. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.local.apps.yml.j2 +41 -0
  62. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.local.infra.yml.j2 +94 -0
  63. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.test.yml.j2 +63 -0
  64. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/Dockerfile.j2 +12 -0
  65. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/conf.d/default.conf.j2 +68 -0
  66. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/site.conf.template.j2 +81 -0
  67. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/ci-develop.yml.j2 +42 -0
  68. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/ci-main.yml.j2 +165 -0
  69. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/deploy-cluster.yml.j2 +112 -0
  70. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.prod.yml.j2 +118 -0
  71. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.test.yml.j2 +86 -0
  72. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.yml.j2 +151 -0
  73. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/nginx/Dockerfile.j2 +18 -0
  74. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/nginx/site.conf.template.j2 +168 -0
  75. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/ci-develop.yml.j2 +42 -0
  76. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/ci-main.yml.j2 +113 -0
  77. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/deploy-production-tag.yml.j2 +211 -0
  78. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/__init__.py.j2 +0 -0
  79. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/admin.py.j2 +52 -0
  80. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/apps.py.j2 +8 -0
  81. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/models.py.j2 +142 -0
  82. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/selectors.py.j2 +102 -0
  83. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/urls.py.j2 +12 -0
  84. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/views.py.j2 +174 -0
  85. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/wiki.md.j2 +142 -0
  86. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/cabinet/templates/cabinet/booking/my_bookings.html +249 -0
  87. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/cabinet/views/booking.py.j2 +70 -0
  88. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/system/admin/booking_settings.py.j2 +31 -0
  89. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/system/models/booking_settings.py.j2 +7 -0
  90. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/booking_page.html +137 -0
  91. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_confirm.html +143 -0
  92. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_date.html +184 -0
  93. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_service.html +78 -0
  94. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_time.html +89 -0
  95. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/adapters.py.j2 +21 -0
  96. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/my_appointments.html +58 -0
  97. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/profile.html +107 -0
  98. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings.html +106 -0
  99. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings_notifications.html +106 -0
  100. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings_privacy.html +135 -0
  101. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/views/client.py.j2 +49 -0
  102. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/system/models/user_profile.py.j2 +22 -0
  103. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/arq/client.j2 +22 -0
  104. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/models/email_content.j2 +15 -0
  105. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/selectors/email_content.j2 +23 -0
  106. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/services/notification.j2 +66 -0
  107. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/__init__.py +0 -0
  108. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/admin/__init__.py +0 -0
  109. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/apps.py.j2 +11 -0
  110. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/cabinet.py.j2 +33 -0
  111. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/forms/__init__.py +0 -0
  112. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/mock.py.j2 +110 -0
  113. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/models/__init__.py +0 -0
  114. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/modules/__init__.py +0 -0
  115. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/selector/__init__.py +3 -0
  116. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/selector/users.py.j2 +25 -0
  117. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/services/__init__.py +0 -0
  118. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/base.css +11 -0
  119. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/compiler_config.json +5 -0
  120. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/theme/tokens.css +30 -0
  121. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/js/app/cabinet.js +37 -0
  122. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/js/compiler_config.json +7 -0
  123. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/templates/cabinet/users/detail.html +91 -0
  124. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/templates/cabinet/users/index.html +97 -0
  125. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/tests/__init__.py +0 -0
  126. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/translations.py.j2 +2 -0
  127. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/urls.py.j2 +22 -0
  128. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/views/__init__.py +3 -0
  129. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/views/users.py.j2 +17 -0
  130. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/__init__.py.j2 +1 -0
  131. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/apps.py.j2 +15 -0
  132. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/asgi.py.j2 +7 -0
  133. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/logger.py.j2 +57 -0
  134. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/redis.py.j2 +4 -0
  135. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/__init__.py.j2 +4 -0
  136. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/base.py.j2 +67 -0
  137. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/dev.py.j2 +56 -0
  138. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/__init__.py.j2 +1 -0
  139. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/admin.py.j2 +72 -0
  140. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/apps.py.j2 +64 -0
  141. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/cache.py.j2 +49 -0
  142. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/codex.py.j2 +39 -0
  143. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/database.py.j2 +49 -0
  144. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/internationalization.py.j2 +43 -0
  145. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/logging.py.j2 +45 -0
  146. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/middleware.py.j2 +17 -0
  147. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/security.py.j2 +53 -0
  148. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/sitemap.py.j2 +14 -0
  149. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/static.py.j2 +36 -0
  150. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/templates.py.j2 +29 -0
  151. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/prod.py.j2 +77 -0
  152. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/test.py.j2 +40 -0
  153. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/sitemaps.py.j2 +26 -0
  154. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/urls.py.j2 +71 -0
  155. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/wsgi.py.j2 +7 -0
  156. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/__init__.py.j2 +0 -0
  157. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/admin/__init__.py +0 -0
  158. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/apps.py.j2 +8 -0
  159. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/forms/__init__.py +0 -0
  160. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/models/__init__.py +0 -0
  161. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/sitemaps.py.j2 +23 -0
  162. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/tests/__init__.py +0 -0
  163. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/translations.py.j2 +2 -0
  164. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/urls.py.j2 +8 -0
  165. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/views/__init__.py.j2 +9 -0
  166. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/manage.py.j2 +39 -0
  167. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/components.css +88 -0
  168. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/footer.css +43 -0
  169. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/header.css +76 -0
  170. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/layout.css +58 -0
  171. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/reset.css +65 -0
  172. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/tokens.css +45 -0
  173. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base.css +31 -0
  174. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/compiler_config.json +10 -0
  175. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/contacts.css +42 -0
  176. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/errors.css +11 -0
  177. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/home.css +120 -0
  178. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/app/main.js +8 -0
  179. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/vendor/alpine.min.js +9 -0
  180. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/vendor/htmx.min.js +9 -0
  181. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/manifest.json +15 -0
  182. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/robots.txt +4 -0
  183. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/__init__.py.j2 +1 -0
  184. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/__init__.py.j2 +15 -0
  185. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/seo.py.j2 +28 -0
  186. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/settings.py.j2 +65 -0
  187. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/static.py.j2 +18 -0
  188. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/apps.py.j2 +9 -0
  189. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/forms/__init__.py.j2 +1 -0
  190. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/__init__.py +0 -0
  191. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/__init__.py +0 -0
  192. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/dev.py.j2 +5 -0
  193. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/menu.py.j2 +81 -0
  194. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/runserver_plus.py.j2 +46 -0
  195. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/update_all_content.py.j2 +17 -0
  196. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/update_site_settings.py.j2 +80 -0
  197. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/__init__.py.j2 +15 -0
  198. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/seo.py.j2 +37 -0
  199. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/settings.py.j2 +31 -0
  200. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/static.py.j2 +13 -0
  201. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/services/__init__.py.j2 +1 -0
  202. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/urls.py.j2 +7 -0
  203. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/views/__init__.py.j2 +1 -0
  204. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/views/errors.py.j2 +13 -0
  205. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/base.html.j2 +53 -0
  206. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/400.html +9 -0
  207. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/403.html +9 -0
  208. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/404.html +16 -0
  209. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/500.html +16 -0
  210. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_analytics_body.html +2 -0
  211. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_analytics_head.html +2 -0
  212. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_cookie_consent.html +2 -0
  213. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_critical_css.html +38 -0
  214. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_footer.html +57 -0
  215. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_header.html.j2 +75 -0
  216. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_hreflang_tags.html.j2 +11 -0
  217. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_meta.html +44 -0
  218. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/contacts.html +38 -0
  219. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/home.html +128 -0
  220. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/home.html.j2 +129 -0
  221. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/sitemap.xml +16 -0
  222. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.env.example.j2 +15 -0
  223. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.github/workflows/.gitkeep +1 -0
  224. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.gitignore +38 -0
  225. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/README.md.j2 +32 -0
  226. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/docs/README.md +5 -0
  227. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/pyproject.toml.j2 +46 -0
  228. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/tools/dev/check.py.j2 +23 -0
  229. codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/tools/dev/generate_project_tree.py +15 -0
  230. codex_django_cli-0.2.0/src/codex_django_cli/commands/__init__.py +1 -0
  231. codex_django_cli-0.2.0/src/codex_django_cli/commands/add_app.py +56 -0
  232. codex_django_cli-0.2.0/src/codex_django_cli/commands/booking.py +92 -0
  233. codex_django_cli-0.2.0/src/codex_django_cli/commands/client_cabinet.py +66 -0
  234. codex_django_cli-0.2.0/src/codex_django_cli/commands/deploy.py +96 -0
  235. codex_django_cli-0.2.0/src/codex_django_cli/commands/init.py +216 -0
  236. codex_django_cli-0.2.0/src/codex_django_cli/commands/notifications.py +59 -0
  237. codex_django_cli-0.2.0/src/codex_django_cli/commands/quality.py +116 -0
  238. codex_django_cli-0.2.0/src/codex_django_cli/engine.py +113 -0
  239. codex_django_cli-0.2.0/src/codex_django_cli/main.py +470 -0
  240. codex_django_cli-0.2.0/src/codex_django_cli/prompts.py +258 -0
  241. codex_django_cli-0.2.0/src/codex_django_cli/py.typed +0 -0
  242. codex_django_cli-0.2.0/src/codex_django_cli/utils.py +25 -0
  243. codex_django_cli-0.2.0/tests/__init__.py +1 -0
  244. codex_django_cli-0.2.0/tests/conftest.py +40 -0
  245. codex_django_cli-0.2.0/tests/e2e/__init__.py +1 -0
  246. codex_django_cli-0.2.0/tests/e2e/cli/__init__.py +0 -0
  247. codex_django_cli-0.2.0/tests/e2e/cli/test_init_e2e.py +144 -0
  248. codex_django_cli-0.2.0/tests/integration/__init__.py +1 -0
  249. codex_django_cli-0.2.0/tests/integration/cli/__init__.py +0 -0
  250. codex_django_cli-0.2.0/tests/integration/cli/test_commands_integration.py +135 -0
  251. codex_django_cli-0.2.0/tests/integration/cli/test_scaffold_quality.py +58 -0
  252. codex_django_cli-0.2.0/tests/unit/__init__.py +1 -0
  253. codex_django_cli-0.2.0/tests/unit/cli/__init__.py +0 -0
  254. codex_django_cli-0.2.0/tests/unit/cli/test_commands.py +226 -0
  255. codex_django_cli-0.2.0/tests/unit/cli/test_engine.py +143 -0
  256. codex_django_cli-0.2.0/tests/unit/cli/test_main.py +699 -0
  257. codex_django_cli-0.2.0/tests/unit/cli/test_more_commands.py +219 -0
  258. codex_django_cli-0.2.0/tests/unit/cli/test_prompts.py +194 -0
@@ -0,0 +1,12 @@
1
+ .venv/
2
+ .mypy_cache/
3
+ .pytest_cache/
4
+ .ruff_cache/
5
+ .uv-cache/
6
+ build/
7
+ dist/
8
+ site/
9
+ coverage.xml
10
+ .coverage
11
+ __pycache__/
12
+ *.py[cod]
@@ -0,0 +1,66 @@
1
+ Metadata-Version: 2.4
2
+ Name: codex-django-cli
3
+ Version: 0.2.0
4
+ Summary: Standalone CLI and blueprint scaffolding package for codex-django
5
+ Project-URL: Homepage, https://github.com/codexdlc/codex-django-cli
6
+ Project-URL: Documentation, https://codexdlc.github.io/codex-django-cli/
7
+ Project-URL: Repository, https://github.com/codexdlc/codex-django-cli
8
+ Project-URL: Issues, https://github.com/codexdlc/codex-django/issues
9
+ Author: CodexDLC
10
+ License: Apache-2.0
11
+ Keywords: blueprints,cli,codex,django,scaffold
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: Apache Software License
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Classifier: Programming Language :: Python :: 3.13
17
+ Requires-Python: >=3.12
18
+ Requires-Dist: jinja2>=3.1
19
+ Requires-Dist: questionary>=2.0.0
20
+ Requires-Dist: rich>=13.0
21
+ Provides-Extra: dev
22
+ Requires-Dist: bandit>=1.7; extra == 'dev'
23
+ Requires-Dist: codex-core<0.3.0,>=0.2.2; extra == 'dev'
24
+ Requires-Dist: detect-secrets>=1.5; extra == 'dev'
25
+ Requires-Dist: mypy>=1.10; extra == 'dev'
26
+ Requires-Dist: pip-audit>=2.7; extra == 'dev'
27
+ Requires-Dist: pre-commit>=3.0; extra == 'dev'
28
+ Requires-Dist: pytest-cov; extra == 'dev'
29
+ Requires-Dist: pytest>=8.0; extra == 'dev'
30
+ Requires-Dist: ruff>=0.4; extra == 'dev'
31
+ Provides-Extra: docs
32
+ Requires-Dist: mike>=2.0; extra == 'docs'
33
+ Requires-Dist: mkdocs-include-markdown-plugin; extra == 'docs'
34
+ Requires-Dist: mkdocs-material>=9.0; extra == 'docs'
35
+ Requires-Dist: mkdocs>=1.5; extra == 'docs'
36
+ Requires-Dist: mkdocstrings[python]>=0.24; extra == 'docs'
37
+ Description-Content-Type: text/markdown
38
+
39
+ # codex-django-cli
40
+
41
+ Standalone CLI package for `codex-django`.
42
+
43
+ It owns the interactive `codex-django` command, blueprint rendering engine, scaffold commands, and CLI-focused tests/docs. The generated project code may still import `codex_django.*` runtime modules from `codex-django`; that compatibility is intentional.
44
+
45
+ ## Install
46
+
47
+ ```bash
48
+ pip install codex-django-cli
49
+ ```
50
+
51
+ For local development alongside the sibling runtime repository:
52
+
53
+ ```bash
54
+ uv sync --extra dev
55
+ uv run pytest tests/unit/cli tests/integration/cli
56
+ uv build --no-sources
57
+ ```
58
+
59
+ ## Scope
60
+
61
+ - `codex_django_cli.main`: entrypoint and menu flow
62
+ - `codex_django_cli.engine`: blueprint rendering and file generation
63
+ - `codex_django_cli.commands.*`: scaffold/init/deploy helpers
64
+ - `codex_django_cli.blueprints`: packaged templates, static files, and scaffold assets
65
+
66
+ The runtime library remains in `codex-django`.
@@ -0,0 +1,28 @@
1
+ # codex-django-cli
2
+
3
+ Standalone CLI package for `codex-django`.
4
+
5
+ It owns the interactive `codex-django` command, blueprint rendering engine, scaffold commands, and CLI-focused tests/docs. The generated project code may still import `codex_django.*` runtime modules from `codex-django`; that compatibility is intentional.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ pip install codex-django-cli
11
+ ```
12
+
13
+ For local development alongside the sibling runtime repository:
14
+
15
+ ```bash
16
+ uv sync --extra dev
17
+ uv run pytest tests/unit/cli tests/integration/cli
18
+ uv build --no-sources
19
+ ```
20
+
21
+ ## Scope
22
+
23
+ - `codex_django_cli.main`: entrypoint and menu flow
24
+ - `codex_django_cli.engine`: blueprint rendering and file generation
25
+ - `codex_django_cli.commands.*`: scaffold/init/deploy helpers
26
+ - `codex_django_cli.blueprints`: packaged templates, static files, and scaffold assets
27
+
28
+ The runtime library remains in `codex-django`.
@@ -0,0 +1 @@
1
+ {% include "../CHANGELOG.md" %}
@@ -0,0 +1,21 @@
1
+ <!-- DOC_TYPE: API -->
2
+
3
+ # CLI Public API
4
+
5
+ The CLI package provides the interactive `codex-django` entrypoint plus the blueprint-rendering machinery used by scaffold commands.
6
+
7
+ ## Main entrypoints
8
+
9
+ - `codex_django_cli.main` for launching the interactive CLI.
10
+ - `codex_django_cli.engine.CLIEngine` for lower-level template rendering and scaffold generation.
11
+ - compatibility imports from `codex_django.cli.*` remain available via shim modules in `codex-django`.
12
+
13
+ ## Example
14
+
15
+ ```python
16
+ from codex_django_cli.main import main
17
+
18
+ raise SystemExit(main())
19
+ ```
20
+
21
+ For prompt helpers, command handlers, and the lower-level scaffold engine modules, open [CLI internals](internal/cli.md).
@@ -0,0 +1,25 @@
1
+ <!-- DOC_TYPE: API -->
2
+
3
+ # CLI Internal Modules
4
+
5
+ ::: codex_django_cli.main
6
+
7
+ ::: codex_django_cli.engine
8
+
9
+ ::: codex_django_cli.prompts
10
+
11
+ ::: codex_django_cli.utils
12
+
13
+ ::: codex_django_cli.commands.add_app
14
+
15
+ ::: codex_django_cli.commands.booking
16
+
17
+ ::: codex_django_cli.commands.client_cabinet
18
+
19
+ ::: codex_django_cli.commands.deploy
20
+
21
+ ::: codex_django_cli.commands.init
22
+
23
+ ::: codex_django_cli.commands.notifications
24
+
25
+ ::: codex_django_cli.commands.quality
@@ -0,0 +1,19 @@
1
+ <!-- DOC_TYPE: INDEX -->
2
+
3
+ # CLI Architecture
4
+
5
+ ## Pages
6
+
7
+ - [CLI Module](./module.md)
8
+ - [Entrypoints](./entrypoints.md)
9
+ - [Blueprints](./blueprints.md)
10
+ - [Engine](./engine.md)
11
+ - [Commands](./commands.md)
12
+ - [Project Output](./project-output.md)
13
+
14
+ ## Scope
15
+
16
+ - How the CLI is entered
17
+ - How it renders blueprints
18
+ - How commands orchestrate scaffolding
19
+ - What structure appears in generated projects
@@ -0,0 +1,153 @@
1
+ <!-- DOC_TYPE: CONCEPT -->
2
+
3
+ # CLI Blueprints
4
+
5
+ ## Purpose
6
+
7
+ The `blueprints/` directory is the generation knowledge base of the CLI.
8
+ If `CLIEngine` is the renderer, blueprints are the architectural source material it renders.
9
+
10
+ They define not only file contents, but also the intended output topology of a generated project.
11
+ Because of that, blueprints are closer to a declarative construction system than to a simple templates folder.
12
+
13
+ ## Why Blueprints Matter
14
+
15
+ The most important thing about the CLI is not the menu itself.
16
+ It is the fact that project structure, feature additions, and deployment files are all driven from reusable blueprint trees.
17
+
18
+ This means the CLI architecture is fundamentally template-centric:
19
+
20
+ - commands choose a blueprint
21
+ - the engine renders it with context
22
+ - the generated tree becomes part of the target project
23
+
24
+ So understanding the CLI means understanding how blueprints are partitioned.
25
+
26
+ ## Top-Level Blueprint Families
27
+
28
+ The current blueprint space is split into five main families:
29
+
30
+ - `repo`
31
+ - `project`
32
+ - `apps`
33
+ - `features`
34
+ - `deploy`
35
+
36
+ These are not arbitrary folders.
37
+ They correspond to different layers of output responsibility.
38
+
39
+ ### `repo`
40
+
41
+ `repo/` contains repository-level scaffolding.
42
+ This is the outer shell around a generated project and includes files such as:
43
+
44
+ - `pyproject.toml`
45
+ - `README.md`
46
+ - `.env.example`
47
+ - `.gitignore`
48
+ - repo-level docs and tools
49
+
50
+ This layer answers:
51
+ "What files belong to the repository as a whole, regardless of the internal Django app tree?"
52
+
53
+ ### `project`
54
+
55
+ `project/` contains the base Django project scaffold that lands in `src/<project_name>/`.
56
+ This includes the initial structure for:
57
+
58
+ - `core`
59
+ - `system`
60
+ - `cabinet`
61
+ - `features`
62
+ - `templates`
63
+ - `static`
64
+ - `manage.py`
65
+
66
+ This is the central blueprint family because it defines the starting runtime architecture of a fresh codex-django project.
67
+
68
+ ### `apps`
69
+
70
+ `apps/` contains reusable blueprints for adding a standard feature app to an existing project.
71
+ The current default app blueprint creates a `features/<app_name>/` structure with the expected internal layout for admin, forms, models, services, templates, tests, and views.
72
+
73
+ This layer answers:
74
+ "How do we add one regular app in the canonical codex-django shape?"
75
+
76
+ ### `features`
77
+
78
+ `features/` contains advanced or compound feature scaffolds such as:
79
+
80
+ - `booking`
81
+ - `client_cabinet`
82
+ - `notifications`
83
+
84
+ These blueprints are more architectural than `apps/default` because they often modify several target areas at once.
85
+
86
+ For example:
87
+
88
+ - booking touches `booking/`, `system/`, `cabinet/`, and public templates
89
+ - notifications splits output between a feature area and ARQ infrastructure
90
+ - client cabinet injects both cabinet and system-side code
91
+
92
+ So `features/` is the layer where the CLI expresses cross-cutting feature bundles rather than isolated apps.
93
+
94
+ ### `deploy`
95
+
96
+ `deploy/` contains deployment-specific scaffolding such as Docker files.
97
+ This layer is intentionally separated from `project/` because deployment output has a different lifecycle than runtime application code.
98
+
99
+ It answers:
100
+ "What operational infrastructure should be generated around the project?"
101
+
102
+ ## Architectural Pattern
103
+
104
+ The blueprint hierarchy reveals an implicit generation model:
105
+
106
+ 1. generate repository shell
107
+ 2. generate base project
108
+ 3. optionally add cross-cutting features
109
+ 4. optionally add standard apps
110
+ 5. optionally generate deployment support
111
+
112
+ This is not just a file-copy pipeline.
113
+ It is a staged project-construction model.
114
+
115
+ ## Jinja And Structural Semantics
116
+
117
+ Blueprints are not only raw files:
118
+
119
+ - `.j2` files are rendered with context
120
+ - non-template files are copied as-is
121
+ - folder placement encodes where generated code should live
122
+
123
+ This means the blueprint tree carries two kinds of meaning at once:
124
+
125
+ - content semantics: what each file should contain
126
+ - placement semantics: where in the output architecture it belongs
127
+
128
+ ## Runtime Flow
129
+
130
+ ```mermaid
131
+ flowchart TD
132
+ A["CLI command"] --> B["select blueprint family"]
133
+ B --> C["CLIEngine.scaffold(...)"]
134
+ C --> D["walk blueprint tree"]
135
+ D --> E["render .j2 files with context"]
136
+ D --> F["copy static files"]
137
+ E --> G["target project structure"]
138
+ F --> G
139
+ ```
140
+
141
+ ## Role In The CLI
142
+
143
+ Blueprints are the most durable part of the CLI architecture.
144
+ Menus, commands, and prompts may evolve, but the blueprint families define the long-term contract of what the tool generates.
145
+
146
+ That is why blueprint documentation is important even if the CLI later becomes its own package:
147
+ the blueprints encode the actual shape of the generated ecosystem.
148
+
149
+ ## See Also
150
+
151
+ - [CLI module](./module.md)
152
+ - [cabinet overview](../cabinet.md)
153
+ - [booking overview](../booking.md)
@@ -0,0 +1,157 @@
1
+ <!-- DOC_TYPE: CONCEPT -->
2
+
3
+ # CLI Commands
4
+
5
+ ## Purpose
6
+
7
+ The `commands/` package is the orchestration layer of the CLI.
8
+ If `main.py` routes user intent and `CLIEngine` executes rendering, commands translate specific user actions into concrete scaffold operations.
9
+
10
+ They are not low-level file generators.
11
+ They are scenario handlers.
12
+
13
+ This means each command answers a high-level question such as:
14
+
15
+ - how to initialize a new project
16
+ - how to add a standard app
17
+ - how to inject a booking bundle
18
+ - how to scaffold notification infrastructure
19
+ - how to generate deployment files
20
+
21
+ ## Architectural Role
22
+
23
+ Commands sit between two different worlds:
24
+
25
+ - the input world of menus, arguments, and user intent
26
+ - the output world of blueprints, generated files, and post-generation instructions
27
+
28
+ Their role is to:
29
+
30
+ - choose the right blueprint subtree
31
+ - assemble the rendering context
32
+ - decide target paths
33
+ - coordinate multi-step scaffold flows
34
+ - present next steps to the developer
35
+
36
+ So commands are not just wrappers around `engine.scaffold(...)`.
37
+ They encode the semantic meaning of each CLI action.
38
+
39
+ ## Command Families
40
+
41
+ The current commands already form several architectural groups.
42
+
43
+ ### Project Initialization
44
+
45
+ `init.py` is the highest-level scaffold operation.
46
+ It creates the main project skeleton and may also include optional feature bundles such as:
47
+
48
+ - cabinet
49
+ - booking
50
+ - notifications
51
+
52
+ This command is special because it coordinates several blueprint families in sequence:
53
+
54
+ - `repo`
55
+ - `deploy`
56
+ - `project`
57
+ - optional feature blueprints
58
+
59
+ So `init` is not one scaffold action, but a project-construction workflow.
60
+
61
+ ### Standard App Scaffolding
62
+
63
+ `add_app.py` handles the creation of a regular feature app inside `features/<app_name>/`.
64
+ It uses the default app blueprint and assumes the generated project already exists.
65
+
66
+ This command is the canonical "grow the project by one standard app" path.
67
+
68
+ ### Feature Bundle Commands
69
+
70
+ Some commands scaffold more than one isolated folder because the feature they represent cuts across several layers of the generated project.
71
+
72
+ Examples:
73
+
74
+ - `booking.py`
75
+ - `client_cabinet.py`
76
+ - `notifications.py`
77
+
78
+ These commands operate more like feature installers than like simple file generators.
79
+
80
+ For example:
81
+
82
+ - booking touches booking code, system settings, cabinet integration, and public templates
83
+ - notifications splits output between feature code and ARQ infrastructure
84
+ - client cabinet injects cabinet-facing code and system-side profile models
85
+
86
+ This is an important distinction:
87
+ the CLI supports both app scaffolding and architectural feature injection.
88
+
89
+ ### Quality Commands
90
+
91
+ `quality.py` is not about application structure.
92
+ It generates developer workflow support such as `.pre-commit-config.yaml` and related baseline files.
93
+
94
+ This means the commands package does not only build runtime code.
95
+ It also scaffolds developer tooling around the project.
96
+
97
+ ### Deployment Commands
98
+
99
+ `deploy.py` handles operational infrastructure generation, currently around Docker-based deployment files.
100
+ Like quality tooling, this command sits outside the main runtime app tree while still being part of the generated project ecosystem.
101
+
102
+ ## Common Command Pattern
103
+
104
+ Despite their differences, the commands share one common architectural pattern:
105
+
106
+ 1. receive intent and parameters
107
+ 2. compute destination paths
108
+ 3. assemble context
109
+ 4. call `CLIEngine`
110
+ 5. print actionable next steps
111
+
112
+ This gives the CLI a consistent mental model.
113
+ Each command defines what is being added, but the flow of command execution stays stable.
114
+
115
+ ## Runtime Flow
116
+
117
+ ```mermaid
118
+ flowchart TD
119
+ A["User intent from menu or args"] --> B["command handler"]
120
+ B --> C["resolve target path"]
121
+ B --> D["build render context"]
122
+ B --> E["choose blueprint subtree"]
123
+ C --> F["CLIEngine"]
124
+ D --> F
125
+ E --> F
126
+ F --> G["generated project files"]
127
+ B --> H["next-step instructions"]
128
+ ```
129
+
130
+ ## Why Commands Need Documentation
131
+
132
+ Without command-level documentation, CLI can look like a flat list of actions.
133
+ But in reality the commands encode the supported project-evolution model:
134
+
135
+ - initialize a base project
136
+ - expand it with standard apps
137
+ - inject bigger architectural features
138
+ - add project tooling
139
+ - add deployment support
140
+
141
+ So documenting commands helps explain not only what the CLI can do, but how the repository expects projects to grow over time.
142
+
143
+ ## Relationship To Other CLI Layers
144
+
145
+ - `main.py` chooses which command handler should run
146
+ - `prompts.py` provides the interactive inputs that feed commands
147
+ - `CLIEngine` performs the actual file generation requested by commands
148
+ - `blueprints/` provides the structural source material consumed by commands
149
+
150
+ Commands are therefore the semantic center of the CLI:
151
+ they interpret intent and convert it into generation work.
152
+
153
+ ## See Also
154
+
155
+ - [CLI module](./module.md)
156
+ - [CLI engine](./engine.md)
157
+ - [CLI blueprints](./blueprints.md)
@@ -0,0 +1,143 @@
1
+ <!-- DOC_TYPE: CONCEPT -->
2
+
3
+ # CLI Engine
4
+
5
+ ## Purpose
6
+
7
+ `CLIEngine` is the execution core of the CLI scaffolding system.
8
+ If commands decide what should be generated, `CLIEngine` decides how that generation actually happens on disk.
9
+
10
+ Its responsibility is narrow but central:
11
+
12
+ - locate blueprint trees
13
+ - render Jinja templates
14
+ - copy non-template assets
15
+ - materialize the generated structure into a target directory
16
+
17
+ This makes it the operational bridge between abstract blueprint intent and concrete project files.
18
+
19
+ ## Architectural Role
20
+
21
+ The engine is intentionally separated from:
22
+
23
+ - interactive prompts
24
+ - command selection
25
+ - feature-specific business decisions
26
+
27
+ That separation matters because it keeps the generation mechanism stable even as menus, commands, and blueprint families evolve.
28
+
29
+ In other words:
30
+
31
+ - prompts collect decisions
32
+ - commands assemble context and choose blueprints
33
+ - the engine performs rendering and file emission
34
+
35
+ This is a classic execution-core pattern.
36
+
37
+ ## Main Responsibilities
38
+
39
+ ### Blueprint Resolution
40
+
41
+ The engine treats blueprints as a named tree rooted in `cli/blueprints`.
42
+ Every scaffold operation begins by resolving a blueprint family such as:
43
+
44
+ - `repo`
45
+ - `project`
46
+ - `apps/default`
47
+ - `features/booking`
48
+ - `deploy`
49
+
50
+ This makes the engine path-driven rather than command-driven.
51
+ Commands remain thin because the engine can operate on any blueprint subtree as long as the path and context are valid.
52
+
53
+ ### Template Rendering
54
+
55
+ Files ending in `.j2` are rendered through a Jinja2 environment.
56
+ The engine loads them relative to the blueprint root and injects the context provided by the command handler.
57
+
58
+ This means the engine is not tied to specific variables like `project_name` or `app_name`.
59
+ It simply renders whatever the selected blueprint expects.
60
+
61
+ ### Static File Copying
62
+
63
+ Files that are not templates are copied as-is.
64
+ This is important because generated projects need both:
65
+
66
+ - dynamic files derived from context
67
+ - static assets and support files that should remain unchanged
68
+
69
+ So the engine acts as a mixed-mode emitter rather than a pure template renderer.
70
+
71
+ ### Directory Materialization
72
+
73
+ The engine walks the source blueprint tree recursively and reproduces its structure under the target directory.
74
+ That means folder layout in the blueprint tree is treated as part of the contract of generation, not as incidental organization.
75
+
76
+ The CLI therefore preserves architectural placement through filesystem structure.
77
+
78
+ ### Overwrite Policy
79
+
80
+ The engine also enforces a simple overwrite policy:
81
+
82
+ - if a destination file exists and overwrite is disabled, it is skipped
83
+ - if overwrite is enabled, it is replaced
84
+
85
+ This gives commands a predictable and reusable file-conflict behavior without implementing that logic repeatedly in each handler.
86
+
87
+ ## Why The Engine Matters
88
+
89
+ Without `CLIEngine`, every command would need to know how to:
90
+
91
+ - walk directories
92
+ - detect templates
93
+ - render files
94
+ - copy assets
95
+ - manage destination paths
96
+
97
+ By isolating this into one class, the CLI architecture gains:
98
+
99
+ - less duplication
100
+ - one consistent rendering model
101
+ - one consistent scaffold policy
102
+ - easier future extraction into a standalone CLI package
103
+
104
+ ## Runtime Flow
105
+
106
+ ```mermaid
107
+ flowchart TD
108
+ A["Command handler"] --> B["prepare context"]
109
+ B --> C["CLIEngine.scaffold(...)"]
110
+ C --> D["resolve blueprint path"]
111
+ D --> E["walk files recursively"]
112
+ E --> F["render .j2 template"]
113
+ E --> G["copy static file"]
114
+ F --> H["write target file"]
115
+ G --> H
116
+ ```
117
+
118
+ ## Design Tradeoffs
119
+
120
+ The engine is deliberately simple.
121
+ It does not currently try to become:
122
+
123
+ - a dependency graph manager
124
+ - a merge-aware patcher
125
+ - a semantic project migration tool
126
+
127
+ Instead, it focuses on reliable tree-based generation.
128
+ That simplicity is a strength for scaffolding, because commands can layer more specialized behavior above it when needed.
129
+
130
+ ## Relationship To Other CLI Layers
131
+
132
+ - `main.py` decides when scaffolding should happen
133
+ - `prompts.py` helps collect the user choices that feed command context
134
+ - `commands/` decides which blueprint subtree to render and which context to pass
135
+ - `blueprints/` contains the structural source material the engine consumes
136
+
137
+ So the engine sits exactly in the middle of the CLI architecture:
138
+ above raw files, below command semantics.
139
+
140
+ ## See Also
141
+
142
+ - [CLI module](./module.md)
143
+ - [CLI blueprints](./blueprints.md)