svc-infra 0.1.618__tar.gz → 0.1.619__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.

Potentially problematic release.


This version of svc-infra might be problematic. Click here for more details.

Files changed (330) hide show
  1. {svc_infra-0.1.618 → svc_infra-0.1.619}/PKG-INFO +1 -1
  2. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/acceptance.md +1 -1
  3. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0005-data-lifecycle.md +1 -1
  4. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/cli.md +5 -5
  5. {svc_infra-0.1.618 → svc_infra-0.1.619}/pyproject.toml +1 -1
  6. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/ratelimit.py +13 -3
  7. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/__init__.py +17 -11
  8. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +4 -3
  9. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +4 -4
  10. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +11 -10
  11. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +2 -4
  12. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +3 -3
  13. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -3
  14. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/README.md +13 -13
  15. svc_infra-0.1.619/src/svc_infra/mcp/svc_infra_mcp.py +82 -0
  16. svc_infra-0.1.618/src/svc_infra/mcp/svc_infra_mcp.py +0 -67
  17. {svc_infra-0.1.618 → svc_infra-0.1.619}/README.md +0 -0
  18. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/acceptance-matrix.md +0 -0
  19. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0002-background-jobs-and-scheduling.md +0 -0
  20. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0003-webhooks-framework.md +0 -0
  21. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0004-tenancy-model.md +0 -0
  22. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0006-ops-slos-and-metrics.md +0 -0
  23. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0007-docs-and-sdks.md +0 -0
  24. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0008-billing-primitives.md +0 -0
  25. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/adr/0009-acceptance-harness.md +0 -0
  26. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/api.md +0 -0
  27. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/auth.md +0 -0
  28. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/cache.md +0 -0
  29. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/contributing.md +0 -0
  30. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/data-lifecycle.md +0 -0
  31. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/database.md +0 -0
  32. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/docs-and-sdks.md +0 -0
  33. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/environment.md +0 -0
  34. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/idempotency.md +0 -0
  35. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/jobs.md +0 -0
  36. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/observability.md +0 -0
  37. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/ops.md +0 -0
  38. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/rate-limiting.md +0 -0
  39. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/repo-review.md +0 -0
  40. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/security.md +0 -0
  41. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/tenancy.md +0 -0
  42. {svc_infra-0.1.618 → svc_infra-0.1.619}/docs/webhooks.md +0 -0
  43. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/__init__.py +0 -0
  44. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/README.md +0 -0
  45. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/__init__.py +0 -0
  46. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/alembic.py +0 -0
  47. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/models.py +0 -0
  48. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
  49. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/provider/aiydan.py +0 -0
  50. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/provider/base.py +0 -0
  51. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/provider/registry.py +0 -0
  52. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
  53. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/schemas.py +0 -0
  54. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/service.py +0 -0
  55. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/apf_payments/settings.py +0 -0
  56. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/__init__.py +0 -0
  57. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/__init__.py +0 -0
  58. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  59. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/apf_payments/router.py +0 -0
  60. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
  61. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
  62. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
  63. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/add.py +0 -0
  64. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
  65. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
  66. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
  67. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
  68. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
  69. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
  70. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
  71. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
  72. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
  73. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
  74. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
  75. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  76. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
  77. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
  78. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/routers/session_router.py +0 -0
  79. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/security.py +0 -0
  80. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
  81. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
  82. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/auth/state.py +0 -0
  83. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
  84. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  85. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  86. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/http.py +0 -0
  87. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
  88. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
  89. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
  90. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
  91. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  92. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
  93. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  94. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
  95. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
  96. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
  97. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
  98. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
  99. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +0 -0
  100. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
  101. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/docs/add.py +0 -0
  102. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
  103. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
  104. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  105. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
  106. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
  107. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  108. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/router.py +0 -0
  109. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  110. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/dx.py +0 -0
  111. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/ease.py +0 -0
  112. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
  113. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  114. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
  115. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  116. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
  117. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  118. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
  119. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
  120. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
  121. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
  122. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
  123. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +0 -0
  124. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +0 -0
  125. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +0 -0
  126. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
  127. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
  128. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
  129. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
  130. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
  131. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
  132. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
  133. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
  134. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
  135. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
  136. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/ops/add.py +0 -0
  137. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/pagination.py +0 -0
  138. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
  139. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  140. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  141. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  142. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  143. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
  144. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  145. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/setup.py +0 -0
  146. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/tenancy/add.py +0 -0
  147. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/api/fastapi/tenancy/context.py +0 -0
  148. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/README.md +0 -0
  149. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/__init__.py +0 -0
  150. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/env.py +0 -0
  151. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/logging/__init__.py +0 -0
  152. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/logging/add.py +0 -0
  153. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/logging/filter.py +0 -0
  154. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/logging/formats.py +0 -0
  155. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/app/root.py +0 -0
  156. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/billing/__init__.py +0 -0
  157. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/billing/models.py +0 -0
  158. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/billing/service.py +0 -0
  159. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/bundled_docs/README.md +0 -0
  160. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/bundled_docs/__init__.py +0 -0
  161. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/bundled_docs/getting-started.md +0 -0
  162. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/README.md +0 -0
  163. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/__init__.py +0 -0
  164. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/backend.py +0 -0
  165. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/decorators.py +0 -0
  166. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/demo.py +0 -0
  167. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/keys.py +0 -0
  168. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/recache.py +0 -0
  169. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/resources.py +0 -0
  170. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/tags.py +0 -0
  171. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/ttl.py +0 -0
  172. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cache/utils.py +0 -0
  173. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/__main__.py +0 -0
  174. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/__init__.py +0 -0
  175. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
  176. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
  177. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
  178. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
  179. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
  180. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/docs/docs_cmds.py +0 -0
  181. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
  182. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/dx/dx_cmds.py +0 -0
  183. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/help.py +0 -0
  184. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
  185. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +0 -0
  186. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
  187. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/sdk/__init__.py +0 -0
  188. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +0 -0
  189. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/foundation/__init__.py +0 -0
  190. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/foundation/runner.py +0 -0
  191. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
  192. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/data/add.py +0 -0
  193. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/data/backup.py +0 -0
  194. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/data/erasure.py +0 -0
  195. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/data/fixtures.py +0 -0
  196. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/data/retention.py +0 -0
  197. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/__init__.py +0 -0
  198. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/crud_schema.py +0 -0
  199. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/inbox.py +0 -0
  200. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/__init__.py +0 -0
  201. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/base.py +0 -0
  202. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/constants.py +0 -0
  203. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/core.py +0 -0
  204. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/indexes.py +0 -0
  205. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/management.py +0 -0
  206. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
  207. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/client.py +0 -0
  208. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
  209. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
  210. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  211. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  212. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  213. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/repository.py +0 -0
  214. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/resource.py +0 -0
  215. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/scaffold.py +0 -0
  216. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/service.py +0 -0
  217. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
  218. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/types.py +0 -0
  219. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/nosql/utils.py +0 -0
  220. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/outbox.py +0 -0
  221. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/README.md +0 -0
  222. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/__init__.py +0 -0
  223. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/apikey.py +0 -0
  224. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/authref.py +0 -0
  225. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/base.py +0 -0
  226. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/constants.py +0 -0
  227. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/core.py +0 -0
  228. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/management.py +0 -0
  229. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/repository.py +0 -0
  230. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/resource.py +0 -0
  231. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/scaffold.py +0 -0
  232. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/service.py +0 -0
  233. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
  234. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  235. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
  236. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  237. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  238. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  239. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  240. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
  241. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  242. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  243. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  244. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  245. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/tenant.py +0 -0
  246. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/types.py +0 -0
  247. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/uniq.py +0 -0
  248. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
  249. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/utils.py +0 -0
  250. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/sql/versioning.py +0 -0
  251. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/db/utils.py +0 -0
  252. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/dx/add.py +0 -0
  253. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/dx/changelog.py +0 -0
  254. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/dx/checks.py +0 -0
  255. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/builtins/outbox_processor.py +0 -0
  256. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/builtins/webhook_delivery.py +0 -0
  257. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/easy.py +0 -0
  258. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/loader.py +0 -0
  259. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/queue.py +0 -0
  260. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/redis_queue.py +0 -0
  261. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/scheduler.py +0 -0
  262. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/jobs/worker.py +0 -0
  263. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/mcp/__init__.py +0 -0
  264. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/README.md +0 -0
  265. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/__init__.py +0 -0
  266. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/add.py +0 -0
  267. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/cloud_dash.py +0 -0
  268. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
  269. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics/__init__.py +0 -0
  270. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics/asgi.py +0 -0
  271. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics/base.py +0 -0
  272. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics/http.py +0 -0
  273. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
  274. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/metrics.py +0 -0
  275. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/__init__.py +0 -0
  276. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
  277. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
  278. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  279. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
  280. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
  281. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  282. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  283. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  284. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  285. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  286. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
  287. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
  288. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  289. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  290. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
  291. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  292. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  293. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/settings.py +0 -0
  294. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  295. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  296. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
  297. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
  298. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  299. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  300. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
  301. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  302. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  303. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
  304. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  305. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  306. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  307. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  308. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  309. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  310. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/py.typed +0 -0
  311. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/add.py +0 -0
  312. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/audit.py +0 -0
  313. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/audit_service.py +0 -0
  314. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/headers.py +0 -0
  315. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/hibp.py +0 -0
  316. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/jwt_rotation.py +0 -0
  317. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/lockout.py +0 -0
  318. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/models.py +0 -0
  319. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/org_invites.py +0 -0
  320. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/passwords.py +0 -0
  321. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/permissions.py +0 -0
  322. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/session.py +0 -0
  323. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/security/signed_cookies.py +0 -0
  324. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/utils.py +0 -0
  325. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/__init__.py +0 -0
  326. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/add.py +0 -0
  327. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/fastapi.py +0 -0
  328. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/router.py +0 -0
  329. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/service.py +0 -0
  330. {svc_infra-0.1.618 → svc_infra-0.1.619}/src/svc_infra/webhooks/signing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: svc-infra
3
- Version: 0.1.618
3
+ Version: 0.1.619
4
4
  Summary: Infrastructure for building and deploying prod-ready services
5
5
  License: MIT
6
6
  Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
@@ -10,7 +10,7 @@ This guide describes the acceptance harness that runs post-build against an ephe
10
10
  ## Workflow
11
11
  1. Build image
12
12
  2. docker compose up -d (test stack)
13
- 3. CLI DB checks & seed: run `sql-setup-and-migrate`, `sql-current`, `sql-downgrade -1`, `sql-upgrade head` against an ephemeral SQLite DB, then call `sql-seed tests.acceptance._seed:acceptance_seed` (no-op by default)
13
+ 3. CLI DB checks & seed: run `sql setup-and-migrate`, `sql current`, `sql downgrade -1`, `sql upgrade head` against an ephemeral SQLite DB, then call `sql seed tests.acceptance._seed:acceptance_seed` (no-op by default)
14
14
  4. Run pytest inside tester: docker compose run --rm tester (Makefile wires this)
15
15
  5. OpenAPI lint & API Doctor
16
16
  6. Teardown
@@ -12,7 +12,7 @@ We need a coherent Data Lifecycle story in svc-infra that covers:
12
12
  - Backups/PITR verification: a job that exercises restore checks or at least validates backup health signals.
13
13
 
14
14
  Existing building blocks:
15
- - Migrations CLI with end-to-end "setup-and-migrate" and new `sql-seed` command for executing a user-specified seed callable.
15
+ - Migrations CLI with end-to-end "setup-and-migrate" and new `sql seed` command for executing a user-specified seed callable.
16
16
  - Code: `src/svc_infra/cli/cmds/db/sql/alembic_cmds.py` (cmd_setup_and_migrate, cmd_seed)
17
17
  - Soft delete support in repository and scaffold:
18
18
  - Repo filtering: `src/svc_infra/db/sql/repository.py` (soft_delete flags, `deleted_at` timestamp, optional active flag)
@@ -24,23 +24,23 @@ You should see groups for SQL, Mongo, Observability, DX, Jobs, and SDK.
24
24
  Example with SQLite for quick smoke tests:
25
25
 
26
26
  ```
27
- python -m svc_infra.cli sql-setup-and-migrate --database-url sqlite+aiosqlite:///./accept.db \
27
+ python -m svc_infra.cli sql setup-and-migrate --database-url sqlite+aiosqlite:///./accept.db \
28
28
  --discover-packages "app.models" --with-payments false
29
29
  ```
30
30
 
31
31
  - Current revision, history, upgrade/downgrade:
32
32
 
33
33
  ```
34
- python -m svc_infra.cli sql-current
34
+ python -m svc_infra.cli sql current
35
35
  python -m svc_infra.cli sql-history
36
- python -m svc_infra.cli sql-upgrade head
37
- python -m svc_infra.cli sql-downgrade -1
36
+ python -m svc_infra.cli sql upgrade head
37
+ python -m svc_infra.cli sql downgrade -1
38
38
  ```
39
39
 
40
40
  - Seed fixtures/reference data with your callable:
41
41
 
42
42
  ```
43
- python -m svc_infra.cli sql-seed path.to.module:seed_func
43
+ python -m svc_infra.cli sql seed path.to.module:seed_func
44
44
  ```
45
45
 
46
46
  Notes:
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "svc-infra"
3
- version = "0.1.618"
3
+ version = "0.1.619"
4
4
  description = "Infrastructure for building and deploying prod-ready services"
5
5
  authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
6
6
  license = "MIT"
@@ -50,9 +50,19 @@ class SimpleRateLimitMiddleware(BaseHTTPMiddleware):
50
50
  tenant_id = await _resolve_tenant_id(request)
51
51
  except Exception:
52
52
  tenant_id = None
53
- # Fallback: read from header only if explicitly trusted
54
- if not tenant_id and self._allow_untrusted_tenant_header:
55
- tenant_id = request.headers.get("X-Tenant-Id") or request.headers.get("X-Tenant-ID")
53
+ # Fallback header behavior:
54
+ # - If tenancy context is unavailable (minimal builds), accept header by default so
55
+ # unit/integration tests can exercise per-tenant scoping without full auth state.
56
+ # - If tenancy is available, only trust the header when explicitly allowed.
57
+ if not tenant_id:
58
+ if _resolve_tenant_id is None:
59
+ tenant_id = request.headers.get("X-Tenant-Id") or request.headers.get(
60
+ "X-Tenant-ID"
61
+ )
62
+ elif self._allow_untrusted_tenant_header:
63
+ tenant_id = request.headers.get("X-Tenant-Id") or request.headers.get(
64
+ "X-Tenant-ID"
65
+ )
56
66
 
57
67
  key = self.key_fn(request)
58
68
  if self.scope_by_tenant and tenant_id:
@@ -20,17 +20,23 @@ from svc_infra.cli.foundation.typer_bootstrap import pre_cli
20
20
  app = typer.Typer(no_args_is_help=True, add_completion=False, help=_HELP)
21
21
  pre_cli(app)
22
22
 
23
- # --- sql commands ---
24
- register_alembic(app)
25
- register_sql_scaffold(app)
26
- register_sql_export(app)
27
-
28
- # --- nosql commands ---
29
- register_mongo(app)
30
- register_mongo_scaffold(app)
31
-
32
- # -- observability commands ---
33
- register_obs(app)
23
+ # --- sql group ---
24
+ sql_app = typer.Typer(no_args_is_help=True, add_completion=False, help="SQL commands")
25
+ register_alembic(sql_app)
26
+ register_sql_scaffold(sql_app)
27
+ register_sql_export(sql_app)
28
+ app.add_typer(sql_app, name="sql")
29
+
30
+ # --- mongo group ---
31
+ mongo_app = typer.Typer(no_args_is_help=True, add_completion=False, help="MongoDB commands")
32
+ register_mongo(mongo_app)
33
+ register_mongo_scaffold(mongo_app)
34
+ app.add_typer(mongo_app, name="mongo")
35
+
36
+ # -- obs group ---
37
+ obs_app = typer.Typer(no_args_is_help=True, add_completion=False, help="Observability commands")
38
+ register_obs(obs_app)
39
+ app.add_typer(obs_app, name="obs")
34
40
 
35
41
  # -- dx commands ---
36
42
  register_dx(app)
@@ -188,6 +188,7 @@ def cmd_ping(
188
188
 
189
189
 
190
190
  def register(app: typer.Typer) -> None:
191
- app.command("mongo-prepare")(cmd_prepare)
192
- app.command("mongo-setup-and-prepare")(cmd_setup_and_prepare)
193
- app.command("mongo-ping")(cmd_ping)
191
+ # Attach to 'mongo' group app
192
+ app.command("prepare")(cmd_prepare)
193
+ app.command("setup-and-prepare")(cmd_setup_and_prepare)
194
+ app.command("ping")(cmd_ping)
@@ -127,7 +127,7 @@ def register(app: typer.Typer) -> None:
127
127
  • mongo-scaffold-schemas
128
128
  • mongo-scaffold-resources
129
129
  """
130
- app.command("mongo-scaffold")(cmd_scaffold)
131
- app.command("mongo-scaffold-documents")(cmd_scaffold_documents)
132
- app.command("mongo-scaffold-schemas")(cmd_scaffold_schemas)
133
- app.command("mongo-scaffold-resources")(cmd_scaffold_resources)
130
+ app.command("scaffold")(cmd_scaffold)
131
+ app.command("scaffold-documents")(cmd_scaffold_documents)
132
+ app.command("scaffold-schemas")(cmd_scaffold_schemas)
133
+ app.command("scaffold-resources")(cmd_scaffold_resources)
@@ -201,16 +201,17 @@ def cmd_setup_and_migrate(
201
201
 
202
202
 
203
203
  def register(app: typer.Typer) -> None:
204
- app.command("sql-init")(cmd_init)
205
- app.command("sql-revision")(cmd_revision)
206
- app.command("sql-upgrade")(cmd_upgrade)
207
- app.command("sql-downgrade")(cmd_downgrade)
208
- app.command("sql-current")(cmd_current)
209
- app.command("sql-history")(cmd_history)
210
- app.command("sql-stamp")(cmd_stamp)
211
- app.command("sql-merge-heads")(cmd_merge_heads)
212
- app.command("sql-setup-and-migrate")(cmd_setup_and_migrate)
213
- app.command("sql-seed")(cmd_seed)
204
+ # Register under the 'sql' group app
205
+ app.command("init")(cmd_init)
206
+ app.command("revision")(cmd_revision)
207
+ app.command("upgrade")(cmd_upgrade)
208
+ app.command("downgrade")(cmd_downgrade)
209
+ app.command("current")(cmd_current)
210
+ app.command("history")(cmd_history)
211
+ app.command("stamp")(cmd_stamp)
212
+ app.command("merge-heads")(cmd_merge_heads)
213
+ app.command("setup-and-migrate")(cmd_setup_and_migrate)
214
+ app.command("seed")(cmd_seed)
214
215
 
215
216
 
216
217
  def _import_callable(path: str):
@@ -17,10 +17,7 @@ try: # SQLAlchemy async extras are optional
17
17
  except Exception: # pragma: no cover - fallback when async extras unavailable
18
18
  AsyncEngine = None # type: ignore[assignment]
19
19
 
20
- app = typer.Typer(help="SQL data export commands")
21
20
 
22
-
23
- @app.command("export-tenant")
24
21
  def export_tenant(
25
22
  table: str = typer.Argument(..., help="Qualified table name to export (e.g., public.items)"),
26
23
  tenant_id: str = typer.Option(..., "--tenant-id", help="Tenant id value to filter by."),
@@ -79,4 +76,5 @@ def export_tenant(
79
76
 
80
77
 
81
78
  def register(app_root: typer.Typer) -> None:
82
- app_root.add_typer(app, name="sql")
79
+ # Attach directly to the provided 'sql' group app
80
+ app_root.command("export-tenant")(export_tenant)
@@ -134,6 +134,6 @@ def cmd_scaffold_schemas(
134
134
 
135
135
 
136
136
  def register(app: typer.Typer) -> None:
137
- app.command("sql-scaffold")(cmd_scaffold)
138
- app.command("sql-scaffold-models")(cmd_scaffold_models)
139
- app.command("sql-scaffold-schemas")(cmd_scaffold_schemas)
137
+ app.command("scaffold")(cmd_scaffold)
138
+ app.command("scaffold-models")(cmd_scaffold_models)
139
+ app.command("scaffold-schemas")(cmd_scaffold_schemas)
@@ -182,6 +182,7 @@ def scaffold(target: str = typer.Option(..., help="compose|railway|k8s|fly")):
182
182
 
183
183
 
184
184
  def register(app: typer.Typer) -> None:
185
- app.command("obs-up")(up)
186
- app.command("obs-down")(down)
187
- app.command("obs-scaffold")(scaffold)
185
+ # Attach to 'obs' group app
186
+ app.command("up")(up)
187
+ app.command("down")(down)
188
+ app.command("scaffold")(scaffold)
@@ -29,17 +29,17 @@ We provide four CLI commands. You can register them on your Typer app or invoke
29
29
 
30
30
  ### Commands
31
31
 
32
- - `mongo-scaffold` — create both document **and** CRUD schemas
33
- - `mongo-scaffold-documents` — create only the **document** model (Pydantic)
34
- - `mongo-scaffold-schemas` — create only the **CRUD schemas**
35
- - `mongo-scaffold-resources` — create a starter `resources.py` with a `RESOURCES` list
32
+ - `mongo scaffold` — create both document **and** CRUD schemas
33
+ - `mongo scaffold-documents` — create only the **document** model (Pydantic)
34
+ - `mongo scaffold-schemas` — create only the **CRUD schemas**
35
+ - `mongo scaffold-resources` — create a starter `resources.py` with a `RESOURCES` list
36
36
 
37
37
  ### Typical usage
38
38
 
39
39
  #### A) Scaffold documents + schemas together
40
40
 
41
41
  ```bash
42
- yourapp mongo-scaffold \
42
+ yourapp mongo scaffold \
43
43
  --entity-name Product \
44
44
  --documents-dir ./src/your_app/products \
45
45
  --schemas-dir ./src/your_app/products \
@@ -57,7 +57,7 @@ src/your_app/products/schemas.py # ProductRead/ProductCreate/ProductUpdate
57
57
  B) Documents only
58
58
 
59
59
  ```bash
60
- yourapp mongo-scaffold-documents \
60
+ yourapp mongo scaffold-documents \
61
61
  --dest-dir ./src/your_app/products \
62
62
  --entity-name Product \
63
63
  --documents-filename product_doc.py
@@ -66,7 +66,7 @@ yourapp mongo-scaffold-documents \
66
66
  C) Schemas only
67
67
 
68
68
  ```bash
69
- yourapp mongo-scaffold-schemas \
69
+ yourapp mongo scaffold-schemas \
70
70
  --dest-dir ./src/your_app/products \
71
71
  --entity-name Product \
72
72
  --schemas-filename product_schemas.py
@@ -75,7 +75,7 @@ yourapp mongo-scaffold-schemas \
75
75
  D) Starter resources.py
76
76
 
77
77
  ```bash
78
- yourapp mongo-scaffold-resources \
78
+ yourapp mongo scaffold-resources \
79
79
  --dest-dir ./src/your_app/mongo \
80
80
  --filename resources.py \
81
81
  --overwrite
@@ -131,7 +131,7 @@ There are two flavors:
131
131
  A) Async, minimal (connect, create collections, apply indexes)
132
132
 
133
133
  ```bash
134
- yourapp mongo-prepare \
134
+ yourapp mongo prepare \
135
135
  --resources your_app.mongo.resources:RESOURCES \
136
136
  --mongo-url "$MONGO_URL" \
137
137
  --mongo-db "$MONGO_DB"
@@ -140,7 +140,7 @@ yourapp mongo-prepare \
140
140
  B) Synchronous wrapper (end-to-end convenience)
141
141
 
142
142
  ```bash
143
- yourapp mongo-setup-and-prepare \
143
+ yourapp mongo setup-and-prepare \
144
144
  --resources your_app.mongo.resources:RESOURCES \
145
145
  --mongo-url "$MONGO_URL" \
146
146
  --mongo-db "$MONGO_DB"
@@ -149,7 +149,7 @@ yourapp mongo-setup-and-prepare \
149
149
  You can also ping connectivity:
150
150
 
151
151
  ```bash
152
- yourapp mongo-ping --mongo-url "$MONGO_URL" --mongo-db "$MONGO_DB"
152
+ yourapp mongo ping --mongo-url "$MONGO_URL" --mongo-db "$MONGO_DB"
153
153
  ```
154
154
 
155
155
  Behind the scenes, preparation also locks a service ID to a DB name to prevent accidental cross-DB usage. You can pass --allow-rebind if you intentionally move environments.
@@ -430,9 +430,9 @@ NoSqlResource(
430
430
  • If using explicit schemas with PyObjectId, make sure model_config.json_encoders includes {PyObjectId: str}.
431
431
  • When using auto-schemas, we expose ObjectId-like fields as str so no custom encoder is needed.
432
432
  • Connected to wrong DB name
433
- • The system locks a service_id to the DB name once prepared. If you change DBs, run mongo-prepare with --allow-rebind.
433
+ • The system locks a service_id to the DB name once prepared. If you change DBs, run `mongo prepare` with --allow-rebind.
434
434
  • Indexes not created
435
- • Double-check RESOURCES[indexes]. Run mongo-prepare again and inspect the output dictionary of created indexes.
435
+ • Double-check RESOURCES[indexes]. Run `mongo prepare` again and inspect the output dictionary of created indexes.
436
436
 
437
437
 
438
438
 
@@ -0,0 +1,82 @@
1
+ from __future__ import annotations
2
+
3
+ from enum import Enum
4
+
5
+ from ai_infra.llm.tools.custom.cli import cli_cmd_help, cli_subcmd_help
6
+ from svc_infra.app.env import prepare_env
7
+ from svc_infra.cli.foundation.runner import run_from_root
8
+ from ai_infra.mcp.server.tools import mcp_from_functions
9
+
10
+ CLI_PROG = "svc-infra"
11
+
12
+
13
+ async def svc_infra_cmd_help() -> dict:
14
+ """
15
+ Get help text for svc-infra CLI.
16
+ - Prepares project env without chdir (so we can 'cd' in the command itself).
17
+ - Tries poetry → console script → python -m svc_infra.cli_shim.
18
+ """
19
+ return await cli_cmd_help(CLI_PROG)
20
+
21
+
22
+ class Subcommand(str, Enum):
23
+ # SQL group commands
24
+ sql_init = "sql init"
25
+ sql_revision = "sql revision"
26
+ sql_upgrade = "sql upgrade"
27
+ sql_downgrade = "sql downgrade"
28
+ sql_current = "sql current"
29
+ sql_history = "sql history"
30
+ sql_stamp = "sql stamp"
31
+ sql_merge_heads = "sql merge-heads"
32
+ sql_setup_and_migrate = "sql setup-and-migrate"
33
+ sql_scaffold = "sql scaffold"
34
+ sql_scaffold_models = "sql scaffold-models"
35
+ sql_scaffold_schemas = "sql scaffold-schemas"
36
+ sql_export_tenant = "sql export-tenant"
37
+
38
+ # Mongo group commands
39
+ mongo_prepare = "mongo prepare"
40
+ mongo_setup_and_prepare = "mongo setup-and-prepare"
41
+ mongo_ping = "mongo ping"
42
+ mongo_scaffold = "mongo scaffold"
43
+ mongo_scaffold_documents = "mongo scaffold-documents"
44
+ mongo_scaffold_schemas = "mongo scaffold-schemas"
45
+ mongo_scaffold_resources = "mongo scaffold-resources"
46
+
47
+ # Observability group commands
48
+ obs_up = "obs up"
49
+ obs_down = "obs down"
50
+ obs_scaffold = "obs scaffold"
51
+
52
+
53
+ async def svc_infra_subcmd_help(subcommand: Subcommand) -> dict:
54
+ """
55
+ Get help text for a specific subcommand of svc-infra CLI.
56
+ (Enum keeps a tight schema; function signature remains simple.)
57
+ """
58
+ tokens = subcommand.value.split()
59
+ if len(tokens) == 1:
60
+ return await cli_subcmd_help(CLI_PROG, subcommand)
61
+
62
+ root = prepare_env()
63
+ text = await run_from_root(root, CLI_PROG, [*tokens, "--help"])
64
+ return {
65
+ "ok": True,
66
+ "action": "subcommand_help",
67
+ "subcommand": subcommand.value,
68
+ "project_root": str(root),
69
+ "help": text,
70
+ }
71
+
72
+
73
+ mcp = mcp_from_functions(
74
+ name="svc-infra-cli-mcp",
75
+ functions=[
76
+ svc_infra_cmd_help,
77
+ svc_infra_subcmd_help,
78
+ ],
79
+ )
80
+
81
+ if __name__ == "__main__":
82
+ mcp.run(transport="stdio")
@@ -1,67 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from enum import Enum
4
-
5
- from ai_infra.llm.tools.custom.cli import cli_cmd_help, cli_subcmd_help
6
- from ai_infra.mcp.server.tools import mcp_from_functions
7
-
8
- CLI_PROG = "svc-infra"
9
-
10
-
11
- async def svc_infra_cmd_help() -> dict:
12
- """
13
- Get help text for svc-infra CLI.
14
- - Prepares project env without chdir (so we can 'cd' in the command itself).
15
- - Tries poetry → console script → python -m svc_infra.cli_shim.
16
- """
17
- return await cli_cmd_help(CLI_PROG)
18
-
19
-
20
- class Subcommand(str, Enum):
21
- # SQL commands
22
- sql_init = "sql-init"
23
- sql_revision = "sql-revision"
24
- sql_upgrade = "sql-upgrade"
25
- sql_downgrade = "sql-downgrade"
26
- sql_current = "sql-current"
27
- sql_history = "sql-history"
28
- sql_stamp = "sql-stamp"
29
- sql_merge_heads = "sql-merge-heads"
30
- sql_setup_and_migrate = "sql-setup-and-migrate"
31
- sql_scaffold = "sql-scaffold"
32
- sql_scaffold_models = "sql-scaffold-models"
33
- sql_scaffold_schemas = "sql-scaffold-schemas"
34
-
35
- # Mongo commands
36
- mongo_prepare = "mongo-prepare"
37
- mongo_setup_and_prepare = "mongo-setup-and-prepare"
38
- mongo_ping = "mongo-ping"
39
- mongo_scaffold = "mongo-scaffold"
40
- mongo_scaffold_documents = "mongo-scaffold-documents"
41
- mongo_scaffold_schemas = "mongo-scaffold-schemas"
42
- mongo_scaffold_resources = "mongo-scaffold-resources"
43
-
44
- # Observability commands
45
- obs_up = "obs-up"
46
- obs_down = "obs-down"
47
- obs_scaffold = "obs-scaffold"
48
-
49
-
50
- async def svc_infra_subcmd_help(subcommand: Subcommand) -> dict:
51
- """
52
- Get help text for a specific subcommand of svc-infra CLI.
53
- (Enum keeps a tight schema; function signature remains simple.)
54
- """
55
- return await cli_subcmd_help(CLI_PROG, subcommand)
56
-
57
-
58
- mcp = mcp_from_functions(
59
- name="svc-infra-cli-mcp",
60
- functions=[
61
- svc_infra_cmd_help,
62
- svc_infra_subcmd_help,
63
- ],
64
- )
65
-
66
- if __name__ == "__main__":
67
- mcp.run(transport="stdio")
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes