aegis-stack 0.9.0__tar.gz → 0.9.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/.gitignore +1 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/CHANGELOG.md +73 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/PKG-INFO +2 -2
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/__init__.py +1 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/guided.py +107 -12
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/interactive.py +36 -6
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/init.py +2 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/constants.py +7 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/copier_manager.py +7 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/manual_updater.py +9 -87
- aegis_stack-0.9.1/aegis/core/migration_generator.py +4198 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/post_gen_tasks.py +3 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/services.py +93 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/template_cleanup.py +209 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/template_generator.py +6 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/de.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/en.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/es.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/fr.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/ja.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/ko.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/ru.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/zh.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/zh_hant.py +4 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.copier-answers.yml.jinja +4 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.env.example.jinja +26 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.env.ports +2 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/env.py.jinja +37 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/finance.py.jinja +221 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/main.py.jinja +8 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/finance/__init__.py +1 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/finance/router.py.jinja +326 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/routing.py.jinja +6 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/component_health.py.jinja +7 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/database_init.py.jinja +16 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/__init__.py.jinja +8 -2
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_utils.py.jinja +6 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/finance_card.py +93 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/__init__.py.jinja +6 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/finance_modal.py +388 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/status_overview.py.jinja +14 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/main.py.jinja +17 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/config.py.jinja +34 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/__init__.py +5 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/constants.py +32 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/deps.py.jinja +35 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/finance_service.py +753 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/health.py +51 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/import_service.py +535 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/importers/__init__.py +1 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/importers/base.py +158 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/importers/csv_profiles.py +177 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/importers/ofx.py +54 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/importers/qif.py +150 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/jobs.py.jinja +47 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/models.py.jinja +2008 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/networth_service.py +281 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/schemas.py +302 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/finance/seed.py.jinja +139 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/ui.py.jinja +6 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/pyproject.toml.jinja +5 -2
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/find-free-port.sh +73 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_finance_endpoints.py +336 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/conftest.py.jinja +38 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_amex.csv +3 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_chase.qfx +24 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_chase_cc.csv +3 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_chase_checking.csv +4 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_quicken.qif +46 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_quicken_all.csv +15 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/finance/fixtures/sample_quicken_mac.csv +6 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_finance_import.py +726 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_finance_models.py +2018 -0
- aegis_stack-0.9.1/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_finance_service.py +651 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_models.py +6 -2
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/pyproject.toml +6 -2
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/conftest.py +3 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_ai_configuration.py +9 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_guided.py +263 -41
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_interactive_project_selection.py +54 -18
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_interactive_scheduler.py +13 -3
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_issue_715_shared_file_divergence.py +3 -2
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_scheduler_persistence.py +13 -1
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_services_cli.py +2 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_stack_generation.py +16 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_migration_generator.py +109 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_migration_spec.py +2 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_services.py +35 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_template_cleanup.py +166 -15
- aegis_stack-0.9.1/tests/test_runtime_dependencies.py +34 -0
- aegis_stack-0.9.0/aegis/core/migration_generator.py +0 -1948
- aegis_stack-0.9.0/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/find-free-port.sh +0 -52
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/LICENSE +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/README.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/__main__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/brand.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/build_plan.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/callbacks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/validation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/cli/validators.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/add.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/add_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/components.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/deploy.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/ingress.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/plugins.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/remove.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/remove_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/services.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/update.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/commands/version.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/config/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/config/defaults.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/config/shared_files.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/ai_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/auth_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/build_reporter.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/component_files.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/component_utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/components.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/copier_updater.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/dependency_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/file_manifest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/insights_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/migration_spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/option_spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/compat.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/composer.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/discovery.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/scaffold.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/plugins/template_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/project_map.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/service_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/verbosity.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/core/version_compatibility.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/locales/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/i18n/registry.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.dockerignore +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.env.deploy.example.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.github/workflows/ci.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.github/workflows/security.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.gitignore +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.pre-commit-config.yaml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/.python-version.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/Dockerfile.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/Makefile.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/README.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/alembic.ini.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/script.py.mako +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/alembic/versions/.gitkeep +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/_i18n_click.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/ai_rendering.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/api_load_test.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/auth.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/blog.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/chat_completer.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/comms.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/dns.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/docs.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/insights.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/llm.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/load_test.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/marko_terminal_renderer.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/migrate_fix.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/payment.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/rag.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/slash_commands.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/status_line.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/tasks.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/cli/theme.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/ai/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/oauth.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/auth/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/blog/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/blog/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/comms/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/comms/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/deps.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/events.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/insights.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/llm/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/llm/router.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/load_test_api.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/metrics.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/models.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/orgs/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/orgs/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/payment/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/payment/pages.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/payment/router.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/rag/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/rag/router.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/scheduler.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/task_history.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/traffic.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/voice/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/voice/router.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker_dramatiq.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/api/worker_taskiq.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/hooks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/main.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/cors.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/logfire_tracing.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/performance.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/session.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/middleware/traffic.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/security/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/security/rate_limit.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/cleanup.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/shutdown/payment_webhook_forwarder.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/backend/startup/payment_webhook_forwarder.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/auth/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/auth/login_view.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/auth/register_view.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/auth/session.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/action_menu.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/auth/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/auth/auth_shell.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/auth/branding_panel.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/auth/oauth_button.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/brand_mark.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/buttons.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/data_table.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/expand_arrow.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/expandable_data_table.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/form_fields.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/labeled_divider.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/method_badge.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/section_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/service_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/severity_filter.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/snack_bar.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/status_dot.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/table.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/tag.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/tech_badge.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/text.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/views/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/views/base.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/controls/views/legacy_dashboard.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/core/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/core/events.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/core/routes.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/core/routing.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/activity_feed.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ai_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/auth_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/base_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/blog_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_container.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/card_factory.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/comms_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/database_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ingress_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/insights_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/observability_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/ollama_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/payment_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/redis_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/scheduler_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/server_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/services_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/cards/worker_card.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/diagram/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/diagram/diagram_canvas.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/diagram/diagram_node.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/diagram/diagram_view.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/diagram/layout.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/ai_analytics_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/ai_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/auth_modal.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/auth_orgs_tab.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/auth_sessions_tab.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/auth_users_tab.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/backend_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/base_detail_popup.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/base_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/base_popup.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/blog_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/comms_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/database_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/frontend_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/history_table.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/ingress_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/insights_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/llm_catalog_tab.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/load_tests_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/modal_constants.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/modal_sections.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/observability_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/ollama_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/payment_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/rag_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/redis_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/scheduler_history_section.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/scheduler_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/task_history_section.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/voice_settings_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/dashboard/modals/worker_modal.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/main.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/projects/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/projects/active_project.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/projects/project_form_view.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/projects/project_list_view.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/projects/project_switcher.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/state/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/state/session_state.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/styles.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/frontend/theme.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/scheduler/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/CLAUDE.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/broker_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/broker_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/constants.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/events.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/heartbeat.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/middleware_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/middleware_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/pools_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/load_test_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/media.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/queues/system_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/registry_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/task_history.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/load_tasks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/simple_system_tasks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/components/worker/tasks/system_tasks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/audit.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/cache.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/constants.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/db.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/encryption.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/formatting.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/log.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/route_auth.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/core/security.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/scheduler.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/entrypoints/webserver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/de.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/en.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/es.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/fr.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/ja.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/ko.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/ru.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/zh.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/locales/zh_hant.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/i18n/registry.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/integrations/main.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/conversation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/org.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/refresh_token.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/models/user.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/py.typed +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/conversation.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/clients/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/clients/litellm_client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/clients/openrouter_client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/llm_sync_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/mappers/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/etl/mappers/llm_mapper.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/fixtures/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/fixtures/llm_fixtures.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/health_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/jobs.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/llm_catalog_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/llm_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/large_language_model.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/llm_deployment.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/llm_modality.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/llm_price.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/llm_usage.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/models/llm/llm_vendor.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/ollama.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/prompts.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/provider_management.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/providers.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/rag_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/rag_stats_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/usage_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/catalog.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/stt/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/stt/config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/stt/providers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/stt/service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/stt/usage.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/tts/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/tts/config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/tts/providers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/tts/service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ai/voice/tts/usage.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/auth_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/cleanup_jobs.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/deps.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/hooks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/invite_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/membership_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/org_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/refresh_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/auth/user_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/middleware_inspector.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/models.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/backend/route_inspector.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/blog_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/constants.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/deps.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/health.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/schemas.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/blog/serialization.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/call.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/email.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/health.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/sms.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/comms/webhooks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collector_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/base.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/github_events.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/github_stars.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/github_traffic.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/plausible.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/pypi.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/collectors/reddit.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/constants.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/deps.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/event_schemas.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/event_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/goal_catalog.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/goal_schemas.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/goal_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/insight_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/jobs.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/models.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/project_schemas.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/project_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/query_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/schemas.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/seed.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/view_cache.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/view_schemas.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/insights/view_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/api/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/api/discovery.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/api/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/api/service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/common/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/common/analysis.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/common/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/common/storage.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/worker/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/worker/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/worker/service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/worker/service_dramatiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test/worker/service_taskiq.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/load_test_workloads.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/adapters/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/adapters/porkbun.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/adapters/resend.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/audit.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/email_setup.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/protocols.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/ops/types.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/catalog.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/constants.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/deps.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_helpers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/_layout.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/_macros.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/invoice_paid.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/payment_failed.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/refund_processed.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/subscription_canceled.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/subscription_started.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/subscription_updated.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/email_templates/trial_ending_soon.html +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/fake_data.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/payment_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/providers/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/providers/base.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/providers/stripe.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/schemas.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/seed.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/payment/stripe_events.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/chunking.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/health.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/ids.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/loaders.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/models/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/rag/vectorstore.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/execution_log.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/models.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/scheduled_task_manager.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/task_monitor.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/scheduler/trigger.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/shared/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/activity.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/alerts.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/backup.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/env_config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health_db.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health_db_postgres.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/health_db_sqlite.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/app/services/system/models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57223!aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57224!aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57225!aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57533!aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57534!aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57538!aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57897!aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57898!aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!57904!aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58315!aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58316!aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58324!aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58837!aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58838!aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/.!58849!aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-dark.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto-square-backup.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/aegis-manifesto.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/icons/github.svg +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/icons/google.svg +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/assets/overseer.png +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/.env.example.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/README.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/docker-compose.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/mkdocs.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/clean-validation/pyproject.toml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.dev.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.prod.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docker-compose.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/api.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/api-load-testing.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/components/scheduler.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/development.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/health.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/javascripts/mermaid-config.js +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/services/comms/api.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/services/comms/cli.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/services/comms/index.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/services/comms/setup.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/docs/stylesheets/mermaid.css +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/mkdocs.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/entrypoint.sh.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/gen_docs.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/resolve-ports.sh +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/scripts/server-setup.sh.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/_test_org.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_ai_endpoints.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_auth_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_blog_endpoints.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_comms_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_health_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_insights_endpoints.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_insights_projects_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_load_test_api_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_metrics_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_oauth_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_org_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_payment_endpoints.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_scheduler_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_voice_endpoints.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/api/test_worker_endpoints.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_ai_rendering.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_api_load_test_cli.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_chat_completer.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_conversation_memory.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_docs.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_llm_cli.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_payment_trigger.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_slash_commands.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/cli/test_status_line.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/frontend/test_ai_analytics_utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_frontend_auth_session.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_frontend_base_view.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_frontend_routing.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_frontend_session_state.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_frontend_snack_bar.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_scheduler.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_worker_broker.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_worker_events.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/components/test_worker_heartbeat.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/_collector_fixtures.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/conftest.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/conftest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/test_litellm_client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/test_llm_mapper.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/test_llm_sync_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/etl/test_openrouter_client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_health.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_llm_catalog_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_llm_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_provider_management.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_provider_resolution.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_providers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_rag_stats_context.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/test_usage_tracking.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/conftest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_catalog.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_stt_config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_stt_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_stt_providers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_stt_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_tts_config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_tts_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_tts_providers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/ai/voice/test_tts_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/comms/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/comms/conftest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/comms/test_call.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/comms/test_email.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/comms/test_sms.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/rag/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/rag/test_chunking.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/rag/test_loaders.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/rag/test_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_api_load_test_discovery.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_api_load_test_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_api_load_test_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_auth_integration.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_blog_serialization.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_blog_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_github_events.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_github_stars.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_github_traffic.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_plausible.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_pypi.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_reddit.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_collector_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_component_integration.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_conversation_persistence.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_goal_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_health_logic.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_insight_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_insights_collectors.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_common.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_load_test_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_metrics_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_middleware_inspector.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_oauth_user_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_org_integration.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_payment_catalog.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_payment_models.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_payment_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_payment_webhook_forwarder.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_performance_middleware.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_performance_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_project_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_query_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_refresh_service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduled_task_manager.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduler_execution_log.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_scheduler_executions_read.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_system_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_traffic_monitor.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_traffic_tab.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/services/test_worker_health_registration.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_bulk_response.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_cache.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_cache_integration.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_client.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_core.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_docs_auth.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_encryption.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_factories_demo.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_formatting.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_host_port_resolution.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/tests/test_i18n.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/traefik/traefik.dev.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/copier-aegis-project/{{ project_slug }}/traefik/traefik.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/.github/workflows/test.yml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/.gitignore.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/.pre-commit-config.yaml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/Makefile.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/README.md.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/pyproject.toml.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/src/__PLUGIN_PKG__/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/src/__PLUGIN_PKG__/plugin.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/src/__PLUGIN_PKG__/templates/__PROJECT_SLUG__/app/services/__PLUGIN_NAME__/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/tests/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/aegis/templates/plugin_scaffold/tests/test_plugin.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/CLAUDE.md +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_plugin_resolver_integration.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_service_auth_regen.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_service_importable.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_service_migrations.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_service_preserves_state.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_add_worker.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_ai_backend_utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_auth_service_generation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_cli_basic.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_cli_init.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_component_dependencies.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_database_config.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_database_runtime.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_database_runtime_postgres.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_deploy_helpers.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_error_handling.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_interactive_service_selection.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_issue_686_integration.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_issue_715_three_way_merge.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_model_imports.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_plugins_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_plugins_create_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_plugins_update_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_post_gen_worker_cleanup.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_python_version.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_remove_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_replay_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_resolve_plugin.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_scheduler_backend.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_scheduler_postgres_migrations.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_service_callbacks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_shared_files_completeness.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_stack_validation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_update_command.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_update_feature_detection.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_worker_backend.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/cli/test_worker_streaming.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/config/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/config/test_defaults.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/conftest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_ai_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_auth_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_blog_template_render.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_component_files.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_component_utils.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_constants_usage.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_copier_answers_placement.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_copier_updater.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_file_manifest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_file_mapping_derivation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_i18n.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_ingress_component.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_insights_service_parser.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_issue_686_reconciliation.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_manual_updater_plugins.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_manual_updater_service.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_migrate_fix.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_observability_oom_renders.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_option_spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_pairs_well_with.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_compat.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_discovery.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_render_parity.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_scaffold.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_template_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_plugin_wiring.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_post_gen_tasks.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_provider_extra_mapping.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_service_resolver.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_spec_docs_paths.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/core/test_template_generator.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/fixtures/aegis_plugin_test/pyproject.toml +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/fixtures/aegis_plugin_test/src/aegis_plugin_test/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/fixtures/aegis_plugin_test/src/aegis_plugin_test/spec.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/fixtures/aegis_plugin_test/src/aegis_plugin_test/templates/{{ project_slug }}/app/services/test_plugin/__init__.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/fixtures/aegis_plugin_test/src/aegis_plugin_test/templates/{{ project_slug }}/app/services/test_plugin/service.py.jinja +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/integration/__init__.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/integration/conftest.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/integration/test_update_integration.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/scripts/test_worker_addition_workflow.sh +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/test_copier_redis_conditional.py +0 -0
- {aegis_stack-0.9.0 → aegis_stack-0.9.1}/tests/test_serve_port_autodiscovery.py +0 -0
|
@@ -7,6 +7,72 @@
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.9.1] - 2026-07-12
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Finance service (experimental)** (`aegis init --services finance`,
|
|
15
|
+
`aegis add-service finance`): a personal-finance aggregator service, marked
|
|
16
|
+
experimental in this release (schema, APIs, and CLI surface may change
|
|
17
|
+
between releases). Ships a 33-table schema
|
|
18
|
+
covering currencies and FX rates, institutions and connections (inline
|
|
19
|
+
AES-GCM-encrypted credentials), accounts, liabilities, valuations, balance
|
|
20
|
+
and net-worth snapshots, and a transaction ledger with splits, transfer
|
|
21
|
+
pairing, and two-lane provider/import dedup. Ships file import for CSV
|
|
22
|
+
(Chase and Quicken profiles), OFX/QFX, and QIF, a net-worth service, API
|
|
23
|
+
endpoints, seeded demo data, and a full test suite. Optional flags gate
|
|
24
|
+
Plaid (`finance_plaid`) and SnapTrade (`finance_snaptrade`) integration
|
|
25
|
+
scaffolding. Requires database and scheduler; recommends worker.
|
|
26
|
+
- **Neon setup guide**: dedicated `components/database/neon.md` page in the
|
|
27
|
+
tool docs, plus expanded database component docs.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **`aegis update` no longer invents merge conflicts on pristine projects**:
|
|
32
|
+
generated projects are ruff-formatted at init while template renders are
|
|
33
|
+
raw Jinja output, so the byte-level 3-way merge misread formatting as user
|
|
34
|
+
edits and conflicted wherever real template changes landed nearby. Python
|
|
35
|
+
files are now compared and merged through ruff normalization, matching
|
|
36
|
+
what the add/remove path already did, and the fallback path warns instead
|
|
37
|
+
of degrading silently.
|
|
38
|
+
- **ruff is now a runtime dependency**: installs without dev extras (uvx,
|
|
39
|
+
pip) previously had no ruff binary, so every Python merge silently fell
|
|
40
|
+
back to the raw byte-level path. A test now guards the dependency.
|
|
41
|
+
- **`find-free-port.sh` false-busy on macOS**: Darwin allocates ephemeral
|
|
42
|
+
source ports sequentially, so probing a port near a recent bind made
|
|
43
|
+
connect() pick source == destination and fail with EINVAL, which read as
|
|
44
|
+
busy for every candidate. The probe retries on EINVAL, keeping `make
|
|
45
|
+
serve` port autodiscovery reliable in and near the ephemeral range.
|
|
46
|
+
|
|
47
|
+
## [0.9.0] - 2026-07-06
|
|
48
|
+
|
|
49
|
+
### Added
|
|
50
|
+
|
|
51
|
+
- **Neon Postgres provider**: new `postgres_provider` template question
|
|
52
|
+
(`container` or `neon`). Local development keeps the Postgres container;
|
|
53
|
+
production points at Neon, with pooler-safe connection arguments detected
|
|
54
|
+
from the URL. No new dependencies. Guided and interactive init prompt for
|
|
55
|
+
the provider on Postgres stacks.
|
|
56
|
+
|
|
57
|
+
### Fixed
|
|
58
|
+
|
|
59
|
+
- **`aegis update` backfills new template questions**: questions added by a
|
|
60
|
+
newer template version (such as `postgres_provider`) are reconciled into
|
|
61
|
+
the project's preserved answers file during update instead of being lost.
|
|
62
|
+
- **Stripe webhook forwarder no longer stalls on chatty output**: the
|
|
63
|
+
dev-mode stripe-cli forwarder drains stdout in the background so a full
|
|
64
|
+
pipe cannot block secret capture, with timeout handling around reads.
|
|
65
|
+
|
|
66
|
+
### Changed
|
|
67
|
+
|
|
68
|
+
- **Dependency pins hardened**: `typer` pinned to 0.26.8 (newer releases
|
|
69
|
+
fail at class-body evaluation on Python 3.11/3.12); `copier` held below
|
|
70
|
+
9.15 (9.15 relocates the answers file out of the generated project, which
|
|
71
|
+
breaks `aegis update`), with a dependabot ignore rule so the ceiling is
|
|
72
|
+
not silently widened.
|
|
73
|
+
|
|
74
|
+
## [0.8.1] - 2026-06-28
|
|
75
|
+
|
|
10
76
|
### Added
|
|
11
77
|
|
|
12
78
|
- **Traffic monitor ("who's hammering you")**: Overseer's Backend modal gains a
|
|
@@ -34,6 +100,13 @@
|
|
|
34
100
|
back by a wall clock, and no extra tooling needs to be installed on the
|
|
35
101
|
deploy host. `--rollout-timeout` is now only a long runaway-guard ceiling.
|
|
36
102
|
|
|
103
|
+
### Fixed
|
|
104
|
+
|
|
105
|
+
- **`aegis update` records the correct template commit**: the commit stamped
|
|
106
|
+
into the answers file after an update could be wrong, which skewed the
|
|
107
|
+
starting point of the next update; it is now derived and verified
|
|
108
|
+
explicitly.
|
|
109
|
+
|
|
37
110
|
## [0.8.0] - 2026-06-15
|
|
38
111
|
|
|
39
112
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: aegis-stack
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.1
|
|
4
4
|
Summary: A production-ready FastAPI platform with modular components and a built-in control plane. Try: uvx aegis-stack init my-project
|
|
5
5
|
Project-URL: Homepage, https://aegis-stack.io
|
|
6
6
|
Project-URL: Documentation, https://docs.aegis-stack.io/
|
|
@@ -32,6 +32,7 @@ Requires-Dist: packaging>=24.0
|
|
|
32
32
|
Requires-Dist: pillow>=12.2.0
|
|
33
33
|
Requires-Dist: pyyaml>=6.0
|
|
34
34
|
Requires-Dist: rich>=13.0.0
|
|
35
|
+
Requires-Dist: ruff>=0.9.0
|
|
35
36
|
Requires-Dist: typer==0.26.8
|
|
36
37
|
Requires-Dist: urllib3>=2.7.0
|
|
37
38
|
Provides-Extra: dev
|
|
@@ -43,7 +44,6 @@ Requires-Dist: pre-commit>=3.7.0; extra == 'dev'
|
|
|
43
44
|
Requires-Dist: pytest-asyncio>=0.23.0; extra == 'dev'
|
|
44
45
|
Requires-Dist: pytest-xdist>=3.5.0; extra == 'dev'
|
|
45
46
|
Requires-Dist: pytest>=9.0.3; extra == 'dev'
|
|
46
|
-
Requires-Dist: ruff>=0.1.0; extra == 'dev'
|
|
47
47
|
Requires-Dist: sqlalchemy>=2.0.0; extra == 'dev'
|
|
48
48
|
Requires-Dist: ty>=0.0.8; extra == 'dev'
|
|
49
49
|
Provides-Extra: docs
|
|
@@ -39,6 +39,7 @@ from dataclasses import dataclass
|
|
|
39
39
|
|
|
40
40
|
import typer
|
|
41
41
|
from rich.align import Align
|
|
42
|
+
from rich.cells import cell_len
|
|
42
43
|
from rich.console import Console, Group, RenderableType
|
|
43
44
|
from rich.layout import Layout
|
|
44
45
|
from rich.padding import Padding
|
|
@@ -171,6 +172,64 @@ def _docs_url(spec: PluginSpec) -> str | None:
|
|
|
171
172
|
return f"{DOCS_BASE_URL}{spec.docs_path}/"
|
|
172
173
|
|
|
173
174
|
|
|
175
|
+
# The postgres provider screen offers Neon by name, so it links the page
|
|
176
|
+
# that explains it. Not a spec ``docs_path``: providers are choices inside
|
|
177
|
+
# the database component, not plugins with pages of their own.
|
|
178
|
+
_NEON_DOCS_URL = f"{DOCS_BASE_URL}components/database/neon/"
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _fit_url(url: str, width: int) -> str:
|
|
182
|
+
"""The deepest ancestor of ``url`` that fits in ``width`` cells.
|
|
183
|
+
|
|
184
|
+
Terminals without OSC 8 only linkify what they can SEE, so every form
|
|
185
|
+
this returns must be a complete, valid URL — scheme included, no
|
|
186
|
+
ellipsis, never wrapped. mkdocs directory-URLs make every ancestor of
|
|
187
|
+
a docs page a real page, so a narrow terminal degrades to a working
|
|
188
|
+
link one level up rather than a broken or dead one. Measures with
|
|
189
|
+
``cell_len`` (URLs are ASCII today, but the contract is cells). The
|
|
190
|
+
origin is the floor: callers must give it at least that much room.
|
|
191
|
+
"""
|
|
192
|
+
if cell_len(url) <= width:
|
|
193
|
+
return url
|
|
194
|
+
scheme, _, rest = url.partition("://")
|
|
195
|
+
host, _, path = rest.partition("/")
|
|
196
|
+
origin = f"{scheme}://{host}/"
|
|
197
|
+
segments = [s for s in path.split("/") if s]
|
|
198
|
+
while segments:
|
|
199
|
+
candidate = f"{origin}{'/'.join(segments)}/"
|
|
200
|
+
if cell_len(candidate) <= width:
|
|
201
|
+
return candidate
|
|
202
|
+
segments.pop()
|
|
203
|
+
return origin
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def _docs_line(url: str, width: int) -> Text:
|
|
207
|
+
"""One-line plain-text URL the terminal's own detection can linkify.
|
|
208
|
+
|
|
209
|
+
NO OSC 8 hyperlink, ever: terminals that see one suppress their own
|
|
210
|
+
URL detection for that region, and terminals that don't render OSC 8
|
|
211
|
+
then show no link at all — plain text is the only mechanism that
|
|
212
|
+
proved reliable across terminals. ``_fit_url`` keeps the visible text
|
|
213
|
+
a complete, valid URL at any width so detection always has a working
|
|
214
|
+
target.
|
|
215
|
+
"""
|
|
216
|
+
return Text(_fit_url(url, width), style=MUTED, justify="center", no_wrap=True)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def _one_datastore_note() -> str:
|
|
220
|
+
"""Shown on every screen whose engine pick doubles as the project default.
|
|
221
|
+
|
|
222
|
+
Picking postgres for the scheduler (or AI storage, or the database
|
|
223
|
+
itself) fixes the ONE datastore every later question reuses — the user
|
|
224
|
+
must learn that here, not when the AI storage screen silently skips.
|
|
225
|
+
"""
|
|
226
|
+
return _g(
|
|
227
|
+
"note.one_datastore",
|
|
228
|
+
"One datastore per project: choosing an engine here sets the "
|
|
229
|
+
"project database, shared by anything else that stores data.",
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
|
|
174
233
|
def _spec_blurb(spec: PluginSpec) -> str:
|
|
175
234
|
"""Localizable editorial paragraph for a spec.
|
|
176
235
|
|
|
@@ -222,6 +281,8 @@ class _Choice:
|
|
|
222
281
|
value: str
|
|
223
282
|
title: str
|
|
224
283
|
body: str = ""
|
|
284
|
+
# Docs page for THIS choice; rendered only while the choice is focused.
|
|
285
|
+
docs_url: str = ""
|
|
225
286
|
|
|
226
287
|
|
|
227
288
|
@dataclass
|
|
@@ -449,6 +510,7 @@ class GuidedSelectionUI:
|
|
|
449
510
|
),
|
|
450
511
|
choices,
|
|
451
512
|
crumb="amend",
|
|
513
|
+
note=_one_datastore_note(),
|
|
452
514
|
)
|
|
453
515
|
].value
|
|
454
516
|
|
|
@@ -515,14 +577,20 @@ class GuidedSelectionUI:
|
|
|
515
577
|
),
|
|
516
578
|
choices,
|
|
517
579
|
crumb="amend",
|
|
580
|
+
note=_one_datastore_note(),
|
|
518
581
|
)
|
|
519
582
|
].value
|
|
520
583
|
if engine == StorageBackends.POSTGRES:
|
|
521
|
-
return engine, self.
|
|
584
|
+
return engine, self.choose_postgres_provider(context, crumb="amend")
|
|
522
585
|
return engine, None
|
|
523
586
|
|
|
524
|
-
def
|
|
525
|
-
"""ONE screen for the PostgreSQL host: local container vs Neon (vs ...).
|
|
587
|
+
def choose_postgres_provider(self, context: str, *, crumb: str = "none") -> str:
|
|
588
|
+
"""ONE screen for the PostgreSQL host: local container vs Neon (vs ...).
|
|
589
|
+
|
|
590
|
+
The direct database path amends the Database crumb; indirect paths
|
|
591
|
+
(scheduler persistence, AI storage) pass no crumb — their
|
|
592
|
+
``note_auto_added`` call carries the chosen host into the sidebar.
|
|
593
|
+
"""
|
|
526
594
|
choices = [
|
|
527
595
|
_Choice(
|
|
528
596
|
PostgresProviders.CONTAINER,
|
|
@@ -539,6 +607,7 @@ class GuidedSelectionUI:
|
|
|
539
607
|
"choice.db_provider.neon",
|
|
540
608
|
"Serverless Postgres: cloud in prod, local container in dev.",
|
|
541
609
|
),
|
|
610
|
+
docs_url=_NEON_DOCS_URL,
|
|
542
611
|
),
|
|
543
612
|
]
|
|
544
613
|
return choices[
|
|
@@ -549,7 +618,12 @@ class GuidedSelectionUI:
|
|
|
549
618
|
context=context,
|
|
550
619
|
),
|
|
551
620
|
choices,
|
|
552
|
-
crumb=
|
|
621
|
+
crumb=crumb,
|
|
622
|
+
note=_g(
|
|
623
|
+
"note.one_database_host",
|
|
624
|
+
"One database per project: this host serves everything "
|
|
625
|
+
"that stores data.",
|
|
626
|
+
),
|
|
553
627
|
)
|
|
554
628
|
].value
|
|
555
629
|
|
|
@@ -623,6 +697,7 @@ class GuidedSelectionUI:
|
|
|
623
697
|
_g("prompt.ai_storage", "AI conversation storage"),
|
|
624
698
|
backend,
|
|
625
699
|
crumb="amend",
|
|
700
|
+
note=_one_datastore_note(),
|
|
626
701
|
)
|
|
627
702
|
].value
|
|
628
703
|
return self._configure_ai_extras(fw, be)
|
|
@@ -797,7 +872,7 @@ class GuidedSelectionUI:
|
|
|
797
872
|
docs = _docs_url(spec)
|
|
798
873
|
if docs:
|
|
799
874
|
grid.add_row(Text())
|
|
800
|
-
grid.add_row(
|
|
875
|
+
grid.add_row(_docs_line(docs, width))
|
|
801
876
|
|
|
802
877
|
hints = Text.assemble(
|
|
803
878
|
("enter", ACCENT),
|
|
@@ -1144,6 +1219,7 @@ class GuidedSelectionUI:
|
|
|
1144
1219
|
compact: bool = False,
|
|
1145
1220
|
crumb: str = "none",
|
|
1146
1221
|
label: str = "",
|
|
1222
|
+
note: str | None = None,
|
|
1147
1223
|
) -> int:
|
|
1148
1224
|
# Replay path: hand back the journaled answer, render nothing.
|
|
1149
1225
|
if self._cursor < len(self._journal):
|
|
@@ -1187,7 +1263,10 @@ class GuidedSelectionUI:
|
|
|
1187
1263
|
shortcuts.get("n", default_idx), choices, crumb, label
|
|
1188
1264
|
)
|
|
1189
1265
|
self._paint(
|
|
1190
|
-
self._frame(
|
|
1266
|
+
self._frame(
|
|
1267
|
+
self._body(prompt, choices, idx, context, compact, note=note),
|
|
1268
|
+
hints,
|
|
1269
|
+
)
|
|
1191
1270
|
)
|
|
1192
1271
|
key = self._key()
|
|
1193
1272
|
if key in ("q", "\x03"):
|
|
@@ -1492,6 +1571,7 @@ class GuidedSelectionUI:
|
|
|
1492
1571
|
cursor: int,
|
|
1493
1572
|
context: PluginSpec | None,
|
|
1494
1573
|
compact: bool,
|
|
1574
|
+
note: str | None = None,
|
|
1495
1575
|
) -> RenderableType:
|
|
1496
1576
|
width = self._content_width()
|
|
1497
1577
|
grid = Table.grid(padding=(0, 0))
|
|
@@ -1536,12 +1616,20 @@ class GuidedSelectionUI:
|
|
|
1536
1616
|
docs = _docs_url(context)
|
|
1537
1617
|
if docs:
|
|
1538
1618
|
grid.add_row(Text())
|
|
1539
|
-
|
|
1540
|
-
|
|
1541
|
-
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
)
|
|
1619
|
+
# cell_len, not len: CJK locales render the label at two
|
|
1620
|
+
# cells per character and an overflowing row ellipsizes
|
|
1621
|
+
# the URL into a broken link. When even the shortest URL
|
|
1622
|
+
# form can't fit beside the label, the URL gets its own
|
|
1623
|
+
# full-width line instead.
|
|
1624
|
+
label = f"{_g('screen.docs', 'Docs:')} "
|
|
1625
|
+
available = width - cell_len(label)
|
|
1626
|
+
display = _fit_url(docs, available)
|
|
1627
|
+
if cell_len(display) > available:
|
|
1628
|
+
grid.add_row(_docs_line(docs, width))
|
|
1629
|
+
else:
|
|
1630
|
+
docs_line = Text.assemble((label, LABEL), (display, MUTED))
|
|
1631
|
+
docs_line.no_wrap = True
|
|
1632
|
+
grid.add_row(docs_line)
|
|
1545
1633
|
grid.add_row(Text())
|
|
1546
1634
|
# The engine prompt carries quick-mode hints like "(will
|
|
1547
1635
|
# auto-add Redis)" that the Requires line already covers here,
|
|
@@ -1558,6 +1646,9 @@ class GuidedSelectionUI:
|
|
|
1558
1646
|
)
|
|
1559
1647
|
else:
|
|
1560
1648
|
grid.add_row(Text(prompt, style="bold", justify="center"))
|
|
1649
|
+
if note:
|
|
1650
|
+
grid.add_row(Text())
|
|
1651
|
+
grid.add_row(Text(note, style=MUTED, justify="center"))
|
|
1561
1652
|
|
|
1562
1653
|
grid.add_row(Text())
|
|
1563
1654
|
if compact:
|
|
@@ -1566,6 +1657,10 @@ class GuidedSelectionUI:
|
|
|
1566
1657
|
grid.add_row(self._chip_row(choices, cursor))
|
|
1567
1658
|
grid.add_row(Text())
|
|
1568
1659
|
grid.add_row(Text(choices[cursor].body, style=MUTED, justify="center"))
|
|
1660
|
+
docs_url = choices[cursor].docs_url
|
|
1661
|
+
if docs_url:
|
|
1662
|
+
grid.add_row(Text())
|
|
1663
|
+
grid.add_row(_docs_line(docs_url, width))
|
|
1569
1664
|
return grid
|
|
1570
1665
|
|
|
1571
1666
|
def _choice_line(self, choices: list[_Choice], cursor: int) -> Text:
|
|
@@ -196,6 +196,16 @@ def clear_postgres_provider_selection() -> None:
|
|
|
196
196
|
_postgres_provider_selection = None
|
|
197
197
|
|
|
198
198
|
|
|
199
|
+
def set_postgres_provider_selection(provider: str | None) -> None:
|
|
200
|
+
"""Pre-set the PostgreSQL host selection (for testing or CLI args).
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
provider: PostgresProviders value (container, neon) or None to clear
|
|
204
|
+
"""
|
|
205
|
+
global _postgres_provider_selection
|
|
206
|
+
_postgres_provider_selection = provider
|
|
207
|
+
|
|
208
|
+
|
|
199
209
|
def select_worker_backend() -> str:
|
|
200
210
|
"""
|
|
201
211
|
Interactive worker backend selection using arrow keys.
|
|
@@ -305,6 +315,8 @@ class SelectionUI(Protocol):
|
|
|
305
315
|
|
|
306
316
|
def choose_database_engine(self, context: str) -> tuple[str, str | None]: ...
|
|
307
317
|
|
|
318
|
+
def choose_postgres_provider(self, context: str) -> str: ...
|
|
319
|
+
|
|
308
320
|
def choose_scheduler_backend(self) -> str: ...
|
|
309
321
|
|
|
310
322
|
def configure_auth(self, service_name: str) -> str: ...
|
|
@@ -357,6 +369,9 @@ class TyperSelectionUI:
|
|
|
357
369
|
return engine, select_postgres_provider(context=context)
|
|
358
370
|
return engine, None
|
|
359
371
|
|
|
372
|
+
def choose_postgres_provider(self, context: str) -> str:
|
|
373
|
+
return select_postgres_provider(context=context)
|
|
374
|
+
|
|
360
375
|
def choose_scheduler_backend(self) -> str:
|
|
361
376
|
# Quick-mode shape preserved exactly: the persistence yes/no, then
|
|
362
377
|
# the engine picker (which reuses a previously chosen engine).
|
|
@@ -416,16 +431,23 @@ def _step_scheduler(
|
|
|
416
431
|
|
|
417
432
|
engine = ui.choose_scheduler_backend()
|
|
418
433
|
if engine != StorageBackends.MEMORY:
|
|
434
|
+
token = engine
|
|
419
435
|
if engine == StorageBackends.POSTGRES:
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
436
|
+
# The scheduler is what pulls the database in, so IT owns the
|
|
437
|
+
# container-vs-Neon question the skipped database step would
|
|
438
|
+
# have asked. Neon encodes as database[neon], same as the
|
|
439
|
+
# direct path.
|
|
440
|
+
provider = ui.choose_postgres_provider("Scheduler")
|
|
441
|
+
state.postgres_provider = provider
|
|
442
|
+
if provider == PostgresProviders.NEON:
|
|
443
|
+
token = PostgresProviders.NEON
|
|
444
|
+
state.components.append(f"{ComponentNames.DATABASE}[{token}]")
|
|
423
445
|
else:
|
|
424
446
|
state.components.append(ComponentNames.DATABASE)
|
|
425
447
|
state.database_engine = engine
|
|
426
448
|
state.database_added_by_scheduler = True
|
|
427
449
|
state.scheduler_backend = engine
|
|
428
|
-
ui.note_auto_added(ComponentNames.DATABASE,
|
|
450
|
+
ui.note_auto_added(ComponentNames.DATABASE, token)
|
|
429
451
|
ui.success(t("interactive.scheduler_db_configured", engine=engine.upper()))
|
|
430
452
|
|
|
431
453
|
# Bonus backup job only applies once a database is in the mix.
|
|
@@ -659,10 +681,18 @@ def _configure_ai_init(
|
|
|
659
681
|
if database_already_selected:
|
|
660
682
|
ui.success(f" {t('interactive.ai_db_already')}")
|
|
661
683
|
else:
|
|
662
|
-
|
|
684
|
+
token = backend
|
|
685
|
+
if backend == StorageBackends.POSTGRES:
|
|
686
|
+
# AI is what pulls the database in: ask the container-vs-Neon
|
|
687
|
+
# question the skipped database step would have asked.
|
|
688
|
+
provider = ui.choose_postgres_provider("AI")
|
|
689
|
+
state.postgres_provider = provider
|
|
690
|
+
if provider == PostgresProviders.NEON:
|
|
691
|
+
token = PostgresProviders.NEON
|
|
692
|
+
state.components.append(f"{ComponentNames.DATABASE}[{token}]")
|
|
663
693
|
# The AI choice just fixed the project's database engine.
|
|
664
694
|
state.database_engine = backend
|
|
665
|
-
ui.note_auto_added(ComponentNames.DATABASE,
|
|
695
|
+
ui.note_auto_added(ComponentNames.DATABASE, token)
|
|
666
696
|
ui.success(f" {t('interactive.ai_db_added', backend=backend)}")
|
|
667
697
|
|
|
668
698
|
# Bracket syntax for TemplateGenerator:
|
|
@@ -32,12 +32,14 @@ from ..core.components import (
|
|
|
32
32
|
ComponentType,
|
|
33
33
|
)
|
|
34
34
|
from ..core.service_resolver import ServiceResolver
|
|
35
|
+
from ..core.services import SERVICES
|
|
35
36
|
from ..core.template_generator import TemplateGenerator
|
|
36
37
|
from ..i18n import lazy_t, t
|
|
37
38
|
|
|
38
39
|
# Build services help text dynamically from constants
|
|
39
40
|
_SERVICES_HELP = lazy_t(
|
|
40
41
|
"init.help_opt_services",
|
|
42
|
+
services=", ".join(sorted(SERVICES)),
|
|
41
43
|
frameworks="|".join(sorted(FRAMEWORKS)),
|
|
42
44
|
backends="|".join(sorted(BACKENDS)),
|
|
43
45
|
providers="|".join(sorted(PROVIDERS)),
|
|
@@ -170,6 +170,7 @@ class AnswerKeys:
|
|
|
170
170
|
INSIGHTS = "include_insights"
|
|
171
171
|
PAYMENT = "include_payment"
|
|
172
172
|
BLOG = "include_blog"
|
|
173
|
+
FINANCE = "include_finance"
|
|
173
174
|
|
|
174
175
|
# Service names (used for selection/lookup)
|
|
175
176
|
SERVICE_AUTH = "auth"
|
|
@@ -178,6 +179,7 @@ class AnswerKeys:
|
|
|
178
179
|
SERVICE_INSIGHTS = "insights"
|
|
179
180
|
SERVICE_PAYMENT = "payment"
|
|
180
181
|
SERVICE_BLOG = "blog"
|
|
182
|
+
SERVICE_FINANCE = "finance"
|
|
181
183
|
|
|
182
184
|
# Insights source flags
|
|
183
185
|
INSIGHTS_GITHUB = "insights_github"
|
|
@@ -186,6 +188,11 @@ class AnswerKeys:
|
|
|
186
188
|
INSIGHTS_REDDIT = "insights_reddit"
|
|
187
189
|
INSIGHTS_PER_USER = "insights_per_user"
|
|
188
190
|
|
|
191
|
+
# Finance source flags
|
|
192
|
+
FINANCE_PLAID = "finance_plaid"
|
|
193
|
+
FINANCE_SNAPTRADE = "finance_snaptrade"
|
|
194
|
+
FINANCE_IMPORT = "finance_import"
|
|
195
|
+
|
|
189
196
|
# Payment configuration
|
|
190
197
|
PAYMENT_PROVIDER = "payment_provider"
|
|
191
198
|
|
|
@@ -186,6 +186,7 @@ def generate_with_copier(
|
|
|
186
186
|
AnswerKeys.PAYMENT_PROVIDER: template_context.get(
|
|
187
187
|
AnswerKeys.PAYMENT_PROVIDER, PaymentProviders.DEFAULT
|
|
188
188
|
),
|
|
189
|
+
AnswerKeys.FINANCE: template_context.get(AnswerKeys.FINANCE, "no") == "yes",
|
|
189
190
|
}
|
|
190
191
|
|
|
191
192
|
# Detect dev vs production mode for template sourcing
|
|
@@ -340,6 +341,8 @@ def generate_with_copier(
|
|
|
340
341
|
is_sqlite = database_engine == StorageBackends.SQLITE
|
|
341
342
|
is_payment_included: bool = copier_data.get(AnswerKeys.PAYMENT, False) is True
|
|
342
343
|
needs_migration_files = needs_migration_files or is_payment_included
|
|
344
|
+
is_finance_included: bool = copier_data.get(AnswerKeys.FINANCE, False) is True
|
|
345
|
+
needs_migration_files = needs_migration_files or is_finance_included
|
|
343
346
|
# Scheduler component: job_execution history table. Postgres only — the
|
|
344
347
|
# table lives in a ``scheduler`` schema (CREATE SCHEMA), which SQLite
|
|
345
348
|
# can't run; SQLite scheduler stacks get the table via create_all.
|
|
@@ -374,8 +377,12 @@ def generate_with_copier(
|
|
|
374
377
|
is True,
|
|
375
378
|
AnswerKeys.BLOG: is_blog_included,
|
|
376
379
|
AnswerKeys.PAYMENT: is_payment_included,
|
|
380
|
+
AnswerKeys.FINANCE: is_finance_included,
|
|
377
381
|
AnswerKeys.SCHEDULER: is_scheduler_included,
|
|
378
382
|
AnswerKeys.SCHEDULER_BACKEND: scheduler_backend_str,
|
|
383
|
+
# Finance tables live in a dedicated Postgres ``finance`` schema
|
|
384
|
+
# (dropped on SQLite); the migration variant is engine-resolved.
|
|
385
|
+
AnswerKeys.DATABASE_ENGINE: database_engine,
|
|
379
386
|
}
|
|
380
387
|
services = get_services_needing_migrations(context)
|
|
381
388
|
if services:
|
|
@@ -8,8 +8,6 @@ and copies files to the target project.
|
|
|
8
8
|
|
|
9
9
|
import shutil
|
|
10
10
|
import subprocess
|
|
11
|
-
import sys
|
|
12
|
-
import tempfile
|
|
13
11
|
from pathlib import Path
|
|
14
12
|
from typing import Any
|
|
15
13
|
|
|
@@ -25,7 +23,11 @@ from ..cli import brand
|
|
|
25
23
|
from .component_files import get_component_files, get_copier_defaults, get_template_path
|
|
26
24
|
from .copier_manager import is_copier_project, load_copier_answers
|
|
27
25
|
from .plugins.template_resolver import get_plugin_template_root
|
|
28
|
-
from .template_cleanup import
|
|
26
|
+
from .template_cleanup import (
|
|
27
|
+
merge_three_way_text,
|
|
28
|
+
normalize_for_compare,
|
|
29
|
+
run_ruff_on_text,
|
|
30
|
+
)
|
|
29
31
|
from .verbosity import verbose_print
|
|
30
32
|
|
|
31
33
|
# Constants
|
|
@@ -76,28 +78,9 @@ def _is_empty_stub(path: Path) -> bool:
|
|
|
76
78
|
return False
|
|
77
79
|
|
|
78
80
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
Strips per-line trailing whitespace and trailing blank lines, and
|
|
83
|
-
normalizes line endings. This absorbs the only difference between a
|
|
84
|
-
file as Copier wrote it at init and the same file as
|
|
85
|
-
``_render_template_file`` re-renders it: blank-line whitespace, which
|
|
86
|
-
differs because Copier and this module configure Jinja differently.
|
|
87
|
-
"""
|
|
88
|
-
lines = text.replace("\r\n", "\n").split("\n")
|
|
89
|
-
return "\n".join(line.rstrip() for line in lines).rstrip("\n")
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
def _ruff_executable() -> str | None:
|
|
93
|
-
"""Locate a ruff binary, preferring the one in the running interpreter's
|
|
94
|
-
environment. ``ruff`` is a runtime dependency of aegis, so this is
|
|
95
|
-
normally present; returns None if it cannot be found (callers then bias
|
|
96
|
-
toward preserving the file rather than overwriting it)."""
|
|
97
|
-
candidate = Path(sys.executable).parent / "ruff"
|
|
98
|
-
if candidate.is_file():
|
|
99
|
-
return str(candidate)
|
|
100
|
-
return shutil.which("ruff")
|
|
81
|
+
# Canonicalization/ruff helpers live in template_cleanup so the update-sync
|
|
82
|
+
# path can share them; imported above as normalize_for_compare / run_ruff_on_text.
|
|
83
|
+
_normalize_for_compare = normalize_for_compare
|
|
101
84
|
|
|
102
85
|
|
|
103
86
|
# Directories that should never be swept. Some contain authored content
|
|
@@ -690,68 +673,7 @@ class ManualUpdater:
|
|
|
690
673
|
The temp file lives in the project so ruff discovers the project's
|
|
691
674
|
``[tool.ruff]`` config by walking up from the file's location.
|
|
692
675
|
"""
|
|
693
|
-
|
|
694
|
-
if ruff is None:
|
|
695
|
-
return None
|
|
696
|
-
tmp_path = ""
|
|
697
|
-
try:
|
|
698
|
-
with tempfile.NamedTemporaryFile(
|
|
699
|
-
"w",
|
|
700
|
-
suffix=".py",
|
|
701
|
-
dir=str(self.project_path),
|
|
702
|
-
delete=False,
|
|
703
|
-
encoding="utf-8",
|
|
704
|
-
) as handle:
|
|
705
|
-
handle.write(src)
|
|
706
|
-
tmp_path = handle.name
|
|
707
|
-
steps: list[list[str]] = []
|
|
708
|
-
if check_select == "":
|
|
709
|
-
steps.append([ruff, "check", "--fix", "--quiet", tmp_path])
|
|
710
|
-
elif check_select is not None:
|
|
711
|
-
steps.append(
|
|
712
|
-
[
|
|
713
|
-
ruff,
|
|
714
|
-
"check",
|
|
715
|
-
"--fix",
|
|
716
|
-
"--select",
|
|
717
|
-
check_select,
|
|
718
|
-
"--quiet",
|
|
719
|
-
tmp_path,
|
|
720
|
-
]
|
|
721
|
-
)
|
|
722
|
-
steps.append([ruff, "format", "--quiet", tmp_path])
|
|
723
|
-
for args in steps:
|
|
724
|
-
proc = run_resilient(
|
|
725
|
-
args,
|
|
726
|
-
cwd=str(self.project_path),
|
|
727
|
-
capture_output=True,
|
|
728
|
-
timeout=30,
|
|
729
|
-
retry_on_signal_kill=True,
|
|
730
|
-
# A merged .py file spawns ~6 ruff subprocesses; under a
|
|
731
|
-
# parallel test/CI run that contends with uv/git/copier,
|
|
732
|
-
# fork failures (EAGAIN) and timeouts spike briefly. A
|
|
733
|
-
# wider retry budget rides out the spike instead of
|
|
734
|
-
# silently degrading the merge to preserve+warn.
|
|
735
|
-
retries=5,
|
|
736
|
-
backoff=1.0,
|
|
737
|
-
)
|
|
738
|
-
# ``ruff check --fix`` exits 1 when fixable issues remain after
|
|
739
|
-
# fixing (normal — e.g. unfixable lint rules); only >=2 is a
|
|
740
|
-
# real error (bad config, unreadable file). ``ruff format``
|
|
741
|
-
# exits non-zero only on error (e.g. unparseable input). Either
|
|
742
|
-
# way, bail to None so the caller preserves the file rather than
|
|
743
|
-
# acting on partially/unformatted output.
|
|
744
|
-
is_format = args[1] == "format"
|
|
745
|
-
if (is_format and proc.returncode != 0) or (
|
|
746
|
-
not is_format and proc.returncode >= 2
|
|
747
|
-
):
|
|
748
|
-
return None
|
|
749
|
-
return Path(tmp_path).read_text()
|
|
750
|
-
except (OSError, subprocess.SubprocessError):
|
|
751
|
-
return None
|
|
752
|
-
finally:
|
|
753
|
-
if tmp_path:
|
|
754
|
-
Path(tmp_path).unlink(missing_ok=True)
|
|
676
|
+
return run_ruff_on_text(src, self.project_path, check_select)
|
|
755
677
|
|
|
756
678
|
def _ruff_normalize(self, src: str) -> str | None:
|
|
757
679
|
"""Return ``src`` run through the project's full ruff (check --fix + format).
|