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,215 @@
|
|
|
1
|
+
# Development Guide
|
|
2
|
+
|
|
3
|
+
This guide covers how to develop and maintain {{ project_name }}.
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
### Prerequisites
|
|
8
|
+
- Python 3.11+
|
|
9
|
+
- UV package manager
|
|
10
|
+
|
|
11
|
+
### Setup
|
|
12
|
+
```bash
|
|
13
|
+
# Clone and enter the project
|
|
14
|
+
cd {{ project_slug }}
|
|
15
|
+
|
|
16
|
+
# Install dependencies
|
|
17
|
+
uv sync
|
|
18
|
+
|
|
19
|
+
# Copy environment template
|
|
20
|
+
cp .env.example .env
|
|
21
|
+
|
|
22
|
+
# Start development server
|
|
23
|
+
make run
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Development Commands
|
|
27
|
+
|
|
28
|
+
### Running the Application
|
|
29
|
+
```bash
|
|
30
|
+
make run # Start with Docker
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Health Monitoring
|
|
34
|
+
```bash
|
|
35
|
+
make health # Check system health
|
|
36
|
+
make health-detailed # Detailed health information
|
|
37
|
+
make health-json # JSON health output
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Code Quality
|
|
41
|
+
```bash
|
|
42
|
+
make test # Run test suite
|
|
43
|
+
make lint # Check code style
|
|
44
|
+
make typecheck # Run type checking
|
|
45
|
+
make check # Run all checks
|
|
46
|
+
make fix # Auto-fix code issues
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Documentation
|
|
50
|
+
```bash
|
|
51
|
+
make docs-serve # Serve documentation locally (http://localhost:8001)
|
|
52
|
+
make docs-build # Build static documentation
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Project Structure
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
{{ project_slug }}/
|
|
59
|
+
├── app/
|
|
60
|
+
│ ├── components/ # Application components{% if include_scheduler %}
|
|
61
|
+
│ │ ├── scheduler/ # Background task scheduling{% endif %}
|
|
62
|
+
│ │ ├── backend/ # FastAPI web server
|
|
63
|
+
│ │ ├── frontend/ # Flet user interface
|
|
64
|
+
│ │ └── worker/ # Background task workers (arq)
|
|
65
|
+
│ ├── core/ # Core utilities and configuration
|
|
66
|
+
│ ├── services/ # Business logic services
|
|
67
|
+
│ └── cli/ # Command-line interface
|
|
68
|
+
├── tests/ # Test suite
|
|
69
|
+
├── docs/ # Project documentation
|
|
70
|
+
└── docker-compose.yml # Container orchestration
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Adding New Features
|
|
74
|
+
|
|
75
|
+
### 1. Create Business Logic
|
|
76
|
+
Add pure business logic functions to `app/services/`:
|
|
77
|
+
|
|
78
|
+
```python
|
|
79
|
+
# app/services/my_service.py
|
|
80
|
+
async def process_data(data: str) -> str:
|
|
81
|
+
"""Process data and return result."""
|
|
82
|
+
return f"Processed: {data}"
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. Add API Endpoints
|
|
86
|
+
Create routes in `app/components/backend/api/`:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
# app/components/backend/api/my_endpoints.py
|
|
90
|
+
from fastapi import APIRouter
|
|
91
|
+
from app.services.my_service import process_data
|
|
92
|
+
|
|
93
|
+
router = APIRouter()
|
|
94
|
+
|
|
95
|
+
@router.post("/process")
|
|
96
|
+
async def process_endpoint(data: str):
|
|
97
|
+
result = await process_data(data)
|
|
98
|
+
return {"result": result}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Register in `app/components/backend/api/routing.py`:
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
from app.components.backend.api import my_endpoints
|
|
105
|
+
|
|
106
|
+
def include_routers(app: FastAPI) -> None:
|
|
107
|
+
app.include_router(my_endpoints.router, prefix="/api", tags=["processing"])
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 3. Add Background Tasks
|
|
111
|
+
Create worker tasks in `app/components/worker/tasks/`:
|
|
112
|
+
|
|
113
|
+
```python
|
|
114
|
+
# app/components/worker/tasks/my_tasks.py
|
|
115
|
+
async def background_process_data(data: str) -> dict[str, str]:
|
|
116
|
+
"""Process data in background."""
|
|
117
|
+
logger.info(f"Processing {data} in background")
|
|
118
|
+
|
|
119
|
+
# Your processing logic here
|
|
120
|
+
result = f"Processed: {data}"
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
"status": "completed",
|
|
124
|
+
"result": result,
|
|
125
|
+
"timestamp": datetime.now(UTC).isoformat()
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Register in worker queue (`app/components/worker/queues/system.py`):
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
from app.components.worker.tasks.my_tasks import background_process_data
|
|
133
|
+
|
|
134
|
+
class WorkerSettings:
|
|
135
|
+
functions = [
|
|
136
|
+
system_health_check,
|
|
137
|
+
background_process_data, # Add your task here
|
|
138
|
+
]
|
|
139
|
+
```{% if include_scheduler %}
|
|
140
|
+
|
|
141
|
+
### 4. Add Scheduled Tasks
|
|
142
|
+
Add jobs to the scheduler component:
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
# In app/components/scheduler/main.py
|
|
146
|
+
from app.services.my_service import process_data
|
|
147
|
+
|
|
148
|
+
# Add to create_scheduler function
|
|
149
|
+
scheduler.add_job(
|
|
150
|
+
func=lambda: process_data("scheduled"),
|
|
151
|
+
trigger="cron",
|
|
152
|
+
hour=2, # Run at 2 AM daily
|
|
153
|
+
id="daily_processing",
|
|
154
|
+
name="Daily Data Processing"
|
|
155
|
+
)
|
|
156
|
+
```{% endif %}
|
|
157
|
+
|
|
158
|
+
## Testing
|
|
159
|
+
|
|
160
|
+
### Running Tests
|
|
161
|
+
```bash
|
|
162
|
+
make test # All tests
|
|
163
|
+
make test-verbose # Verbose output
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Writing Tests
|
|
167
|
+
Create tests in the `tests/` directory:
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
# tests/services/test_my_service.py
|
|
171
|
+
import pytest
|
|
172
|
+
from app.services.my_service import process_data
|
|
173
|
+
|
|
174
|
+
@pytest.mark.asyncio
|
|
175
|
+
async def test_process_data():
|
|
176
|
+
result = await process_data("test")
|
|
177
|
+
assert result == "Processed: test"
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Deployment
|
|
181
|
+
|
|
182
|
+
### Docker Deployment
|
|
183
|
+
```bash
|
|
184
|
+
# Build and run
|
|
185
|
+
make docker-build
|
|
186
|
+
make docker-up
|
|
187
|
+
|
|
188
|
+
# Or use profiles for specific components
|
|
189
|
+
docker compose --profile dev up
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Environment Configuration
|
|
193
|
+
Configure `.env` file for your environment:
|
|
194
|
+
|
|
195
|
+
```env
|
|
196
|
+
# API Configuration
|
|
197
|
+
API_HOST=0.0.0.0
|
|
198
|
+
API_PORT=8000
|
|
199
|
+
|
|
200
|
+
# Logging
|
|
201
|
+
LOG_LEVEL=INFO{% if include_scheduler %}
|
|
202
|
+
|
|
203
|
+
# Scheduler Configuration
|
|
204
|
+
SCHEDULER_TIMEZONE=UTC{% endif %}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Monitoring and Health Checks
|
|
208
|
+
|
|
209
|
+
{{ project_name }} includes comprehensive health monitoring:
|
|
210
|
+
|
|
211
|
+
- **Health Endpoints**: `/health/` and `/health/detailed`
|
|
212
|
+
- **CLI Commands**: `{{ project_slug }} health check`
|
|
213
|
+
- **Component Monitoring**: Automatic health checks for all components
|
|
214
|
+
|
|
215
|
+
See [Health Monitoring](health.md) for complete details.
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Health Monitoring
|
|
2
|
+
|
|
3
|
+
{{ project_name }} includes comprehensive health monitoring capabilities through both API endpoints and CLI commands.
|
|
4
|
+
|
|
5
|
+
## Health Check Endpoints
|
|
6
|
+
|
|
7
|
+
### Basic Health Check
|
|
8
|
+
- **URL**: `GET /health/`
|
|
9
|
+
- **Purpose**: Quick health status check
|
|
10
|
+
- **Response Time**: < 100ms
|
|
11
|
+
|
|
12
|
+
### Detailed Health Check
|
|
13
|
+
- **URL**: `GET /health/detailed`
|
|
14
|
+
- **Purpose**: Comprehensive system health with metrics
|
|
15
|
+
- **Response Time**: < 500ms
|
|
16
|
+
|
|
17
|
+
## CLI Health Commands
|
|
18
|
+
|
|
19
|
+
{{ project_name }} provides a built-in CLI for health monitoring:
|
|
20
|
+
|
|
21
|
+
### Basic Health Check
|
|
22
|
+
```bash
|
|
23
|
+
{{ project_slug }} health status
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Output:**
|
|
27
|
+
```
|
|
28
|
+
✅ {{ project_name }} - System Status: HEALTHY
|
|
29
|
+
|
|
30
|
+
🖥️ System Health:
|
|
31
|
+
• CPU Usage: 15.2%
|
|
32
|
+
• Memory Usage: 45.8%
|
|
33
|
+
• Disk Usage: 32.1%
|
|
34
|
+
• Response Time: 2.1ms{% if include_scheduler %}
|
|
35
|
+
|
|
36
|
+
⏰ Scheduler Health:
|
|
37
|
+
• Status: HEALTHY
|
|
38
|
+
• Active Jobs: 2
|
|
39
|
+
• Next Run: 2024-01-01 02:00:00
|
|
40
|
+
• Response Time: 1.5ms{% endif %}
|
|
41
|
+
|
|
42
|
+
🔍 Overall Health: 98.5%
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Detailed Health Check
|
|
46
|
+
```bash
|
|
47
|
+
{{ project_slug }} health status --detailed
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Shows comprehensive system information including:
|
|
51
|
+
- Component-level health status
|
|
52
|
+
- System resource utilization
|
|
53
|
+
- Response time metrics
|
|
54
|
+
- Uptime information
|
|
55
|
+
|
|
56
|
+
### JSON Output
|
|
57
|
+
```bash
|
|
58
|
+
{{ project_slug }} health status --json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Returns structured JSON for integration with monitoring systems:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"healthy": true,
|
|
66
|
+
"status": "healthy",
|
|
67
|
+
"components": {
|
|
68
|
+
"system": {
|
|
69
|
+
"status": "healthy",
|
|
70
|
+
"cpu_percent": 15.2,
|
|
71
|
+
"memory_percent": 45.8,
|
|
72
|
+
"disk_percent": 32.1,
|
|
73
|
+
"response_time_ms": 2.1
|
|
74
|
+
}{% if include_scheduler %},
|
|
75
|
+
"scheduler": {
|
|
76
|
+
"status": "healthy",
|
|
77
|
+
"active_jobs": 2,
|
|
78
|
+
"next_run": "2024-01-01T02:00:00Z",
|
|
79
|
+
"response_time_ms": 1.5
|
|
80
|
+
}{% endif %}
|
|
81
|
+
},
|
|
82
|
+
"timestamp": "2024-01-01T00:00:00Z",
|
|
83
|
+
"uptime_seconds": 3600,
|
|
84
|
+
"health_percentage": 98.5
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Health Probe
|
|
89
|
+
```bash
|
|
90
|
+
{{ project_slug }} health probe
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Returns simple healthy/unhealthy status for use in scripts and monitoring.
|
|
94
|
+
|
|
95
|
+
## Using Health Checks in Development
|
|
96
|
+
|
|
97
|
+
### Make Commands
|
|
98
|
+
Convenient make targets are available:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
make health # Basic health check
|
|
102
|
+
make health-detailed # Detailed health information
|
|
103
|
+
make health-json # JSON health output
|
|
104
|
+
make health-probe # Health probe for monitoring
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Health Check Components
|
|
108
|
+
|
|
109
|
+
### System Health
|
|
110
|
+
Monitors core system resources:
|
|
111
|
+
|
|
112
|
+
- **CPU Usage**: Current CPU utilization percentage
|
|
113
|
+
- **Memory Usage**: RAM utilization percentage
|
|
114
|
+
- **Disk Usage**: Disk space utilization percentage
|
|
115
|
+
- **Response Time**: Health check response time{% if include_scheduler %}
|
|
116
|
+
|
|
117
|
+
### Scheduler Health
|
|
118
|
+
Monitors the background task scheduler:
|
|
119
|
+
|
|
120
|
+
- **Scheduler Status**: Running/stopped status
|
|
121
|
+
- **Active Jobs**: Number of currently scheduled jobs
|
|
122
|
+
- **Next Run**: When the next job will execute
|
|
123
|
+
- **Job History**: Recent job execution status{% endif %}
|
|
124
|
+
|
|
125
|
+
## Integration with Monitoring Systems
|
|
126
|
+
|
|
127
|
+
### Prometheus Metrics
|
|
128
|
+
To add Prometheus metrics:
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
# app/components/backend/middleware/prometheus.py
|
|
132
|
+
from prometheus_client import Counter, Histogram, generate_latest
|
|
133
|
+
from fastapi import Request, Response
|
|
134
|
+
|
|
135
|
+
REQUEST_COUNT = Counter('http_requests_total', 'Total HTTP requests', ['method', 'endpoint'])
|
|
136
|
+
REQUEST_DURATION = Histogram('http_request_duration_seconds', 'HTTP request duration')
|
|
137
|
+
|
|
138
|
+
@app.middleware("http")
|
|
139
|
+
async def prometheus_middleware(request: Request, call_next):
|
|
140
|
+
start_time = time.time()
|
|
141
|
+
response = await call_next(request)
|
|
142
|
+
|
|
143
|
+
REQUEST_COUNT.labels(method=request.method, endpoint=request.url.path).inc()
|
|
144
|
+
REQUEST_DURATION.observe(time.time() - start_time)
|
|
145
|
+
|
|
146
|
+
return response
|
|
147
|
+
|
|
148
|
+
@app.get("/metrics")
|
|
149
|
+
async def metrics():
|
|
150
|
+
return Response(generate_latest(), media_type="text/plain")
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### External Health Checks
|
|
154
|
+
The health endpoints can be monitored by external systems:
|
|
155
|
+
|
|
156
|
+
- **Uptime monitoring**: Ping `/health/` endpoint
|
|
157
|
+
- **Performance monitoring**: Track `/health/detailed` response times
|
|
158
|
+
- **Alerting**: Monitor health percentage thresholds
|
|
159
|
+
|
|
160
|
+
### Docker Health Checks
|
|
161
|
+
The Docker container includes built-in health checks:
|
|
162
|
+
|
|
163
|
+
```dockerfile
|
|
164
|
+
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
|
|
165
|
+
CMD curl -f http://localhost:8000/health || exit 1
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Troubleshooting Health Issues
|
|
169
|
+
|
|
170
|
+
### Common Issues
|
|
171
|
+
|
|
172
|
+
**Health check timeouts:**
|
|
173
|
+
- Check if application is running on expected port
|
|
174
|
+
- Verify no firewall blocking connections
|
|
175
|
+
- Check application logs for startup errors
|
|
176
|
+
|
|
177
|
+
**High resource usage:**
|
|
178
|
+
- Monitor CPU/memory usage over time
|
|
179
|
+
- Check for memory leaks in long-running processes
|
|
180
|
+
- Review recent code changes{% if include_scheduler %}
|
|
181
|
+
|
|
182
|
+
**Scheduler issues:**
|
|
183
|
+
- Check scheduler logs for job failures
|
|
184
|
+
- Verify scheduled job configurations
|
|
185
|
+
- Monitor job execution times{% endif %}
|
|
186
|
+
|
|
187
|
+
### Debug Commands
|
|
188
|
+
```bash
|
|
189
|
+
# Check if service is running
|
|
190
|
+
curl http://localhost:8000/health/
|
|
191
|
+
|
|
192
|
+
# Check application logs
|
|
193
|
+
docker compose logs -f
|
|
194
|
+
|
|
195
|
+
# Monitor resource usage
|
|
196
|
+
docker stats
|
|
197
|
+
|
|
198
|
+
# Test CLI connectivity
|
|
199
|
+
{{ project_slug }} health check --debug
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## Health Check Best Practices
|
|
203
|
+
|
|
204
|
+
1. **Regular Monitoring**: Set up automated health checks every 30-60 seconds
|
|
205
|
+
2. **Alerting Thresholds**: Alert when health percentage drops below 95%
|
|
206
|
+
3. **Response Time Monitoring**: Alert on health check response times > 1 second
|
|
207
|
+
4. **Component-Level Monitoring**: Monitor individual components, not just overall health
|
|
208
|
+
5. **Historical Tracking**: Store health metrics for trend analysis
|
|
209
|
+
|
|
210
|
+
## Customizing Health Checks
|
|
211
|
+
|
|
212
|
+
To add custom health checks, extend the system service:
|
|
213
|
+
|
|
214
|
+
```python
|
|
215
|
+
# app/services/system_service.py
|
|
216
|
+
async def check_database_health() -> ComponentHealth:
|
|
217
|
+
"""Check database connectivity."""
|
|
218
|
+
try:
|
|
219
|
+
# Perform database ping
|
|
220
|
+
start_time = datetime.now(UTC)
|
|
221
|
+
# ... database check logic ...
|
|
222
|
+
end_time = datetime.now(UTC)
|
|
223
|
+
|
|
224
|
+
return ComponentHealth(
|
|
225
|
+
status="healthy",
|
|
226
|
+
details={
|
|
227
|
+
"connection_pool": "active",
|
|
228
|
+
"query_response_ms": (end_time - start_time).total_seconds() * 1000
|
|
229
|
+
},
|
|
230
|
+
response_time_ms=(end_time - start_time).total_seconds() * 1000
|
|
231
|
+
)
|
|
232
|
+
except Exception as e:
|
|
233
|
+
return ComponentHealth(
|
|
234
|
+
status="unhealthy",
|
|
235
|
+
details={"error": str(e)},
|
|
236
|
+
response_time_ms=0
|
|
237
|
+
)
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Then register it in the health check system to have it included in all health reports.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// Mermaid configuration for dark/light mode support
|
|
2
|
+
document.addEventListener("DOMContentLoaded", function() {
|
|
3
|
+
// Function to get current theme
|
|
4
|
+
function getCurrentTheme() {
|
|
5
|
+
return document.querySelector('[data-md-color-scheme]').getAttribute('data-md-color-scheme');
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Function to configure Mermaid theme
|
|
9
|
+
function configureMermaid() {
|
|
10
|
+
const theme = getCurrentTheme();
|
|
11
|
+
const mermaidTheme = theme === 'slate' ? 'dark' : 'default';
|
|
12
|
+
|
|
13
|
+
mermaid.initialize({
|
|
14
|
+
startOnLoad: true,
|
|
15
|
+
theme: mermaidTheme,
|
|
16
|
+
themeVariables: {
|
|
17
|
+
// Light mode colors
|
|
18
|
+
primaryColor: theme === 'default' ? '#1976d2' : '#64b5f6',
|
|
19
|
+
primaryTextColor: theme === 'default' ? '#000000' : '#ffffff',
|
|
20
|
+
primaryBorderColor: theme === 'default' ? '#1976d2' : '#64b5f6',
|
|
21
|
+
lineColor: theme === 'default' ? '#333333' : '#ffffff',
|
|
22
|
+
secondaryColor: theme === 'default' ? '#e3f2fd' : '#1e1e1e',
|
|
23
|
+
tertiaryColor: theme === 'default' ? '#f5f5f5' : '#2d2d2d',
|
|
24
|
+
background: theme === 'default' ? '#ffffff' : '#1e1e1e',
|
|
25
|
+
mainBkg: theme === 'default' ? '#ffffff' : '#1e1e1e',
|
|
26
|
+
secondBkg: theme === 'default' ? '#f8f9fa' : '#2d2d2d',
|
|
27
|
+
tertiaryBkg: theme === 'default' ? '#e9ecef' : '#404040'
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
// Re-render all mermaid diagrams
|
|
32
|
+
if (typeof mermaid !== 'undefined') {
|
|
33
|
+
const mermaidElements = document.querySelectorAll('.mermaid');
|
|
34
|
+
mermaidElements.forEach((element, index) => {
|
|
35
|
+
element.removeAttribute('data-processed');
|
|
36
|
+
element.innerHTML = element.getAttribute('data-original') || element.innerHTML;
|
|
37
|
+
if (!element.getAttribute('data-original')) {
|
|
38
|
+
element.setAttribute('data-original', element.innerHTML);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
mermaid.init();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Initial configuration
|
|
46
|
+
configureMermaid();
|
|
47
|
+
|
|
48
|
+
// Listen for theme changes
|
|
49
|
+
const observer = new MutationObserver(function(mutations) {
|
|
50
|
+
mutations.forEach(function(mutation) {
|
|
51
|
+
if (mutation.type === 'attributes' && mutation.attributeName === 'data-md-color-scheme') {
|
|
52
|
+
setTimeout(configureMermaid, 100); // Small delay to ensure theme is applied
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
// Start observing theme changes
|
|
58
|
+
const target = document.querySelector('[data-md-color-scheme]');
|
|
59
|
+
if (target) {
|
|
60
|
+
observer.observe(target, { attributes: true });
|
|
61
|
+
}
|
|
62
|
+
});
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/* Mermaid diagram styling for light and dark modes */
|
|
2
|
+
|
|
3
|
+
/* Base mermaid diagram styling */
|
|
4
|
+
.mermaid {
|
|
5
|
+
text-align: center;
|
|
6
|
+
margin: 1em 0;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/* Light mode styling */
|
|
10
|
+
[data-md-color-scheme="default"] .mermaid {
|
|
11
|
+
--mermaid-primary-color: #1976d2;
|
|
12
|
+
--mermaid-primary-text-color: #000000;
|
|
13
|
+
--mermaid-primary-border-color: #1976d2;
|
|
14
|
+
--mermaid-line-color: #333333;
|
|
15
|
+
--mermaid-secondary-color: #e3f2fd;
|
|
16
|
+
--mermaid-tertiary-color: #f5f5f5;
|
|
17
|
+
--mermaid-background: #ffffff;
|
|
18
|
+
--mermaid-main-bkg: #ffffff;
|
|
19
|
+
--mermaid-second-bkg: #f8f9fa;
|
|
20
|
+
--mermaid-tertiary-bkg: #e9ecef;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Dark mode styling */
|
|
24
|
+
[data-md-color-scheme="slate"] .mermaid {
|
|
25
|
+
--mermaid-primary-color: #64b5f6;
|
|
26
|
+
--mermaid-primary-text-color: #ffffff;
|
|
27
|
+
--mermaid-primary-border-color: #64b5f6;
|
|
28
|
+
--mermaid-line-color: #ffffff;
|
|
29
|
+
--mermaid-secondary-color: #1e1e1e;
|
|
30
|
+
--mermaid-tertiary-color: #2d2d2d;
|
|
31
|
+
--mermaid-background: #1e1e1e;
|
|
32
|
+
--mermaid-main-bkg: #1e1e1e;
|
|
33
|
+
--mermaid-second-bkg: #2d2d2d;
|
|
34
|
+
--mermaid-tertiary-bkg: #404040;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Ensure mermaid diagrams are visible in dark mode */
|
|
38
|
+
[data-md-color-scheme="slate"] .mermaid svg {
|
|
39
|
+
background: transparent !important;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
[data-md-color-scheme="slate"] .mermaid .node rect,
|
|
43
|
+
[data-md-color-scheme="slate"] .mermaid .node circle,
|
|
44
|
+
[data-md-color-scheme="slate"] .mermaid .node ellipse,
|
|
45
|
+
[data-md-color-scheme="slate"] .mermaid .node polygon {
|
|
46
|
+
fill: var(--mermaid-main-bkg) !important;
|
|
47
|
+
stroke: var(--mermaid-primary-border-color) !important;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
[data-md-color-scheme="slate"] .mermaid .node .label {
|
|
51
|
+
color: var(--mermaid-primary-text-color) !important;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
[data-md-color-scheme="slate"] .mermaid .edgePath .path {
|
|
55
|
+
stroke: var(--mermaid-line-color) !important;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
[data-md-color-scheme="slate"] .mermaid .edgeLabel {
|
|
59
|
+
background-color: var(--mermaid-background) !important;
|
|
60
|
+
color: var(--mermaid-primary-text-color) !important;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Flowchart specific styling */
|
|
64
|
+
[data-md-color-scheme="slate"] .mermaid .cluster rect {
|
|
65
|
+
fill: var(--mermaid-second-bkg) !important;
|
|
66
|
+
stroke: var(--mermaid-primary-border-color) !important;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
[data-md-color-scheme="slate"] .mermaid .cluster .label {
|
|
70
|
+
color: var(--mermaid-primary-text-color) !important;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* Sequence diagram specific styling */
|
|
74
|
+
[data-md-color-scheme="slate"] .mermaid .actor {
|
|
75
|
+
fill: var(--mermaid-main-bkg) !important;
|
|
76
|
+
stroke: var(--mermaid-primary-border-color) !important;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
[data-md-color-scheme="slate"] .mermaid .actor-line {
|
|
80
|
+
stroke: var(--mermaid-line-color) !important;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
[data-md-color-scheme="slate"] .mermaid .messageLine0,
|
|
84
|
+
[data-md-color-scheme="slate"] .mermaid .messageLine1 {
|
|
85
|
+
stroke: var(--mermaid-line-color) !important;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
[data-md-color-scheme="slate"] .mermaid .messageText {
|
|
89
|
+
fill: var(--mermaid-primary-text-color) !important;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
[data-md-color-scheme="slate"] .mermaid .note {
|
|
93
|
+
fill: var(--mermaid-tertiary-bkg) !important;
|
|
94
|
+
stroke: var(--mermaid-primary-border-color) !important;
|
|
95
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# mkdocs.yml
|
|
2
|
+
site_name: {{ project_name }}
|
|
3
|
+
site_description: {{ project_description }}
|
|
4
|
+
site_author: {{ author_name }}
|
|
5
|
+
site_url: https://{{ github_username }}.github.io/{{ project_slug }}/
|
|
6
|
+
|
|
7
|
+
theme:
|
|
8
|
+
name: material
|
|
9
|
+
palette:
|
|
10
|
+
# Palette toggle for light vs dark mode
|
|
11
|
+
- scheme: default
|
|
12
|
+
toggle:
|
|
13
|
+
icon: material/brightness-7
|
|
14
|
+
name: Switch to dark mode
|
|
15
|
+
- scheme: slate
|
|
16
|
+
toggle:
|
|
17
|
+
icon: material/brightness-4
|
|
18
|
+
name: Switch to light mode
|
|
19
|
+
features:
|
|
20
|
+
- navigation.tabs
|
|
21
|
+
- navigation.top
|
|
22
|
+
- search.highlight
|
|
23
|
+
- search.suggest
|
|
24
|
+
- content.code.copy
|
|
25
|
+
|
|
26
|
+
# Navigation structure
|
|
27
|
+
nav:
|
|
28
|
+
- Home: index.md
|
|
29
|
+
- Development: development.md
|
|
30
|
+
- API Reference: api.md
|
|
31
|
+
- Health Monitoring: health.md{%- if include_scheduler %}
|
|
32
|
+
- Components:
|
|
33
|
+
- Scheduler: components/scheduler.md{% endif %}
|
|
34
|
+
|
|
35
|
+
# Plugins
|
|
36
|
+
plugins:
|
|
37
|
+
- gen-files:
|
|
38
|
+
scripts:
|
|
39
|
+
- scripts/gen_docs.py
|
|
40
|
+
- search
|
|
41
|
+
- mkdocstrings:
|
|
42
|
+
handlers:
|
|
43
|
+
python:
|
|
44
|
+
options:
|
|
45
|
+
show_root_heading: true
|
|
46
|
+
show_source: true
|
|
47
|
+
|
|
48
|
+
# Markdown extensions
|
|
49
|
+
markdown_extensions:
|
|
50
|
+
- pymdownx.superfences:
|
|
51
|
+
custom_fences:
|
|
52
|
+
- name: mermaid
|
|
53
|
+
class: mermaid
|
|
54
|
+
format: !!python/name:pymdownx.superfences.fence_code_format
|
|
55
|
+
|
|
56
|
+
# Additional configuration for Mermaid dark mode support
|
|
57
|
+
extra_javascript:
|
|
58
|
+
- https://unpkg.com/mermaid@10.6.0/dist/mermaid.min.js
|
|
59
|
+
- javascripts/mermaid-config.js
|
|
60
|
+
|
|
61
|
+
extra_css:
|
|
62
|
+
- stylesheets/mermaid.css
|