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.
Files changed (392) hide show
  1. aegis/__init__.py +5 -0
  2. aegis/__main__.py +51 -0
  3. aegis/cli/__init__.py +6 -0
  4. aegis/cli/callbacks.py +114 -0
  5. aegis/cli/interactive.py +611 -0
  6. aegis/cli/utils.py +70 -0
  7. aegis/cli/validators.py +34 -0
  8. aegis/commands/__init__.py +6 -0
  9. aegis/commands/add.py +353 -0
  10. aegis/commands/add_service.py +332 -0
  11. aegis/commands/components.py +35 -0
  12. aegis/commands/init.py +370 -0
  13. aegis/commands/remove.py +227 -0
  14. aegis/commands/services.py +52 -0
  15. aegis/commands/update.py +252 -0
  16. aegis/commands/version.py +12 -0
  17. aegis/config/__init__.py +1 -0
  18. aegis/config/shared_files.py +136 -0
  19. aegis/core/CLAUDE.md +377 -0
  20. aegis/core/__init__.py +6 -0
  21. aegis/core/component_files.py +228 -0
  22. aegis/core/component_utils.py +220 -0
  23. aegis/core/components.py +127 -0
  24. aegis/core/copier_manager.py +315 -0
  25. aegis/core/copier_updater.py +475 -0
  26. aegis/core/dependency_resolver.py +119 -0
  27. aegis/core/manual_updater.py +554 -0
  28. aegis/core/post_gen_tasks.py +547 -0
  29. aegis/core/service_resolver.py +261 -0
  30. aegis/core/services.py +157 -0
  31. aegis/core/template_generator.py +266 -0
  32. aegis/core/version_compatibility.py +259 -0
  33. aegis/templates/CLAUDE.md +591 -0
  34. aegis/templates/cookiecutter-aegis-project/cookiecutter.json +39 -0
  35. aegis/templates/cookiecutter-aegis-project/hooks/post_gen_project.py +214 -0
  36. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.dockerignore +71 -0
  37. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.env.example.j2 +130 -0
  38. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/.gitignore +131 -0
  39. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Dockerfile +53 -0
  40. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/Makefile +236 -0
  41. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/README.md.j2 +196 -0
  42. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/alembic.ini.j2 +111 -0
  43. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/env.py.j2 +91 -0
  44. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/script.py.mako +25 -0
  45. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/alembic/versions/001_initial_auth.py.j2 +51 -0
  46. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/__init__.py +5 -0
  47. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/__init__.py +6 -0
  48. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai.py.j2 +700 -0
  49. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/ai_rendering.py +361 -0
  50. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/auth.py.j2 +253 -0
  51. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/health.py.j2 +419 -0
  52. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/load_test.py.j2 +656 -0
  53. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/main.py.j2 +65 -0
  54. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/marko_terminal_renderer.py +489 -0
  55. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/tasks.py.j2 +328 -0
  56. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/cli/{% if cookiecutter.include_scheduler == /"yes/" %}tasks.py{% endif %}" +340 -0
  57. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/__init__.py +0 -0
  58. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/__init__.py +0 -0
  59. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/__init__.py +8 -0
  60. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/ai/router.py +329 -0
  61. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/__init__.py +1 -0
  62. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/auth/router.py +64 -0
  63. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/deps.py +58 -0
  64. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/health.py +163 -0
  65. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/models.py.j2 +280 -0
  66. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/routing.py.j2 +32 -0
  67. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/scheduler.py.j2 +121 -0
  68. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/api/worker.py.j2 +478 -0
  69. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/hooks.py +144 -0
  70. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/main.py +31 -0
  71. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/__init__.py +1 -0
  72. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/middleware/cors.py +20 -0
  73. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/__init__.py +1 -0
  74. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/shutdown/cleanup.py +14 -0
  75. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/__init__.py +1 -0
  76. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/component_health.py.j2 +418 -0
  77. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/backend/startup/database_init.py.j2 +83 -0
  78. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/__init__.py +5 -0
  79. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/__init__.py +27 -0
  80. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/table.py +78 -0
  81. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/controls/text.py +142 -0
  82. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/__init__.py.j2 +47 -0
  83. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
  84. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
  85. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/base_card.py +256 -0
  86. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
  87. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
  88. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/database_card.py +420 -0
  89. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
  90. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
  91. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
  92. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
  93. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/services_card.py +233 -0
  94. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
  95. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/main.py.j2 +653 -0
  96. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/frontend/theme.py +48 -0
  97. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/__init__.py +1 -0
  98. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/scheduler/main.py.j2 +156 -0
  99. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/CLAUDE.md.j2 +213 -0
  100. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/__init__.py +6 -0
  101. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/constants.py.j2 +30 -0
  102. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/pools.py +97 -0
  103. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/__init__.py +1 -0
  104. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/load_test.py +55 -0
  105. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/media.py +49 -0
  106. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/queues/system.py +44 -0
  107. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/registry.py +139 -0
  108. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/__init__.py +120 -0
  109. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/load_tasks.py +507 -0
  110. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/simple_system_tasks.py +33 -0
  111. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/components/worker/tasks/system_tasks.py +281 -0
  112. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/config.py.j2 +178 -0
  113. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/constants.py +58 -0
  114. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/db.py.j2 +176 -0
  115. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/log.py +92 -0
  116. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/core/security.py +62 -0
  117. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/__init__.py +1 -0
  118. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/webserver.py +40 -0
  119. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/entrypoints/{% if cookiecutter.include_scheduler == /"yes/" %}scheduler.py{% endif %}" +21 -0
  120. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/__init__.py +0 -0
  121. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/integrations/main.py +62 -0
  122. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/__init__.py +1 -0
  123. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/models/user.py +44 -0
  124. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/py.typed +0 -0
  125. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/__init__.py +1 -0
  126. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/__init__.py +8 -0
  127. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/config.py +130 -0
  128. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/conversation.py +213 -0
  129. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/health.py +96 -0
  130. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/models.py +229 -0
  131. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/providers.py +370 -0
  132. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/ai/service.py +388 -0
  133. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/__init__.py +1 -0
  134. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/auth_service.py +41 -0
  135. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/health.py +164 -0
  136. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/auth/user_service.py +83 -0
  137. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/middleware_inspector.py.j2 +223 -0
  138. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/models.py.j2 +70 -0
  139. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/backend/route_inspector.py.j2 +155 -0
  140. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test.py +679 -0
  141. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/load_test_models.py +266 -0
  142. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/__init__.py.j2 +21 -0
  143. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/models.py.j2 +119 -0
  144. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/scheduled_task_manager.py.j2 +273 -0
  145. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/scheduler/task_monitor.py.j2 +189 -0
  146. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/__init__.py +15 -0
  147. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/shared/models.py +26 -0
  148. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/__init__.py +52 -0
  149. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/alerts.py +94 -0
  150. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/backup.py.j2 +119 -0
  151. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/health.py.j2 +1333 -0
  152. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/models.py +243 -0
  153. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/app/services/system/ui.py +52 -0
  154. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-dark.png +0 -0
  155. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto-square-backup.png +0 -0
  156. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/assets/aegis-manifesto.png +0 -0
  157. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.dockerignore +71 -0
  158. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.env.example.j2 +64 -0
  159. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/.gitignore +131 -0
  160. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Dockerfile +53 -0
  161. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/Makefile +211 -0
  162. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/README.md.j2 +172 -0
  163. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/docker-compose.yml.j2 +78 -0
  164. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/mkdocs.yml.j2 +62 -0
  165. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/pyproject.toml.j2 +120 -0
  166. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/clean-validation/uv.lock +1673 -0
  167. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docker-compose.yml.j2 +200 -0
  168. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/api.md +191 -0
  169. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md +0 -0
  170. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/components/scheduler.md.j2 +621 -0
  171. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/development.md +215 -0
  172. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/health.md +240 -0
  173. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/javascripts/mermaid-config.js +62 -0
  174. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/docs/stylesheets/mermaid.css +95 -0
  175. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/mkdocs.yml.j2 +62 -0
  176. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/pyproject.toml.j2 +131 -0
  177. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh +87 -0
  178. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/entrypoint.sh.j2 +93 -0
  179. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/scripts/gen_docs.py +16 -0
  180. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/__init__.py +1 -0
  181. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_auth_endpoints.py.j2 +307 -0
  182. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_health_endpoints.py.j2 +262 -0
  183. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_scheduler_endpoints.py.j2 +214 -0
  184. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/api/test_worker_endpoints.py.j2 +165 -0
  185. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_ai_rendering.py +427 -0
  186. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/cli/test_conversation_memory.py +465 -0
  187. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/components/test_scheduler.py +43 -0
  188. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/conftest.py.j2 +195 -0
  189. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/__init__.py +1 -0
  190. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/__init__.py +1 -0
  191. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/conftest.py +78 -0
  192. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_health.py +157 -0
  193. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_models.py +164 -0
  194. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/ai/test_service.py +198 -0
  195. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_auth_integration.py.j2 +528 -0
  196. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_component_integration.py.j2 +387 -0
  197. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_conversation_persistence.py +342 -0
  198. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_health_logic.py.j2 +663 -0
  199. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_models.py +619 -0
  200. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_load_test_service.py +603 -0
  201. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_middleware_inspector.py.j2 +248 -0
  202. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_scheduled_task_manager.py.j2 +292 -0
  203. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_system_service.py +98 -0
  204. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/services/test_worker_health_registration.py.j2 +257 -0
  205. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/tests/test_core.py +49 -0
  206. aegis/templates/cookiecutter-aegis-project/{{cookiecutter.project_slug}}/uv.lock +1673 -0
  207. aegis/templates/copier-aegis-project/{{ project_slug }}/.copier-answers.yml.jinja +21 -0
  208. aegis/templates/copier-aegis-project/{{ project_slug }}/.dockerignore +71 -0
  209. aegis/templates/copier-aegis-project/{{ project_slug }}/.env.example.jinja +130 -0
  210. aegis/templates/copier-aegis-project/{{ project_slug }}/.gitignore +131 -0
  211. aegis/templates/copier-aegis-project/{{ project_slug }}/Dockerfile +53 -0
  212. aegis/templates/copier-aegis-project/{{ project_slug }}/Makefile.jinja +236 -0
  213. aegis/templates/copier-aegis-project/{{ project_slug }}/README.md.jinja +196 -0
  214. aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/alembic.ini.jinja +111 -0
  215. aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/env.py.jinja +91 -0
  216. aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/script.py.mako +25 -0
  217. aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/versions/001_initial_auth.py.jinja +51 -0
  218. aegis/templates/copier-aegis-project/{{ project_slug }}/app/__init__.py.jinja +5 -0
  219. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/__init__.py.jinja +6 -0
  220. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai.py.jinja +700 -0
  221. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai_rendering.py +360 -0
  222. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/auth.py.jinja +253 -0
  223. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/health.py.jinja +419 -0
  224. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/load_test.py.jinja +656 -0
  225. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/main.py.jinja +65 -0
  226. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/marko_terminal_renderer.py +489 -0
  227. aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/tasks.py.jinja +328 -0
  228. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/__init__.py +0 -0
  229. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/__init__.py +0 -0
  230. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/__init__.py +8 -0
  231. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/router.py +329 -0
  232. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/__init__.py +1 -0
  233. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/router.py +64 -0
  234. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/deps.py +58 -0
  235. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/health.py.jinja +163 -0
  236. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/models.py.jinja +280 -0
  237. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/routing.py.jinja +32 -0
  238. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/scheduler.py.jinja +121 -0
  239. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker.py.jinja +478 -0
  240. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/hooks.py +144 -0
  241. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/main.py +31 -0
  242. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/__init__.py +1 -0
  243. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/cors.py +20 -0
  244. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/__init__.py +1 -0
  245. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/cleanup.py +14 -0
  246. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/__init__.py +1 -0
  247. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/component_health.py.jinja +418 -0
  248. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/database_init.py.jinja +83 -0
  249. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/__init__.py +5 -0
  250. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/__init__.py +27 -0
  251. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/table.py +78 -0
  252. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/text.py +142 -0
  253. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/__init__.py.jinja +47 -0
  254. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ai_card.py +287 -0
  255. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/auth_card.py +198 -0
  256. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/base_card.py +256 -0
  257. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_factory.py +227 -0
  258. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_utils.py +333 -0
  259. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/database_card.py +420 -0
  260. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/fastapi_card.py +328 -0
  261. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/flet_card.py +267 -0
  262. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/redis_card.py +322 -0
  263. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/scheduler_card.py +352 -0
  264. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/services_card.py +233 -0
  265. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/worker_card.py +684 -0
  266. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/main.py.jinja +653 -0
  267. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/theme.py +48 -0
  268. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/__init__.py +1 -0
  269. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/main.py.jinja +156 -0
  270. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/CLAUDE.md.jinja +213 -0
  271. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/__init__.py +6 -0
  272. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/constants.py.jinja +30 -0
  273. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools.py +97 -0
  274. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/__init__.py +1 -0
  275. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test.py +55 -0
  276. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/media.py +49 -0
  277. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system.py +44 -0
  278. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry.py +139 -0
  279. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/__init__.py +120 -0
  280. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/load_tasks.py +507 -0
  281. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/simple_system_tasks.py +33 -0
  282. aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/system_tasks.py +281 -0
  283. aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/config.py.jinja +178 -0
  284. aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/constants.py +58 -0
  285. aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/db.py.jinja +176 -0
  286. aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/log.py +92 -0
  287. aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/security.py +62 -0
  288. aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/__init__.py +1 -0
  289. aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/scheduler.py.jinja +21 -0
  290. aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/webserver.py +39 -0
  291. aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/__init__.py +0 -0
  292. aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/main.py +61 -0
  293. aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/__init__.py +1 -0
  294. aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/user.py +44 -0
  295. aegis/templates/copier-aegis-project/{{ project_slug }}/app/py.typed +0 -0
  296. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/__init__.py +1 -0
  297. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/__init__.py +8 -0
  298. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/config.py +130 -0
  299. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/conversation.py +213 -0
  300. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/health.py +96 -0
  301. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models.py +229 -0
  302. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/providers.py.jinja +370 -0
  303. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/service.py +387 -0
  304. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/__init__.py +1 -0
  305. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/auth_service.py +40 -0
  306. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/health.py +162 -0
  307. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/user_service.py +82 -0
  308. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/middleware_inspector.py.jinja +223 -0
  309. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/models.py.jinja +70 -0
  310. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/route_inspector.py.jinja +155 -0
  311. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test.py +678 -0
  312. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test_models.py +265 -0
  313. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/__init__.py.jinja +21 -0
  314. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/models.py.jinja +119 -0
  315. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/scheduled_task_manager.py.jinja +273 -0
  316. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/task_monitor.py.jinja +189 -0
  317. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/__init__.py +15 -0
  318. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/models.py +26 -0
  319. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/__init__.py +52 -0
  320. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/alerts.py +94 -0
  321. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/backup.py.jinja +119 -0
  322. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health.py.jinja +1333 -0
  323. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/models.py +243 -0
  324. aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/ui.py +52 -0
  325. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57223!aegis-manifesto.png +0 -0
  326. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57224!aegis-manifesto-dark.png +0 -0
  327. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57225!aegis-manifesto-square-backup.png +0 -0
  328. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57533!aegis-manifesto.png +0 -0
  329. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57534!aegis-manifesto-dark.png +0 -0
  330. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57538!aegis-manifesto-square-backup.png +0 -0
  331. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57897!aegis-manifesto.png +0 -0
  332. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57898!aegis-manifesto-dark.png +0 -0
  333. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57904!aegis-manifesto-square-backup.png +0 -0
  334. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58315!aegis-manifesto.png +0 -0
  335. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58316!aegis-manifesto-dark.png +0 -0
  336. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58324!aegis-manifesto-square-backup.png +0 -0
  337. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58837!aegis-manifesto.png +0 -0
  338. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58838!aegis-manifesto-dark.png +0 -0
  339. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58849!aegis-manifesto-square-backup.png +0 -0
  340. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-dark.png +0 -0
  341. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-square-backup.png +0 -0
  342. aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto.png +0 -0
  343. aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/.env.example.jinja +64 -0
  344. aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/README.md.jinja +172 -0
  345. aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/docker-compose.yml.jinja +78 -0
  346. aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/mkdocs.yml.jinja +62 -0
  347. aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/pyproject.toml.jinja +120 -0
  348. aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.yml.jinja +200 -0
  349. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/api.md.jinja +191 -0
  350. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md +0 -0
  351. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md.jinja +621 -0
  352. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/development.md.jinja +215 -0
  353. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/health.md.jinja +240 -0
  354. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/javascripts/mermaid-config.js +62 -0
  355. aegis/templates/copier-aegis-project/{{ project_slug }}/docs/stylesheets/mermaid.css +95 -0
  356. aegis/templates/copier-aegis-project/{{ project_slug }}/mkdocs.yml.jinja +62 -0
  357. aegis/templates/copier-aegis-project/{{ project_slug }}/pyproject.toml.jinja +131 -0
  358. aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh +87 -0
  359. aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh.jinja +93 -0
  360. aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/gen_docs.py +16 -0
  361. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/__init__.py +1 -0
  362. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_auth_endpoints.py.jinja +307 -0
  363. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_health_endpoints.py.jinja +262 -0
  364. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_scheduler_endpoints.py.jinja +214 -0
  365. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_worker_endpoints.py.jinja +165 -0
  366. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_ai_rendering.py +427 -0
  367. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_conversation_memory.py +465 -0
  368. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_scheduler.py +43 -0
  369. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/conftest.py.jinja +195 -0
  370. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/__init__.py +1 -0
  371. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/__init__.py +1 -0
  372. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/conftest.py +78 -0
  373. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_health.py +157 -0
  374. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_models.py +164 -0
  375. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_service.py +198 -0
  376. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_auth_integration.py.jinja +528 -0
  377. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_component_integration.py.jinja +387 -0
  378. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_conversation_persistence.py +342 -0
  379. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_health_logic.py.jinja +663 -0
  380. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_models.py +619 -0
  381. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_service.py +603 -0
  382. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_middleware_inspector.py.jinja +248 -0
  383. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduled_task_manager.py.jinja +292 -0
  384. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_system_service.py +98 -0
  385. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_worker_health_registration.py.jinja +257 -0
  386. aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_core.py +49 -0
  387. aegis/templates/copier-aegis-project/{{ project_slug }}/uv.lock +1673 -0
  388. aegis_stack-0.2.0rc2.dist-info/METADATA +165 -0
  389. aegis_stack-0.2.0rc2.dist-info/RECORD +392 -0
  390. aegis_stack-0.2.0rc2.dist-info/WHEEL +4 -0
  391. aegis_stack-0.2.0rc2.dist-info/entry_points.txt +3 -0
  392. 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 {{ cookiecutter.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 {{ cookiecutter.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
+ {{ cookiecutter.project_slug }}/
59
+ ├── app/
60
+ │ ├── components/ # Application components{% if cookiecutter.include_scheduler == "yes" %}
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 cookiecutter.include_scheduler == "yes" %}
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 cookiecutter.include_scheduler == "yes" %}
202
+
203
+ # Scheduler Configuration
204
+ SCHEDULER_TIMEZONE=UTC{% endif %}
205
+ ```
206
+
207
+ ## Monitoring and Health Checks
208
+
209
+ {{ cookiecutter.project_name }} includes comprehensive health monitoring:
210
+
211
+ - **Health Endpoints**: `/health/` and `/health/detailed`
212
+ - **CLI Commands**: `{{ cookiecutter.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
+ {{ cookiecutter.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
+ {{ cookiecutter.project_name }} provides a built-in CLI for health monitoring:
20
+
21
+ ### Basic Health Check
22
+ ```bash
23
+ {{ cookiecutter.project_slug }} health status
24
+ ```
25
+
26
+ **Output:**
27
+ ```
28
+ ✅ {{ cookiecutter.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 cookiecutter.include_scheduler == "yes" %}
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
+ {{ cookiecutter.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
+ {{ cookiecutter.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 cookiecutter.include_scheduler == "yes" %},
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
+ {{ cookiecutter.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 cookiecutter.include_scheduler == "yes" %}
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 cookiecutter.include_scheduler == "yes" %}
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
+ {{ cookiecutter.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: {{ cookiecutter.project_name }}
3
+ site_description: {{ cookiecutter.project_description }}
4
+ site_author: {{ cookiecutter.author_name }}
5
+ site_url: https://{{ cookiecutter.github_username }}.github.io/{{ cookiecutter.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 cookiecutter.include_scheduler == "yes" %}
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