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.
- codex_django_cli-0.2.0/.gitignore +12 -0
- codex_django_cli-0.2.0/PKG-INFO +66 -0
- codex_django_cli-0.2.0/README.md +28 -0
- codex_django_cli-0.2.0/docs/changelog.md +1 -0
- codex_django_cli-0.2.0/docs/en/api/cli.md +21 -0
- codex_django_cli-0.2.0/docs/en/api/internal/cli.md +25 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/README.md +19 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/blueprints.md +153 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/commands.md +157 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/engine.md +143 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/entrypoints.md +148 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/module.md +128 -0
- codex_django_cli-0.2.0/docs/en/architecture/cli/project-output.md +188 -0
- codex_django_cli-0.2.0/docs/en/getting-started.md +68 -0
- codex_django_cli-0.2.0/docs/en/guides/blueprints-and-scaffolding.md +45 -0
- codex_django_cli-0.2.0/docs/en/guides/installation-modes.md +64 -0
- codex_django_cli-0.2.0/docs/en/guides/runtime-vs-cli.md +55 -0
- codex_django_cli-0.2.0/docs/evolution/roadmap.md +37 -0
- codex_django_cli-0.2.0/docs/index.md +5 -0
- codex_django_cli-0.2.0/docs/javascripts/mermaid.js +16 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/README.md +19 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/blueprints.md +153 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/commands.md +156 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/engine.md +143 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/entrypoints.md +148 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/module.md +128 -0
- codex_django_cli-0.2.0/docs/ru/architecture/cli/project-output.md +188 -0
- codex_django_cli-0.2.0/docs/ru/getting-started.md +68 -0
- codex_django_cli-0.2.0/docs/ru/guides/blueprints-and-scaffolding.md +45 -0
- codex_django_cli-0.2.0/docs/ru/guides/installation-modes.md +64 -0
- codex_django_cli-0.2.0/docs/ru/guides/runtime-vs-cli.md +55 -0
- codex_django_cli-0.2.0/docs/stylesheets/extra.css +13 -0
- codex_django_cli-0.2.0/mkdocs.yml +64 -0
- codex_django_cli-0.2.0/pyproject.toml +113 -0
- codex_django_cli-0.2.0/src/codex_django_cli/__init__.py +12 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/admin/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/apps.py.j2 +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/forms/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/models/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/modules/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/selector/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/services/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/tests/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/translations.py.j2 +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/urls.py.j2 +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/apps/default/views/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/.dockerignore.j2 +24 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/.env.example.j2 +64 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/backend/Dockerfile.j2 +36 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/backend/entrypoint.sh.j2 +20 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/Dockerfile.local.j2 +14 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/nginx-main.conf.j2 +67 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/nginx/site-local.conf.j2 +66 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/shared/worker/Dockerfile.j2 +25 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/base.Dockerfile.j2 +38 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/django.Dockerfile.j2 +27 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker/entrypoint.sh.j2 +19 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.apps.yml.j2 +41 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.infra.yml.j2 +80 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.local.apps.yml.j2 +41 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.local.infra.yml.j2 +94 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/docker-compose.test.yml.j2 +63 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/Dockerfile.j2 +12 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/conf.d/default.conf.j2 +68 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack/nginx/site.conf.template.j2 +81 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/ci-develop.yml.j2 +42 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/ci-main.yml.j2 +165 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/stack_workflows/deploy-cluster.yml.j2 +112 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.prod.yml.j2 +118 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.test.yml.j2 +86 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/docker-compose.yml.j2 +151 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/nginx/Dockerfile.j2 +18 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone/nginx/site.conf.template.j2 +168 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/ci-develop.yml.j2 +42 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/ci-main.yml.j2 +113 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/deploy/standalone_workflows/deploy-production-tag.yml.j2 +211 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/__init__.py.j2 +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/admin.py.j2 +52 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/apps.py.j2 +8 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/models.py.j2 +142 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/selectors.py.j2 +102 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/urls.py.j2 +12 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/views.py.j2 +174 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/booking/wiki.md.j2 +142 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/cabinet/templates/cabinet/booking/my_bookings.html +249 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/cabinet/views/booking.py.j2 +70 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/system/admin/booking_settings.py.j2 +31 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/system/models/booking_settings.py.j2 +7 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/booking_page.html +137 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_confirm.html +143 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_date.html +184 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_service.html +78 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/booking/templates/booking/partials/step_time.html +89 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/adapters.py.j2 +21 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/my_appointments.html +58 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/profile.html +107 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings.html +106 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings_notifications.html +106 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/templates/cabinet/client/settings_privacy.html +135 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/cabinet/views/client.py.j2 +49 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/client_cabinet/system/models/user_profile.py.j2 +22 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/arq/client.j2 +22 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/models/email_content.j2 +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/selectors/email_content.j2 +23 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/features/notifications/feature/services/notification.j2 +66 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/admin/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/apps.py.j2 +11 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/cabinet.py.j2 +33 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/forms/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/mock.py.j2 +110 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/models/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/modules/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/selector/__init__.py +3 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/selector/users.py.j2 +25 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/services/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/base.css +11 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/compiler_config.json +5 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/css/theme/tokens.css +30 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/js/app/cabinet.js +37 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/static/cabinet/js/compiler_config.json +7 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/templates/cabinet/users/detail.html +91 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/templates/cabinet/users/index.html +97 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/tests/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/translations.py.j2 +2 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/urls.py.j2 +22 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/views/__init__.py +3 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/cabinet/views/users.py.j2 +17 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/apps.py.j2 +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/asgi.py.j2 +7 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/logger.py.j2 +57 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/redis.py.j2 +4 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/__init__.py.j2 +4 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/base.py.j2 +67 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/dev.py.j2 +56 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/admin.py.j2 +72 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/apps.py.j2 +64 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/cache.py.j2 +49 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/codex.py.j2 +39 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/database.py.j2 +49 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/internationalization.py.j2 +43 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/logging.py.j2 +45 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/middleware.py.j2 +17 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/security.py.j2 +53 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/sitemap.py.j2 +14 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/static.py.j2 +36 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/modules/templates.py.j2 +29 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/prod.py.j2 +77 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/settings/test.py.j2 +40 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/sitemaps.py.j2 +26 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/urls.py.j2 +71 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/core/wsgi.py.j2 +7 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/__init__.py.j2 +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/admin/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/apps.py.j2 +8 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/forms/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/models/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/sitemaps.py.j2 +23 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/tests/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/translations.py.j2 +2 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/urls.py.j2 +8 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/features/main/views/__init__.py.j2 +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/manage.py.j2 +39 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/components.css +88 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/footer.css +43 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/header.css +76 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/layout.css +58 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/reset.css +65 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base/tokens.css +45 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/base.css +31 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/compiler_config.json +10 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/contacts.css +42 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/errors.css +11 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/css/pages/home.css +120 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/app/main.js +8 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/vendor/alpine.min.js +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/js/vendor/htmx.min.js +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/manifest.json +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/static/robots.txt +4 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/__init__.py.j2 +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/seo.py.j2 +28 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/settings.py.j2 +65 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/admin/static.py.j2 +18 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/apps.py.j2 +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/forms/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/__init__.py +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/dev.py.j2 +5 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/menu.py.j2 +81 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/runserver_plus.py.j2 +46 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/update_all_content.py.j2 +17 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/management/commands/update_site_settings.py.j2 +80 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/__init__.py.j2 +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/seo.py.j2 +37 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/settings.py.j2 +31 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/models/static.py.j2 +13 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/services/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/urls.py.j2 +7 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/views/__init__.py.j2 +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/system/views/errors.py.j2 +13 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/base.html.j2 +53 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/400.html +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/403.html +9 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/404.html +16 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/errors/500.html +16 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_analytics_body.html +2 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_analytics_head.html +2 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_cookie_consent.html +2 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_critical_css.html +38 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_footer.html +57 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_header.html.j2 +75 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_hreflang_tags.html.j2 +11 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/includes/_meta.html +44 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/contacts.html +38 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/home.html +128 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/main/home.html.j2 +129 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/project/templates/sitemap.xml +16 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.env.example.j2 +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.github/workflows/.gitkeep +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/.gitignore +38 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/README.md.j2 +32 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/docs/README.md +5 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/pyproject.toml.j2 +46 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/tools/dev/check.py.j2 +23 -0
- codex_django_cli-0.2.0/src/codex_django_cli/blueprints/repo/tools/dev/generate_project_tree.py +15 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/__init__.py +1 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/add_app.py +56 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/booking.py +92 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/client_cabinet.py +66 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/deploy.py +96 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/init.py +216 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/notifications.py +59 -0
- codex_django_cli-0.2.0/src/codex_django_cli/commands/quality.py +116 -0
- codex_django_cli-0.2.0/src/codex_django_cli/engine.py +113 -0
- codex_django_cli-0.2.0/src/codex_django_cli/main.py +470 -0
- codex_django_cli-0.2.0/src/codex_django_cli/prompts.py +258 -0
- codex_django_cli-0.2.0/src/codex_django_cli/py.typed +0 -0
- codex_django_cli-0.2.0/src/codex_django_cli/utils.py +25 -0
- codex_django_cli-0.2.0/tests/__init__.py +1 -0
- codex_django_cli-0.2.0/tests/conftest.py +40 -0
- codex_django_cli-0.2.0/tests/e2e/__init__.py +1 -0
- codex_django_cli-0.2.0/tests/e2e/cli/__init__.py +0 -0
- codex_django_cli-0.2.0/tests/e2e/cli/test_init_e2e.py +144 -0
- codex_django_cli-0.2.0/tests/integration/__init__.py +1 -0
- codex_django_cli-0.2.0/tests/integration/cli/__init__.py +0 -0
- codex_django_cli-0.2.0/tests/integration/cli/test_commands_integration.py +135 -0
- codex_django_cli-0.2.0/tests/integration/cli/test_scaffold_quality.py +58 -0
- codex_django_cli-0.2.0/tests/unit/__init__.py +1 -0
- codex_django_cli-0.2.0/tests/unit/cli/__init__.py +0 -0
- codex_django_cli-0.2.0/tests/unit/cli/test_commands.py +226 -0
- codex_django_cli-0.2.0/tests/unit/cli/test_engine.py +143 -0
- codex_django_cli-0.2.0/tests/unit/cli/test_main.py +699 -0
- codex_django_cli-0.2.0/tests/unit/cli/test_more_commands.py +219 -0
- codex_django_cli-0.2.0/tests/unit/cli/test_prompts.py +194 -0
|
@@ -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)
|