aegis-stack 0.2.0rc2__py3-none-any.whl
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.
- aegis/__init__.py +5 -0
- aegis/__main__.py +51 -0
- aegis/cli/__init__.py +6 -0
- aegis/cli/callbacks.py +114 -0
- aegis/cli/interactive.py +611 -0
- aegis/cli/utils.py +70 -0
- aegis/cli/validators.py +34 -0
- aegis/commands/__init__.py +6 -0
- aegis/commands/add.py +353 -0
- aegis/commands/add_service.py +332 -0
- aegis/commands/components.py +35 -0
- aegis/commands/init.py +370 -0
- aegis/commands/remove.py +227 -0
- aegis/commands/services.py +52 -0
- aegis/commands/update.py +252 -0
- aegis/commands/version.py +12 -0
- aegis/config/__init__.py +1 -0
- aegis/config/shared_files.py +136 -0
- aegis/core/CLAUDE.md +377 -0
- aegis/core/__init__.py +6 -0
- aegis/core/component_files.py +228 -0
- aegis/core/component_utils.py +220 -0
- aegis/core/components.py +127 -0
- aegis/core/copier_manager.py +315 -0
- aegis/core/copier_updater.py +475 -0
- aegis/core/dependency_resolver.py +119 -0
- aegis/core/manual_updater.py +554 -0
- aegis/core/post_gen_tasks.py +547 -0
- aegis/core/service_resolver.py +261 -0
- aegis/core/services.py +157 -0
- aegis/core/template_generator.py +266 -0
- aegis/core/version_compatibility.py +259 -0
- aegis/templates/CLAUDE.md +591 -0
- aegis/templates/cookiecutter-aegis-project/cookiecutter.json +39 -0
- aegis/templates/cookiecutter-aegis-project/hooks/post_gen_project.py +214 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.dockerignore +71 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.env.example.j2 +130 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.gitignore +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Dockerfile +53 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Makefile +236 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/README.md.j2 +196 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/alembic.ini.j2 +111 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/env.py.j2 +91 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/script.py.mako +25 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/versions/001_initial_auth.py.j2 +51 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/__init__.py +5 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/__init__.py +6 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai.py.j2 +700 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai_rendering.py +361 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/auth.py.j2 +253 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/health.py.j2 +419 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/load_test.py.j2 +656 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/main.py.j2 +65 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/marko_terminal_renderer.py +489 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/tasks.py.j2 +328 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/{% if cookiecutter.include_scheduler == /"yes/" %}tasks.py{% endif %}" +340 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/__init__.py +8 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/router.py +329 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/router.py +64 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/deps.py +58 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/health.py +163 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/models.py.j2 +280 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/routing.py.j2 +32 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/scheduler.py.j2 +121 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/worker.py.j2 +478 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/hooks.py +144 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/main.py +31 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/cors.py +20 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/cleanup.py +14 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/component_health.py.j2 +418 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/database_init.py.j2 +83 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/__init__.py +5 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/__init__.py +27 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/table.py +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/text.py +142 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/__init__.py.j2 +47 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/base_card.py +256 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/database_card.py +420 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/services_card.py +233 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/main.py.j2 +653 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/theme.py +48 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/main.py.j2 +156 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/CLAUDE.md.j2 +213 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/__init__.py +6 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/constants.py.j2 +30 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/pools.py +97 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/load_test.py +55 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/media.py +49 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/system.py +44 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/registry.py +139 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/__init__.py +120 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/load_tasks.py +507 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/simple_system_tasks.py +33 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/system_tasks.py +281 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/config.py.j2 +178 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/constants.py +58 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/db.py.j2 +176 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/log.py +92 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/security.py +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/webserver.py +40 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/{% if cookiecutter.include_scheduler == /"yes/" %}scheduler.py{% endif %}" +21 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/__init__.py +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/main.py +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/user.py +44 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/py.typed +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/__init__.py +8 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/config.py +130 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/conversation.py +213 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/health.py +96 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/models.py +229 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/providers.py +370 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/service.py +388 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/auth_service.py +41 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/health.py +164 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/user_service.py +83 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/middleware_inspector.py.j2 +223 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/models.py.j2 +70 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/route_inspector.py.j2 +155 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test.py +679 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test_models.py +266 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/__init__.py.j2 +21 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/models.py.j2 +119 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/scheduled_task_manager.py.j2 +273 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/task_monitor.py.j2 +189 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/__init__.py +15 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/models.py +26 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/__init__.py +52 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/alerts.py +94 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/backup.py.j2 +119 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/health.py.j2 +1333 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/models.py +243 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/ui.py +52 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-dark.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-square-backup.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto.png +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.dockerignore +71 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.env.example.j2 +64 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.gitignore +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Dockerfile +53 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Makefile +211 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/README.md.j2 +172 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/docker-compose.yml.j2 +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/mkdocs.yml.j2 +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/pyproject.toml.j2 +120 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/uv.lock +1673 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docker-compose.yml.j2 +200 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/api.md +191 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md +0 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md.j2 +621 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/development.md +215 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/health.md +240 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/javascripts/mermaid-config.js +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/stylesheets/mermaid.css +95 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/mkdocs.yml.j2 +62 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/pyproject.toml.j2 +131 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh +87 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh.j2 +93 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/gen_docs.py +16 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_auth_endpoints.py.j2 +307 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_health_endpoints.py.j2 +262 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_scheduler_endpoints.py.j2 +214 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_worker_endpoints.py.j2 +165 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_ai_rendering.py +427 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_conversation_memory.py +465 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/components/test_scheduler.py +43 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/conftest.py.j2 +195 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/__init__.py +1 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/conftest.py +78 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_health.py +157 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_models.py +164 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_service.py +198 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_auth_integration.py.j2 +528 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_component_integration.py.j2 +387 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_conversation_persistence.py +342 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_health_logic.py.j2 +663 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_models.py +619 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_service.py +603 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_middleware_inspector.py.j2 +248 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_scheduled_task_manager.py.j2 +292 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_system_service.py +98 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_worker_health_registration.py.j2 +257 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/test_core.py +49 -0
- aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/uv.lock +1673 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.copier-answers.yml.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.dockerignore +71 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.env.example.jinja +130 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/.gitignore +131 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/Dockerfile +53 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/Makefile.jinja +236 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/README.md.jinja +196 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/alembic.ini.jinja +111 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/env.py.jinja +91 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/script.py.mako +25 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/versions/001_initial_auth.py.jinja +51 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/__init__.py.jinja +5 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/__init__.py.jinja +6 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai.py.jinja +700 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai_rendering.py +360 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/auth.py.jinja +253 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/health.py.jinja +419 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/load_test.py.jinja +656 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/main.py.jinja +65 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/marko_terminal_renderer.py +489 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/tasks.py.jinja +328 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/__init__.py +8 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/router.py +329 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/router.py +64 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/deps.py +58 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/health.py.jinja +163 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/models.py.jinja +280 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/routing.py.jinja +32 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/scheduler.py.jinja +121 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker.py.jinja +478 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/hooks.py +144 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/main.py +31 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/cors.py +20 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/cleanup.py +14 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/component_health.py.jinja +418 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/database_init.py.jinja +83 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/__init__.py +5 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/__init__.py +27 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/table.py +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/text.py +142 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/__init__.py.jinja +47 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/base_card.py +256 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/database_card.py +420 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/services_card.py +233 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/main.py.jinja +653 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/theme.py +48 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/main.py.jinja +156 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/CLAUDE.md.jinja +213 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/__init__.py +6 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/constants.py.jinja +30 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools.py +97 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test.py +55 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/media.py +49 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system.py +44 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry.py +139 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/__init__.py +120 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/load_tasks.py +507 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/simple_system_tasks.py +33 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/system_tasks.py +281 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/config.py.jinja +178 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/constants.py +58 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/db.py.jinja +176 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/log.py +92 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/security.py +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/scheduler.py.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/webserver.py +39 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/__init__.py +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/main.py +61 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/user.py +44 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/py.typed +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/__init__.py +8 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/config.py +130 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/conversation.py +213 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/health.py +96 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models.py +229 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/providers.py.jinja +370 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/service.py +387 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/auth_service.py +40 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/health.py +162 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/user_service.py +82 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/middleware_inspector.py.jinja +223 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/models.py.jinja +70 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/route_inspector.py.jinja +155 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test.py +678 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test_models.py +265 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/__init__.py.jinja +21 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/models.py.jinja +119 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/scheduled_task_manager.py.jinja +273 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/task_monitor.py.jinja +189 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/__init__.py +15 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/models.py +26 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/__init__.py +52 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/alerts.py +94 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/backup.py.jinja +119 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health.py.jinja +1333 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/models.py +243 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/ui.py +52 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57223!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57224!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57225!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57533!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57534!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57538!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57897!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57898!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57904!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58315!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58316!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58324!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58837!aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58838!aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58849!aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-dark.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-square-backup.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto.png +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/.env.example.jinja +64 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/README.md.jinja +172 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/docker-compose.yml.jinja +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/mkdocs.yml.jinja +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/pyproject.toml.jinja +120 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.yml.jinja +200 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/api.md.jinja +191 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md +0 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md.jinja +621 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/development.md.jinja +215 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/health.md.jinja +240 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/javascripts/mermaid-config.js +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/docs/stylesheets/mermaid.css +95 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/mkdocs.yml.jinja +62 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/pyproject.toml.jinja +131 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh +87 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh.jinja +93 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/gen_docs.py +16 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_auth_endpoints.py.jinja +307 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_health_endpoints.py.jinja +262 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_scheduler_endpoints.py.jinja +214 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_worker_endpoints.py.jinja +165 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_ai_rendering.py +427 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_conversation_memory.py +465 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_scheduler.py +43 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/conftest.py.jinja +195 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/__init__.py +1 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/conftest.py +78 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_health.py +157 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_models.py +164 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_service.py +198 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_auth_integration.py.jinja +528 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_component_integration.py.jinja +387 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_conversation_persistence.py +342 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_health_logic.py.jinja +663 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_models.py +619 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_service.py +603 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_middleware_inspector.py.jinja +248 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduled_task_manager.py.jinja +292 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_system_service.py +98 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_worker_health_registration.py.jinja +257 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_core.py +49 -0
- aegis/templates/copier-aegis-project/{{ project_slug }}/uv.lock +1673 -0
- aegis_stack-0.2.0rc2.dist-info/METADATA +165 -0
- aegis_stack-0.2.0rc2.dist-info/RECORD +392 -0
- aegis_stack-0.2.0rc2.dist-info/WHEEL +4 -0
- aegis_stack-0.2.0rc2.dist-info/entry_points.txt +3 -0
- aegis_stack-0.2.0rc2.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY
|
|
2
|
+
_commit: {{ _copier_conf.vcs_ref_hash | default('unknown') }}
|
|
3
|
+
_src_path: {{ _copier_conf.src_path }}
|
|
4
|
+
project_name: {{ project_name }}
|
|
5
|
+
project_slug: {{ project_slug }}
|
|
6
|
+
project_description: {{ project_description }}
|
|
7
|
+
author_name: {{ author_name }}
|
|
8
|
+
author_email: {{ author_email }}
|
|
9
|
+
github_username: {{ github_username }}
|
|
10
|
+
version: {{ version }}
|
|
11
|
+
python_version: {{ python_version }}
|
|
12
|
+
include_scheduler: {{ include_scheduler }}
|
|
13
|
+
scheduler_backend: {{ scheduler_backend }}
|
|
14
|
+
scheduler_with_persistence: {{ scheduler_with_persistence }}
|
|
15
|
+
include_worker: {{ include_worker }}
|
|
16
|
+
include_redis: {{ include_redis }}
|
|
17
|
+
include_database: {{ include_database }}
|
|
18
|
+
include_cache: {{ include_cache }}
|
|
19
|
+
include_auth: {{ include_auth }}
|
|
20
|
+
include_ai: {{ include_ai }}
|
|
21
|
+
ai_providers: {{ ai_providers }}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
.Python
|
|
7
|
+
build/
|
|
8
|
+
develop-eggs/
|
|
9
|
+
dist/
|
|
10
|
+
downloads/
|
|
11
|
+
eggs/
|
|
12
|
+
.eggs/
|
|
13
|
+
lib/
|
|
14
|
+
lib64/
|
|
15
|
+
parts/
|
|
16
|
+
sdist/
|
|
17
|
+
var/
|
|
18
|
+
wheels/
|
|
19
|
+
*.egg-info/
|
|
20
|
+
.installed.cfg
|
|
21
|
+
*.egg
|
|
22
|
+
MANIFEST
|
|
23
|
+
|
|
24
|
+
# Virtual environments - don't mount host venv into container
|
|
25
|
+
.venv/
|
|
26
|
+
.env/
|
|
27
|
+
venv/
|
|
28
|
+
ENV/
|
|
29
|
+
|
|
30
|
+
# Testing
|
|
31
|
+
.pytest_cache/
|
|
32
|
+
.coverage
|
|
33
|
+
htmlcov/
|
|
34
|
+
.tox/
|
|
35
|
+
.nox/
|
|
36
|
+
|
|
37
|
+
# IDE
|
|
38
|
+
.vscode/
|
|
39
|
+
.idea/
|
|
40
|
+
*.swp
|
|
41
|
+
*.swo
|
|
42
|
+
*~
|
|
43
|
+
|
|
44
|
+
# OS
|
|
45
|
+
.DS_Store
|
|
46
|
+
.DS_Store?
|
|
47
|
+
._*
|
|
48
|
+
.Spotlight-V100
|
|
49
|
+
.Trashes
|
|
50
|
+
ehthumbs.db
|
|
51
|
+
Thumbs.db
|
|
52
|
+
|
|
53
|
+
# Logs
|
|
54
|
+
*.log
|
|
55
|
+
|
|
56
|
+
# Temporary files
|
|
57
|
+
*.tmp
|
|
58
|
+
*.temp
|
|
59
|
+
|
|
60
|
+
# Git
|
|
61
|
+
.git/
|
|
62
|
+
.gitignore
|
|
63
|
+
|
|
64
|
+
# Documentation build
|
|
65
|
+
site/
|
|
66
|
+
docs/_build/
|
|
67
|
+
|
|
68
|
+
# Cache
|
|
69
|
+
.cache/
|
|
70
|
+
.mypy_cache/
|
|
71
|
+
.ruff_cache/
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Aegis Stack Environment Variables Example
|
|
2
|
+
# Copy this file to .env and customize for your environment
|
|
3
|
+
|
|
4
|
+
# =============================================================================
|
|
5
|
+
# APPLICATION SETTINGS
|
|
6
|
+
# =============================================================================
|
|
7
|
+
|
|
8
|
+
# Environment: dev, qa, stg, prod
|
|
9
|
+
APP_ENV=dev
|
|
10
|
+
|
|
11
|
+
# Port to run the webserver on
|
|
12
|
+
PORT=8000
|
|
13
|
+
|
|
14
|
+
# Logging level: DEBUG, INFO, WARNING, ERROR
|
|
15
|
+
LOG_LEVEL=INFO
|
|
16
|
+
|
|
17
|
+
# Auto-reload server on code changes (development only)
|
|
18
|
+
AUTO_RELOAD=true
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# DOCKER SETTINGS
|
|
22
|
+
# =============================================================================
|
|
23
|
+
|
|
24
|
+
# Docker image tag (used by docker-compose)
|
|
25
|
+
AEGIS_STACK_TAG=aegis-stack:latest
|
|
26
|
+
|
|
27
|
+
# Version tag for builds
|
|
28
|
+
AEGIS_STACK_VERSION=dev
|
|
29
|
+
|
|
30
|
+
# Environment file to use (defaults to .env)
|
|
31
|
+
# AEGIS_STACK_ENV_FILE=.env
|
|
32
|
+
|
|
33
|
+
# =============================================================================
|
|
34
|
+
# COMPONENT SETTINGS
|
|
35
|
+
# =============================================================================
|
|
36
|
+
|
|
37
|
+
{%- if include_database %}
|
|
38
|
+
# Database settings
|
|
39
|
+
# DATABASE_URL=sqlite:///./data/app.db # SQLite database (default)
|
|
40
|
+
# DATABASE_ENGINE_ECHO=false # Set to true to log all SQL queries (debugging)
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
{% if include_redis or include_cache %}
|
|
44
|
+
# Redis settings
|
|
45
|
+
# For Docker: redis://redis:6379 (default)
|
|
46
|
+
# For local development: redis://localhost:6379
|
|
47
|
+
REDIS_URL=redis://redis:6379
|
|
48
|
+
|
|
49
|
+
# Override for local CLI commands (when not running in Docker)
|
|
50
|
+
# Uncomment for local development:
|
|
51
|
+
REDIS_URL_LOCAL=redis://localhost:6379
|
|
52
|
+
# REDIS_HOST=redis
|
|
53
|
+
# REDIS_PORT=6379
|
|
54
|
+
# REDIS_PASSWORD=
|
|
55
|
+
|
|
56
|
+
# Redis connection settings (for high-load scenarios)
|
|
57
|
+
# REDIS_CONN_TIMEOUT=5 # Connection timeout in seconds
|
|
58
|
+
# REDIS_CONN_RETRIES=5 # Number of connection retry attempts
|
|
59
|
+
# REDIS_CONN_RETRY_DELAY=1 # Delay between retries in seconds
|
|
60
|
+
{% endif %}
|
|
61
|
+
|
|
62
|
+
{%- if include_scheduler %}
|
|
63
|
+
# Scheduler settings
|
|
64
|
+
# SCHEDULER_TIMEZONE=UTC
|
|
65
|
+
# SCHEDULER_MAX_WORKERS=10
|
|
66
|
+
{% endif %}
|
|
67
|
+
|
|
68
|
+
# API Keys and Secrets (add as needed)
|
|
69
|
+
# SECRET_KEY=your-super-secret-key-here
|
|
70
|
+
# API_KEY=your-api-key-here
|
|
71
|
+
|
|
72
|
+
{%- if include_ai %}
|
|
73
|
+
# =============================================================================
|
|
74
|
+
# AI SERVICE CONFIGURATION
|
|
75
|
+
# =============================================================================
|
|
76
|
+
|
|
77
|
+
# AI Service Settings
|
|
78
|
+
AI_ENABLED=true
|
|
79
|
+
AI_PROVIDER=public # Primary provider: openai, anthropic, google, groq, mistral, cohere, public
|
|
80
|
+
AI_MODEL=auto # Model to use (PUBLIC provider uses available free models)
|
|
81
|
+
AI_TEMPERATURE=0.7 # Response creativity (0.0-2.0)
|
|
82
|
+
AI_MAX_TOKENS=1000 # Maximum response length
|
|
83
|
+
AI_TIMEOUT_SECONDS=30.0 # Request timeout
|
|
84
|
+
|
|
85
|
+
# Conversation Management
|
|
86
|
+
AI_MAX_CONVERSATION_LENGTH=50 # Max messages per conversation
|
|
87
|
+
AI_CONVERSATION_TIMEOUT_HOURS=24 # Auto-cleanup old conversations
|
|
88
|
+
|
|
89
|
+
# Provider API Keys (optional - many offer free tiers)
|
|
90
|
+
# โก PUBLIC provider works immediately without API keys (currently set as default)
|
|
91
|
+
# Get your API keys from:
|
|
92
|
+
# - OpenAI: https://platform.openai.com/api-keys
|
|
93
|
+
# - Anthropic: https://console.anthropic.com/
|
|
94
|
+
# - Google: https://aistudio.google.com/app/apikey
|
|
95
|
+
# - Groq: https://console.groq.com/keys (FREE - Recommended for getting started)
|
|
96
|
+
# - Mistral: https://console.mistral.ai/api-keys/
|
|
97
|
+
# - Cohere: https://dashboard.cohere.com/api-keys
|
|
98
|
+
|
|
99
|
+
# OPENAI_API_KEY=sk-...
|
|
100
|
+
# ANTHROPIC_API_KEY=sk-ant-...
|
|
101
|
+
# GOOGLE_API_KEY=AI...
|
|
102
|
+
# GROQ_API_KEY=gsk_... # FREE tier available!
|
|
103
|
+
# MISTRAL_API_KEY=...
|
|
104
|
+
# COHERE_API_KEY=...
|
|
105
|
+
|
|
106
|
+
# Provider-Specific Notes:
|
|
107
|
+
# - Public: Works immediately without API keys (uses free endpoints, actual model varies)
|
|
108
|
+
# - Groq: Excellent free tier with fast inference (recommended for testing)
|
|
109
|
+
# - Google: Generous free tier with Gemini Flash model
|
|
110
|
+
# - OpenAI: Requires paid account but excellent quality
|
|
111
|
+
# - Anthropic: Requires paid account, very good for reasoning
|
|
112
|
+
# - Mistral: Good open source models, some free options
|
|
113
|
+
# - Cohere: Enterprise focused, limited free tier
|
|
114
|
+
{% endif %}
|
|
115
|
+
|
|
116
|
+
# =============================================================================
|
|
117
|
+
# DEVELOPMENT OVERRIDES
|
|
118
|
+
# =============================================================================
|
|
119
|
+
|
|
120
|
+
# Worker auto-reload settings
|
|
121
|
+
# WORKER_WATCH=false # Disable worker auto-reload (useful for debugging)
|
|
122
|
+
|
|
123
|
+
{% if include_worker %}
|
|
124
|
+
# Worker health check settings
|
|
125
|
+
# WORKER_HEALTH_CHECK_INTERVAL=15 # Health check interval in seconds (default: 15)
|
|
126
|
+
{% endif %}
|
|
127
|
+
|
|
128
|
+
# Override for local development
|
|
129
|
+
# Use this to point to local services instead of Docker services
|
|
130
|
+
# DATABASE_HOST=host.docker.internal # For connecting to host DB from container
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*.so
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
*.egg-info/
|
|
24
|
+
.installed.cfg
|
|
25
|
+
*.egg
|
|
26
|
+
MANIFEST
|
|
27
|
+
|
|
28
|
+
# PyInstaller
|
|
29
|
+
# Usually these files are written by a python script from a template
|
|
30
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
31
|
+
*.manifest
|
|
32
|
+
*.spec
|
|
33
|
+
|
|
34
|
+
# Installer logs
|
|
35
|
+
pip-log.txt
|
|
36
|
+
pip-delete-this-directory.txt
|
|
37
|
+
|
|
38
|
+
# Unit test / coverage reports
|
|
39
|
+
htmlcov/
|
|
40
|
+
.tox/
|
|
41
|
+
.nox/
|
|
42
|
+
.coverage
|
|
43
|
+
.coverage.*
|
|
44
|
+
.cache
|
|
45
|
+
nosetests.xml
|
|
46
|
+
coverage.xml
|
|
47
|
+
*.cover
|
|
48
|
+
.hypothesis/
|
|
49
|
+
.pytest_cache/
|
|
50
|
+
|
|
51
|
+
# Translations
|
|
52
|
+
*.mo
|
|
53
|
+
*.pot
|
|
54
|
+
|
|
55
|
+
# Django stuff:
|
|
56
|
+
*.log
|
|
57
|
+
local_settings.py
|
|
58
|
+
db.sqlite3
|
|
59
|
+
|
|
60
|
+
# Database files and data directory
|
|
61
|
+
data/
|
|
62
|
+
*.db
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
target/
|
|
76
|
+
|
|
77
|
+
# Jupyter Notebook
|
|
78
|
+
.ipynb_checkpoints
|
|
79
|
+
|
|
80
|
+
# IPython
|
|
81
|
+
profile_default/
|
|
82
|
+
ipython_config.py
|
|
83
|
+
|
|
84
|
+
# pyenv
|
|
85
|
+
.python-version
|
|
86
|
+
|
|
87
|
+
# celery beat schedule file
|
|
88
|
+
celerybeat-schedule
|
|
89
|
+
|
|
90
|
+
# SageMath parsed files
|
|
91
|
+
*.sage.py
|
|
92
|
+
|
|
93
|
+
# Environments
|
|
94
|
+
.env
|
|
95
|
+
.venv
|
|
96
|
+
env/
|
|
97
|
+
venv/
|
|
98
|
+
ENV/
|
|
99
|
+
env.bak/
|
|
100
|
+
venv.bak/
|
|
101
|
+
|
|
102
|
+
# Spyder project settings
|
|
103
|
+
.spyderproject
|
|
104
|
+
.spyproject
|
|
105
|
+
|
|
106
|
+
# Rope project settings
|
|
107
|
+
.ropeproject
|
|
108
|
+
|
|
109
|
+
# mkdocs documentation
|
|
110
|
+
/site
|
|
111
|
+
|
|
112
|
+
# mypy
|
|
113
|
+
.mypy_cache/
|
|
114
|
+
.dmypy.json
|
|
115
|
+
dmypy.json
|
|
116
|
+
|
|
117
|
+
# IDE
|
|
118
|
+
.vscode/
|
|
119
|
+
.idea/
|
|
120
|
+
*.swp
|
|
121
|
+
*.swo
|
|
122
|
+
*~
|
|
123
|
+
|
|
124
|
+
# OS generated files
|
|
125
|
+
.DS_Store
|
|
126
|
+
.DS_Store?
|
|
127
|
+
._*
|
|
128
|
+
.Spotlight-V100
|
|
129
|
+
.Trashes
|
|
130
|
+
ehthumbs.db
|
|
131
|
+
Thumbs.db
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
FROM python:3.11-slim
|
|
2
|
+
|
|
3
|
+
# Install system dependencies and clean up
|
|
4
|
+
RUN apt-get update -y && \
|
|
5
|
+
apt-get install -y --no-install-recommends \
|
|
6
|
+
build-essential \
|
|
7
|
+
ca-certificates \
|
|
8
|
+
curl \
|
|
9
|
+
&& \
|
|
10
|
+
apt-get clean && \
|
|
11
|
+
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
|
|
12
|
+
|
|
13
|
+
# Install uv with specific version for reproducibility
|
|
14
|
+
RUN pip install --no-cache-dir uv==0.4.18
|
|
15
|
+
|
|
16
|
+
# Set environment variables
|
|
17
|
+
ENV PYTHONUNBUFFERED=1 \
|
|
18
|
+
PYTHONPATH=/code \
|
|
19
|
+
UV_CACHE_DIR=/tmp/uv-cache
|
|
20
|
+
|
|
21
|
+
WORKDIR /code
|
|
22
|
+
|
|
23
|
+
# Copy dependency files and README (needed by pyproject.toml)
|
|
24
|
+
COPY pyproject.toml uv.lock README.md /code/
|
|
25
|
+
|
|
26
|
+
# Install dependencies
|
|
27
|
+
RUN uv sync --all-extras && \
|
|
28
|
+
rm -rf /tmp/uv-cache
|
|
29
|
+
|
|
30
|
+
# Copy application code
|
|
31
|
+
COPY . /code
|
|
32
|
+
|
|
33
|
+
# Make entrypoint executable
|
|
34
|
+
RUN chmod +x /code/scripts/entrypoint.sh
|
|
35
|
+
|
|
36
|
+
# Set default port as an environment variable
|
|
37
|
+
ARG PORT=8000
|
|
38
|
+
ENV PORT=$PORT
|
|
39
|
+
|
|
40
|
+
# Expose the port
|
|
41
|
+
EXPOSE $PORT
|
|
42
|
+
|
|
43
|
+
# Add health check
|
|
44
|
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
|
45
|
+
CMD curl -f http://localhost:$PORT/health || exit 1
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
# Labels for better container management
|
|
49
|
+
LABEL maintainer="contact@aegis-stack.dev" \
|
|
50
|
+
version="0.1.0" \
|
|
51
|
+
description="Aegis Stack - Production-ready async Python foundation"
|
|
52
|
+
|
|
53
|
+
ENTRYPOINT ["uv", "run", "/code/scripts/entrypoint.sh"]
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# {{ project_name }} - Aegis Stack Project
|
|
2
|
+
# Developer-friendly commands for Docker workflow
|
|
3
|
+
|
|
4
|
+
#=============================================================================
|
|
5
|
+
# CORE DOCKER COMMANDS
|
|
6
|
+
#=============================================================================
|
|
7
|
+
|
|
8
|
+
build: ## Build all Docker images (safe, sequential)
|
|
9
|
+
@echo "๐จ Building Docker images..."
|
|
10
|
+
@docker compose --profile dev build
|
|
11
|
+
|
|
12
|
+
serve: ## Run all services (assumes images are built)
|
|
13
|
+
@echo "๐ Starting services... (Press Ctrl+C to stop)"
|
|
14
|
+
@docker compose --profile dev up --remove-orphans
|
|
15
|
+
|
|
16
|
+
serve-bg: ## Run all services in background
|
|
17
|
+
@echo "๐ Starting services in background..."
|
|
18
|
+
@docker compose --profile dev up -d --remove-orphans
|
|
19
|
+
|
|
20
|
+
stop: ## Gracefully stop all services
|
|
21
|
+
@echo "โน๏ธ Stopping services..."
|
|
22
|
+
@docker compose --profile dev down --remove-orphans
|
|
23
|
+
|
|
24
|
+
clean: ## Nuclear cleanup - remove containers, networks, and images
|
|
25
|
+
@echo "๐งน Nuclear cleanup - removing everything..."
|
|
26
|
+
@docker compose down --remove-orphans --volumes --rmi all 2>/dev/null || true
|
|
27
|
+
@docker system prune -f
|
|
28
|
+
|
|
29
|
+
#=============================================================================
|
|
30
|
+
# DEVELOPER WORKFLOW COMMANDS (the ones you'll actually use)
|
|
31
|
+
#=============================================================================
|
|
32
|
+
|
|
33
|
+
rebuild: build serve ## Build images and start services
|
|
34
|
+
|
|
35
|
+
refresh: clean build serve ## Nuclear reset - clean everything and rebuild
|
|
36
|
+
|
|
37
|
+
restart: stop serve ## Quick restart (no rebuild)
|
|
38
|
+
|
|
39
|
+
#=============================================================================
|
|
40
|
+
# DEBUGGING AND LOGS
|
|
41
|
+
#=============================================================================
|
|
42
|
+
|
|
43
|
+
logs: ## Follow logs from all services
|
|
44
|
+
@echo "๐ Following all service logs..."
|
|
45
|
+
@docker compose logs -f
|
|
46
|
+
|
|
47
|
+
logs-web: ## Follow webserver logs only
|
|
48
|
+
@echo "๐ Following webserver logs..."
|
|
49
|
+
@docker compose logs -f webserver
|
|
50
|
+
|
|
51
|
+
logs-worker: ## Follow worker logs only
|
|
52
|
+
@echo "๐ Following worker logs..."
|
|
53
|
+
@docker compose logs -f worker-system worker-load-test
|
|
54
|
+
|
|
55
|
+
logs-redis: ## Follow Redis logs only
|
|
56
|
+
@echo "๐ Following Redis logs..."
|
|
57
|
+
@docker compose logs -f redis{% if include_scheduler %}
|
|
58
|
+
|
|
59
|
+
logs-scheduler: ## Follow scheduler logs only
|
|
60
|
+
@echo "๐ Following scheduler logs..."
|
|
61
|
+
@docker compose logs -f scheduler{% endif %}
|
|
62
|
+
|
|
63
|
+
shell: ## Open shell in webserver container
|
|
64
|
+
@echo "๐ Opening shell in webserver container..."
|
|
65
|
+
@docker compose exec webserver /bin/bash
|
|
66
|
+
|
|
67
|
+
shell-worker: ## Open shell in worker container
|
|
68
|
+
@echo "๐ Opening shell in worker container..."
|
|
69
|
+
@docker compose exec worker-system /bin/bash
|
|
70
|
+
|
|
71
|
+
ps: ## Show running containers
|
|
72
|
+
@echo "๐ Docker containers status:"
|
|
73
|
+
@docker compose ps
|
|
74
|
+
|
|
75
|
+
#=============================================================================
|
|
76
|
+
# REDIS DEBUGGING
|
|
77
|
+
#=============================================================================
|
|
78
|
+
|
|
79
|
+
redis-cli: ## Connect to Redis CLI
|
|
80
|
+
@echo "๐ง Connecting to Redis CLI..."
|
|
81
|
+
@docker compose exec redis redis-cli
|
|
82
|
+
|
|
83
|
+
redis-stats: ## Show Redis memory and stats
|
|
84
|
+
@echo "๐ Redis statistics:"
|
|
85
|
+
@docker compose exec redis redis-cli info memory
|
|
86
|
+
|
|
87
|
+
redis-keys: ## Show all Redis keys
|
|
88
|
+
@echo "๐ Redis keys:"
|
|
89
|
+
@docker compose exec redis redis-cli keys "*"
|
|
90
|
+
|
|
91
|
+
redis-reset: ## Clear all Redis data
|
|
92
|
+
@echo "๐ Clearing all Redis data..."
|
|
93
|
+
@docker compose exec redis redis-cli flushall
|
|
94
|
+
|
|
95
|
+
#=============================================================================
|
|
96
|
+
# HEALTH AND TESTING
|
|
97
|
+
#=============================================================================
|
|
98
|
+
|
|
99
|
+
health: ## Check system health status
|
|
100
|
+
@echo "๐ฉบ Checking system health..."
|
|
101
|
+
@uv run {{ project_slug }} health status
|
|
102
|
+
|
|
103
|
+
health-detailed: ## Detailed system health information
|
|
104
|
+
@echo "๐ฉบ Detailed system health..."
|
|
105
|
+
@uv run {{ project_slug }} health status --detailed
|
|
106
|
+
|
|
107
|
+
health-json: ## System health as JSON
|
|
108
|
+
@uv run {{ project_slug }} health status --json
|
|
109
|
+
|
|
110
|
+
health-probe: ## Health probe (exits 1 if unhealthy)
|
|
111
|
+
@uv run {{ project_slug }} health probe
|
|
112
|
+
|
|
113
|
+
test: ## Run tests locally
|
|
114
|
+
@echo "๐งช Running tests..."
|
|
115
|
+
@uv run pytest
|
|
116
|
+
|
|
117
|
+
test-verbose: ## Run tests with verbose output
|
|
118
|
+
@echo "๐งช Running tests (verbose)..."
|
|
119
|
+
@uv run pytest -v
|
|
120
|
+
|
|
121
|
+
#=============================================================================
|
|
122
|
+
# CODE QUALITY (local development tools)
|
|
123
|
+
#=============================================================================
|
|
124
|
+
|
|
125
|
+
lint: ## Check code style with ruff
|
|
126
|
+
@echo "๐ Running linting..."
|
|
127
|
+
@uv run ruff check .
|
|
128
|
+
|
|
129
|
+
fix: ## Auto-fix linting and formatting issues
|
|
130
|
+
@echo "๐ง Auto-fixing code issues..."
|
|
131
|
+
@uv run ruff check . --fix
|
|
132
|
+
@uv run ruff format .
|
|
133
|
+
|
|
134
|
+
format: ## Format code with ruff
|
|
135
|
+
@echo "๐ Formatting code..."
|
|
136
|
+
@uv run ruff format .
|
|
137
|
+
|
|
138
|
+
typecheck: ## Run type checking with ty
|
|
139
|
+
@echo "๐ Running type checking..."
|
|
140
|
+
@uv run ty check
|
|
141
|
+
|
|
142
|
+
check: lint typecheck test ## Run all code quality checks
|
|
143
|
+
@echo "โ
All checks completed successfully!"
|
|
144
|
+
|
|
145
|
+
#=============================================================================
|
|
146
|
+
# PROJECT MANAGEMENT
|
|
147
|
+
#=============================================================================
|
|
148
|
+
|
|
149
|
+
install: ## Install/sync dependencies with uv
|
|
150
|
+
@echo "๐ฆ Installing dependencies..."
|
|
151
|
+
@uv sync --all-extras
|
|
152
|
+
|
|
153
|
+
deps-update: ## Update dependencies
|
|
154
|
+
@echo "๐ฆ Updating dependencies..."
|
|
155
|
+
@uv sync --upgrade
|
|
156
|
+
|
|
157
|
+
clean-cache: ## Clean Python cache files
|
|
158
|
+
@echo "๐งน Cleaning Python cache files..."
|
|
159
|
+
@find . -type d -name "__pycache__" -exec rm -rf {} +
|
|
160
|
+
@find . -type f -name "*.pyc" -delete
|
|
161
|
+
|
|
162
|
+
#=============================================================================
|
|
163
|
+
# DOCUMENTATION
|
|
164
|
+
#=============================================================================
|
|
165
|
+
|
|
166
|
+
docs-serve: ## Serve documentation locally (http://localhost:8001)
|
|
167
|
+
@echo "๐ Serving documentation on http://localhost:8001"
|
|
168
|
+
@uv run mkdocs serve --dev-addr 0.0.0.0:8001
|
|
169
|
+
|
|
170
|
+
docs-build: ## Build static documentation
|
|
171
|
+
@echo "๐ Building documentation..."
|
|
172
|
+
@uv run mkdocs build
|
|
173
|
+
|
|
174
|
+
{% if include_database %}#=============================================================================
|
|
175
|
+
# DATABASE MIGRATIONS
|
|
176
|
+
#=============================================================================
|
|
177
|
+
|
|
178
|
+
migrate: ## Apply database migrations
|
|
179
|
+
@echo "๐๏ธ Applying database migrations..."
|
|
180
|
+
@docker compose exec webserver uv run alembic -c alembic/alembic.ini upgrade head
|
|
181
|
+
|
|
182
|
+
migrate-check: ## Check migration status
|
|
183
|
+
@echo "๐ Checking migration status..."
|
|
184
|
+
@docker compose exec webserver uv run alembic -c alembic/alembic.ini current
|
|
185
|
+
|
|
186
|
+
migrate-history: ## Show migration history
|
|
187
|
+
@echo "๐ Migration history:"
|
|
188
|
+
@docker compose exec webserver uv run alembic -c alembic/alembic.ini history --verbose
|
|
189
|
+
|
|
190
|
+
migrate-reset: ## Reset database (WARNING: destructive)
|
|
191
|
+
@echo "โ ๏ธ This will destroy all data in the database!"
|
|
192
|
+
@read -p "Are you sure? Type 'yes' to continue: " confirm && [ "$$confirm" = "yes" ] || exit 1
|
|
193
|
+
@docker compose exec webserver uv run alembic -c alembic/alembic.ini downgrade base
|
|
194
|
+
@docker compose exec webserver uv run alembic -c alembic/alembic.ini upgrade head
|
|
195
|
+
@echo "โ
Database reset complete"
|
|
196
|
+
|
|
197
|
+
{% endif %}
|
|
198
|
+
|
|
199
|
+
#=============================================================================
|
|
200
|
+
# WORKER DEBUGGING (arq)
|
|
201
|
+
#=============================================================================
|
|
202
|
+
|
|
203
|
+
worker-test: ## Test workers in burst mode (process and exit)
|
|
204
|
+
@echo "๐งช Testing system worker in burst mode..."
|
|
205
|
+
@uv run python -m arq app.components.worker.queues.system.WorkerSettings --burst
|
|
206
|
+
|
|
207
|
+
#=============================================================================
|
|
208
|
+
# HELP AND INFO
|
|
209
|
+
#=============================================================================
|
|
210
|
+
|
|
211
|
+
status: ## Show current system status
|
|
212
|
+
@echo "๐ Current system status:"
|
|
213
|
+
@echo
|
|
214
|
+
@echo "๐ณ Docker containers:"
|
|
215
|
+
@docker compose ps || echo "No containers running"
|
|
216
|
+
@echo
|
|
217
|
+
@echo "๐ฆ Dependencies:"
|
|
218
|
+
@uv pip list | head -20 || echo "Dependencies not installed"
|
|
219
|
+
|
|
220
|
+
help: ## Show this help message
|
|
221
|
+
@echo "{{ project_name }} development commands:"
|
|
222
|
+
@echo
|
|
223
|
+
@echo "๐ WORKFLOW COMMANDS (start here):"
|
|
224
|
+
@echo " make refresh - Nuclear reset (clean + build + serve)"
|
|
225
|
+
@echo " make rebuild - Build and serve"
|
|
226
|
+
@echo " make restart - Quick restart"
|
|
227
|
+
@echo
|
|
228
|
+
@echo "๐ง CORE COMMANDS:"
|
|
229
|
+
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
|
230
|
+
@echo
|
|
231
|
+
@echo "๐ก TIP: Use 'make refresh' when everything is broken!"
|
|
232
|
+
|
|
233
|
+
.PHONY: build serve stop clean rebuild refresh restart logs logs-web logs-worker logs-redis{% if include_scheduler %} logs-scheduler{% endif %} shell shell-worker ps redis-cli redis-stats redis-keys redis-reset health health-detailed health-json health-probe test test-verbose lint fix format typecheck check install deps-update clean-cache docs-serve docs-build{% if include_database %} migrate migrate-check migrate-history migrate-reset{% endif %} worker-test status help
|
|
234
|
+
|
|
235
|
+
# Default target - show help
|
|
236
|
+
.DEFAULT_GOAL := help
|