eitohforge 0.1.0__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.
Files changed (267) hide show
  1. eitohforge-0.1.0/.github/workflows/ci.yml +145 -0
  2. eitohforge-0.1.0/.github/workflows/publish-internal.yml +85 -0
  3. eitohforge-0.1.0/.github/workflows/publish-pypi.yml +74 -0
  4. eitohforge-0.1.0/.gitignore +13 -0
  5. eitohforge-0.1.0/CONTRIBUTING.md +33 -0
  6. eitohforge-0.1.0/PKG-INFO +72 -0
  7. eitohforge-0.1.0/README.md +23 -0
  8. eitohforge-0.1.0/docs/README.md +73 -0
  9. eitohforge-0.1.0/docs/adr/0001-orm-and-migration-strategy.md +22 -0
  10. eitohforge-0.1.0/docs/adr/0002-typing-and-linting-strategy.md +22 -0
  11. eitohforge-0.1.0/docs/adr/0003-packaging-and-publish-strategy.md +23 -0
  12. eitohforge-0.1.0/docs/guides/cookbook.md +118 -0
  13. eitohforge-0.1.0/docs/guides/deployment-strategies-and-rollback-controls.md +75 -0
  14. eitohforge-0.1.0/docs/guides/enterprise-deployment-and-networking.md +63 -0
  15. eitohforge-0.1.0/docs/guides/enterprise-readiness-checklist.md +74 -0
  16. eitohforge-0.1.0/docs/guides/forge-profiles.md +68 -0
  17. eitohforge-0.1.0/docs/guides/load-balancing-and-health-routing.md +66 -0
  18. eitohforge-0.1.0/docs/guides/mtls-trust-model.md +71 -0
  19. eitohforge-0.1.0/docs/guides/multi-service-dev-and-environments.md +29 -0
  20. eitohforge-0.1.0/docs/guides/onboarding-qa-simulation.md +48 -0
  21. eitohforge-0.1.0/docs/guides/operations-runbook.md +86 -0
  22. eitohforge-0.1.0/docs/guides/phase-0-and-1-kickoff.md +76 -0
  23. eitohforge-0.1.0/docs/guides/python-packaging-and-publishing.md +87 -0
  24. eitohforge-0.1.0/docs/guides/query-spec-reference.md +50 -0
  25. eitohforge-0.1.0/docs/guides/realtime-websocket.md +39 -0
  26. eitohforge-0.1.0/docs/guides/repository-contracts-and-dto-boundaries.md +36 -0
  27. eitohforge-0.1.0/docs/guides/testing-and-example-project-strategy.md +65 -0
  28. eitohforge-0.1.0/docs/guides/tls-and-cert-rotation-runbook.md +65 -0
  29. eitohforge-0.1.0/docs/guides/usage-complete.md +160 -0
  30. eitohforge-0.1.0/docs/performance/baseline.json +15 -0
  31. eitohforge-0.1.0/docs/performance/baseline.md +8 -0
  32. eitohforge-0.1.0/docs/releases/v0.1.0-rc.md +32 -0
  33. eitohforge-0.1.0/docs/roadmap/architecture-coverage-matrix.md +66 -0
  34. eitohforge-0.1.0/docs/roadmap/blueprint-completion-waves.md +169 -0
  35. eitohforge-0.1.0/docs/roadmap/execution-board.md +154 -0
  36. eitohforge-0.1.0/docs/roadmap/master-implementation-roadmap.md +479 -0
  37. eitohforge-0.1.0/docs/standards/engineering-standards.md +180 -0
  38. eitohforge-0.1.0/docs/standards/flaky-test-policy.md +35 -0
  39. eitohforge-0.1.0/examples/example-enterprise/.env.example +12 -0
  40. eitohforge-0.1.0/examples/example-enterprise/README.md +53 -0
  41. eitohforge-0.1.0/examples/example-enterprise/example_enterprise/__init__.py +1 -0
  42. eitohforge-0.1.0/examples/example-enterprise/example_enterprise/main.py +37 -0
  43. eitohforge-0.1.0/examples/example-enterprise/forge.dev.json +11 -0
  44. eitohforge-0.1.0/examples/example-enterprise/pyproject.toml +25 -0
  45. eitohforge-0.1.0/examples/example-enterprise/tests/test_smoke.py +40 -0
  46. eitohforge-0.1.0/examples/example-minimal/.env.example +4 -0
  47. eitohforge-0.1.0/examples/example-minimal/README.md +35 -0
  48. eitohforge-0.1.0/examples/example-minimal/example_minimal/__init__.py +1 -0
  49. eitohforge-0.1.0/examples/example-minimal/example_minimal/main.py +22 -0
  50. eitohforge-0.1.0/examples/example-minimal/pyproject.toml +25 -0
  51. eitohforge-0.1.0/examples/example-minimal/tests/test_smoke.py +21 -0
  52. eitohforge-0.1.0/pyproject.toml +111 -0
  53. eitohforge-0.1.0/scripts/check_license_policy.py +102 -0
  54. eitohforge-0.1.0/scripts/check_migration_policy.py +69 -0
  55. eitohforge-0.1.0/scripts/performance_baseline.py +108 -0
  56. eitohforge-0.1.0/scripts/validate_packaging_metadata.py +51 -0
  57. eitohforge-0.1.0/scripts/verify_reproducible_build.py +56 -0
  58. eitohforge-0.1.0/src/eitohforge_cli/__init__.py +2 -0
  59. eitohforge-0.1.0/src/eitohforge_cli/commands/__init__.py +2 -0
  60. eitohforge-0.1.0/src/eitohforge_cli/commands/create.py +87 -0
  61. eitohforge-0.1.0/src/eitohforge_cli/commands/db.py +99 -0
  62. eitohforge-0.1.0/src/eitohforge_cli/commands/dev.py +161 -0
  63. eitohforge-0.1.0/src/eitohforge_cli/main.py +37 -0
  64. eitohforge-0.1.0/src/eitohforge_cli/template_parts/__init__.py +2 -0
  65. eitohforge-0.1.0/src/eitohforge_cli/template_parts/application_templates.py +231 -0
  66. eitohforge-0.1.0/src/eitohforge_cli/template_parts/cache_templates.py +271 -0
  67. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates.py +15 -0
  68. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates_auth.py +723 -0
  69. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates_platform.py +699 -0
  70. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates_runtime.py +1142 -0
  71. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates_security.py +282 -0
  72. eitohforge-0.1.0/src/eitohforge_cli/template_parts/core_templates_validation.py +391 -0
  73. eitohforge-0.1.0/src/eitohforge_cli/template_parts/crud_templates.py +322 -0
  74. eitohforge-0.1.0/src/eitohforge_cli/template_parts/external_api_templates.py +188 -0
  75. eitohforge-0.1.0/src/eitohforge_cli/template_parts/jobs_templates.py +191 -0
  76. eitohforge-0.1.0/src/eitohforge_cli/template_parts/messaging_templates.py +64 -0
  77. eitohforge-0.1.0/src/eitohforge_cli/template_parts/notification_templates.py +236 -0
  78. eitohforge-0.1.0/src/eitohforge_cli/template_parts/search_templates.py +315 -0
  79. eitohforge-0.1.0/src/eitohforge_cli/template_parts/socket_templates.py +400 -0
  80. eitohforge-0.1.0/src/eitohforge_cli/template_parts/storage_templates.py +525 -0
  81. eitohforge-0.1.0/src/eitohforge_cli/template_parts/webhook_templates.py +221 -0
  82. eitohforge-0.1.0/src/eitohforge_cli/templates.py +1668 -0
  83. eitohforge-0.1.0/src/eitohforge_sdk/__init__.py +2 -0
  84. eitohforge-0.1.0/src/eitohforge_sdk/application/__init__.py +14 -0
  85. eitohforge-0.1.0/src/eitohforge_sdk/application/dto/__init__.py +40 -0
  86. eitohforge-0.1.0/src/eitohforge_sdk/application/dto/error.py +41 -0
  87. eitohforge-0.1.0/src/eitohforge_sdk/application/dto/repository.py +116 -0
  88. eitohforge-0.1.0/src/eitohforge_sdk/application/dto/response.py +55 -0
  89. eitohforge-0.1.0/src/eitohforge_sdk/application/query_spec_support.py +19 -0
  90. eitohforge-0.1.0/src/eitohforge_sdk/application/services/__init__.py +6 -0
  91. eitohforge-0.1.0/src/eitohforge_sdk/application/services/validation.py +68 -0
  92. eitohforge-0.1.0/src/eitohforge_sdk/core/__init__.py +267 -0
  93. eitohforge-0.1.0/src/eitohforge_sdk/core/abac.py +147 -0
  94. eitohforge-0.1.0/src/eitohforge_sdk/core/api_version_deprecation.py +39 -0
  95. eitohforge-0.1.0/src/eitohforge_sdk/core/api_versioning.py +29 -0
  96. eitohforge-0.1.0/src/eitohforge_sdk/core/audit.py +105 -0
  97. eitohforge-0.1.0/src/eitohforge_sdk/core/auth/__init__.py +82 -0
  98. eitohforge-0.1.0/src/eitohforge_sdk/core/auth/jwt.py +292 -0
  99. eitohforge-0.1.0/src/eitohforge_sdk/core/auth/session.py +241 -0
  100. eitohforge-0.1.0/src/eitohforge_sdk/core/auth/sso.py +179 -0
  101. eitohforge-0.1.0/src/eitohforge_sdk/core/auth/sso_adapters.py +147 -0
  102. eitohforge-0.1.0/src/eitohforge_sdk/core/capabilities.py +201 -0
  103. eitohforge-0.1.0/src/eitohforge_sdk/core/config.py +448 -0
  104. eitohforge-0.1.0/src/eitohforge_sdk/core/deployment.py +35 -0
  105. eitohforge-0.1.0/src/eitohforge_sdk/core/error_middleware.py +46 -0
  106. eitohforge-0.1.0/src/eitohforge_sdk/core/error_registry.py +76 -0
  107. eitohforge-0.1.0/src/eitohforge_sdk/core/feature_catalog.py +77 -0
  108. eitohforge-0.1.0/src/eitohforge_sdk/core/feature_flags.py +110 -0
  109. eitohforge-0.1.0/src/eitohforge_sdk/core/forge_application.py +282 -0
  110. eitohforge-0.1.0/src/eitohforge_sdk/core/forge_toggles.py +63 -0
  111. eitohforge-0.1.0/src/eitohforge_sdk/core/health.py +104 -0
  112. eitohforge-0.1.0/src/eitohforge_sdk/core/idempotency.py +159 -0
  113. eitohforge-0.1.0/src/eitohforge_sdk/core/observability.py +186 -0
  114. eitohforge-0.1.0/src/eitohforge_sdk/core/performance.py +58 -0
  115. eitohforge-0.1.0/src/eitohforge_sdk/core/plugins.py +49 -0
  116. eitohforge-0.1.0/src/eitohforge_sdk/core/rate_limit.py +89 -0
  117. eitohforge-0.1.0/src/eitohforge_sdk/core/request_signing.py +154 -0
  118. eitohforge-0.1.0/src/eitohforge_sdk/core/secret_factory.py +29 -0
  119. eitohforge-0.1.0/src/eitohforge_sdk/core/secrets.py +154 -0
  120. eitohforge-0.1.0/src/eitohforge_sdk/core/security.py +114 -0
  121. eitohforge-0.1.0/src/eitohforge_sdk/core/security_context.py +62 -0
  122. eitohforge-0.1.0/src/eitohforge_sdk/core/security_hardening.py +65 -0
  123. eitohforge-0.1.0/src/eitohforge_sdk/core/tenant.py +142 -0
  124. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/__init__.py +45 -0
  125. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/context.py +29 -0
  126. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/contracts.py +23 -0
  127. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/engine.py +51 -0
  128. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/errors.py +45 -0
  129. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/hooks.py +116 -0
  130. eitohforge-0.1.0/src/eitohforge_sdk/core/validation/rules.py +167 -0
  131. eitohforge-0.1.0/src/eitohforge_sdk/domain/__init__.py +20 -0
  132. eitohforge-0.1.0/src/eitohforge_sdk/domain/repositories/__init__.py +6 -0
  133. eitohforge-0.1.0/src/eitohforge_sdk/domain/repositories/contracts.py +56 -0
  134. eitohforge-0.1.0/src/eitohforge_sdk/domain/value_objects/__init__.py +16 -0
  135. eitohforge-0.1.0/src/eitohforge_sdk/domain/value_objects/contact.py +23 -0
  136. eitohforge-0.1.0/src/eitohforge_sdk/domain/value_objects/errors.py +6 -0
  137. eitohforge-0.1.0/src/eitohforge_sdk/domain/value_objects/identifiers.py +43 -0
  138. eitohforge-0.1.0/src/eitohforge_sdk/domain/value_objects/time.py +19 -0
  139. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/__init__.py +179 -0
  140. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/__init__.py +19 -0
  141. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/contracts.py +33 -0
  142. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/factory.py +37 -0
  143. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/invalidation.py +101 -0
  144. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/memory.py +44 -0
  145. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/redis.py +48 -0
  146. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/cache/tenant_scoped.py +43 -0
  147. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/database/__init__.py +24 -0
  148. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/database/factory.py +47 -0
  149. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/database/providers.py +150 -0
  150. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/database/registry.py +33 -0
  151. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/database/transaction.py +53 -0
  152. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/external_api/__init__.py +26 -0
  153. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/external_api/client.py +112 -0
  154. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/external_api/contracts.py +79 -0
  155. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/jobs/__init__.py +20 -0
  156. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/jobs/contracts.py +76 -0
  157. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/jobs/memory.py +118 -0
  158. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/messaging/__init__.py +18 -0
  159. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/messaging/contracts.py +32 -0
  160. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/messaging/dispatcher.py +36 -0
  161. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/messaging/redis_bridge.py +49 -0
  162. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/notifications/__init__.py +36 -0
  163. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/notifications/contracts.py +52 -0
  164. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/notifications/gateway.py +70 -0
  165. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/notifications/template_engine.py +119 -0
  166. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/repositories/__init__.py +6 -0
  167. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/repositories/sqlalchemy_repository.py +373 -0
  168. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/search/__init__.py +23 -0
  169. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/search/contracts.py +65 -0
  170. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/search/factory.py +42 -0
  171. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/search/memory.py +88 -0
  172. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/search/opensearch.py +147 -0
  173. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/__init__.py +28 -0
  174. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/auth.py +61 -0
  175. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/contracts.py +72 -0
  176. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/hub.py +145 -0
  177. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/realtime_redis.py +67 -0
  178. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/realtime_router.py +285 -0
  179. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/sockets/redis_hub.py +214 -0
  180. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/__init__.py +47 -0
  181. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/cdn.py +64 -0
  182. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/contracts.py +44 -0
  183. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/factory.py +50 -0
  184. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/local.py +46 -0
  185. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/policy.py +185 -0
  186. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/s3.py +117 -0
  187. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/storage/tenant_scoped.py +78 -0
  188. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/transactions/__init__.py +20 -0
  189. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/transactions/saga.py +132 -0
  190. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/webhooks/__init__.py +30 -0
  191. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/webhooks/contracts.py +83 -0
  192. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/webhooks/dispatcher.py +113 -0
  193. eitohforge-0.1.0/src/eitohforge_sdk/infrastructure/webhooks/signing.py +36 -0
  194. eitohforge-0.1.0/tests/contract/test_api_contracts.py +60 -0
  195. eitohforge-0.1.0/tests/e2e/test_scaffold_http_journey.py +41 -0
  196. eitohforge-0.1.0/tests/golden/crud/orders/app__modules__orders____init__.py.golden +10 -0
  197. eitohforge-0.1.0/tests/golden/crud/orders/app__modules__orders__router.py.golden +47 -0
  198. eitohforge-0.1.0/tests/golden/crud/orders/app__modules__orders__schema.py.golden +43 -0
  199. eitohforge-0.1.0/tests/golden/crud/orders/app__modules__orders__service.py.golden +111 -0
  200. eitohforge-0.1.0/tests/golden/crud/orders/tests__test_orders_crud.py.golden +51 -0
  201. eitohforge-0.1.0/tests/integration/test_example_projects_smoke.py +39 -0
  202. eitohforge-0.1.0/tests/integration/test_generated_project.py +199 -0
  203. eitohforge-0.1.0/tests/migration/test_scaffold_migration_layout.py +24 -0
  204. eitohforge-0.1.0/tests/performance/test_perf_closure.py +24 -0
  205. eitohforge-0.1.0/tests/security/test_security_closure.py +56 -0
  206. eitohforge-0.1.0/tests/unit/test_abac_security.py +48 -0
  207. eitohforge-0.1.0/tests/unit/test_api_response_models.py +31 -0
  208. eitohforge-0.1.0/tests/unit/test_api_version_deprecation.py +53 -0
  209. eitohforge-0.1.0/tests/unit/test_api_versioning.py +31 -0
  210. eitohforge-0.1.0/tests/unit/test_audit.py +53 -0
  211. eitohforge-0.1.0/tests/unit/test_background_jobs.py +71 -0
  212. eitohforge-0.1.0/tests/unit/test_cache_invalidation.py +42 -0
  213. eitohforge-0.1.0/tests/unit/test_cache_provider.py +120 -0
  214. eitohforge-0.1.0/tests/unit/test_capabilities.py +94 -0
  215. eitohforge-0.1.0/tests/unit/test_cli.py +66 -0
  216. eitohforge-0.1.0/tests/unit/test_cli_create_profile.py +17 -0
  217. eitohforge-0.1.0/tests/unit/test_config.py +79 -0
  218. eitohforge-0.1.0/tests/unit/test_crud_templates_golden.py +16 -0
  219. eitohforge-0.1.0/tests/unit/test_database_provider.py +158 -0
  220. eitohforge-0.1.0/tests/unit/test_db_commands.py +73 -0
  221. eitohforge-0.1.0/tests/unit/test_dev_command.py +29 -0
  222. eitohforge-0.1.0/tests/unit/test_domain_value_objects.py +47 -0
  223. eitohforge-0.1.0/tests/unit/test_error_middleware.py +40 -0
  224. eitohforge-0.1.0/tests/unit/test_error_registry.py +28 -0
  225. eitohforge-0.1.0/tests/unit/test_event_bus.py +39 -0
  226. eitohforge-0.1.0/tests/unit/test_external_api_client.py +95 -0
  227. eitohforge-0.1.0/tests/unit/test_feature_flags.py +55 -0
  228. eitohforge-0.1.0/tests/unit/test_forge_application.py +139 -0
  229. eitohforge-0.1.0/tests/unit/test_forge_toggles.py +43 -0
  230. eitohforge-0.1.0/tests/unit/test_health_endpoints.py +36 -0
  231. eitohforge-0.1.0/tests/unit/test_idempotency.py +68 -0
  232. eitohforge-0.1.0/tests/unit/test_jwt_manager.py +61 -0
  233. eitohforge-0.1.0/tests/unit/test_migration_policy_script.py +59 -0
  234. eitohforge-0.1.0/tests/unit/test_notification_templates.py +101 -0
  235. eitohforge-0.1.0/tests/unit/test_notifications.py +50 -0
  236. eitohforge-0.1.0/tests/unit/test_observability.py +123 -0
  237. eitohforge-0.1.0/tests/unit/test_performance_baseline.py +27 -0
  238. eitohforge-0.1.0/tests/unit/test_plugin_registry.py +37 -0
  239. eitohforge-0.1.0/tests/unit/test_query_spec_support.py +30 -0
  240. eitohforge-0.1.0/tests/unit/test_rate_limit.py +60 -0
  241. eitohforge-0.1.0/tests/unit/test_rbac_security.py +49 -0
  242. eitohforge-0.1.0/tests/unit/test_realtime_router.py +134 -0
  243. eitohforge-0.1.0/tests/unit/test_redis_event_bus.py +31 -0
  244. eitohforge-0.1.0/tests/unit/test_redis_socket_hub.py +205 -0
  245. eitohforge-0.1.0/tests/unit/test_repository_contracts.py +83 -0
  246. eitohforge-0.1.0/tests/unit/test_request_signing.py +116 -0
  247. eitohforge-0.1.0/tests/unit/test_saga_orchestrator.py +57 -0
  248. eitohforge-0.1.0/tests/unit/test_search.py +67 -0
  249. eitohforge-0.1.0/tests/unit/test_secrets.py +79 -0
  250. eitohforge-0.1.0/tests/unit/test_security_context.py +49 -0
  251. eitohforge-0.1.0/tests/unit/test_security_hardening.py +49 -0
  252. eitohforge-0.1.0/tests/unit/test_service_validation_hooks.py +89 -0
  253. eitohforge-0.1.0/tests/unit/test_session_manager.py +55 -0
  254. eitohforge-0.1.0/tests/unit/test_socket_infrastructure.py +112 -0
  255. eitohforge-0.1.0/tests/unit/test_sqlalchemy_repository.py +455 -0
  256. eitohforge-0.1.0/tests/unit/test_sso_adapters.py +68 -0
  257. eitohforge-0.1.0/tests/unit/test_sso_broker.py +137 -0
  258. eitohforge-0.1.0/tests/unit/test_storage_cdn.py +42 -0
  259. eitohforge-0.1.0/tests/unit/test_storage_policy.py +72 -0
  260. eitohforge-0.1.0/tests/unit/test_storage_provider.py +191 -0
  261. eitohforge-0.1.0/tests/unit/test_tenant_context.py +98 -0
  262. eitohforge-0.1.0/tests/unit/test_tenant_schema_isolation.py +85 -0
  263. eitohforge-0.1.0/tests/unit/test_transaction_manager.py +62 -0
  264. eitohforge-0.1.0/tests/unit/test_validation_engine.py +103 -0
  265. eitohforge-0.1.0/tests/unit/test_validation_rules.py +73 -0
  266. eitohforge-0.1.0/tests/unit/test_webhooks.py +89 -0
  267. eitohforge-0.1.0/uv.lock +2269 -0
@@ -0,0 +1,145 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ pull_request:
6
+
7
+ jobs:
8
+ quality:
9
+ runs-on: ubuntu-latest
10
+ steps:
11
+ - name: Checkout
12
+ uses: actions/checkout@v4
13
+
14
+ - name: Setup Python
15
+ uses: actions/setup-python@v5
16
+ with:
17
+ python-version: "3.12"
18
+
19
+ - name: Install dependencies
20
+ run: |
21
+ python -m pip install --upgrade pip
22
+ pip install -e ".[dev]"
23
+
24
+ - name: Ruff
25
+ run: ruff check .
26
+
27
+ - name: Mypy
28
+ run: mypy src
29
+
30
+ - name: Pytest (with coverage gate)
31
+ run: >
32
+ pytest
33
+ --strict-markers
34
+ --cov=eitohforge_sdk
35
+ --cov=eitohforge_cli
36
+ --cov-fail-under=82
37
+ --cov-report=term-missing
38
+
39
+ - name: Migration policy check
40
+ run: python scripts/check_migration_policy.py
41
+
42
+ - name: Packaging metadata check
43
+ run: python scripts/validate_packaging_metadata.py
44
+
45
+ example-smoke:
46
+ runs-on: ubuntu-latest
47
+ steps:
48
+ - name: Checkout
49
+ uses: actions/checkout@v4
50
+
51
+ - name: Setup Python
52
+ uses: actions/setup-python@v5
53
+ with:
54
+ python-version: "3.12"
55
+
56
+ - name: Install EitohForge + example packages
57
+ run: |
58
+ python -m pip install --upgrade pip
59
+ pip install -e ".[dev]"
60
+ pip install -e "examples/example-minimal[dev]"
61
+ pip install -e "examples/example-enterprise[dev]"
62
+
63
+ - name: Pytest example-minimal
64
+ run: pytest examples/example-minimal/tests -q
65
+
66
+ - name: Pytest example-enterprise
67
+ run: pytest examples/example-enterprise/tests -q
68
+
69
+ package-build:
70
+ runs-on: ubuntu-latest
71
+ env:
72
+ SOURCE_DATE_EPOCH: "1735689600"
73
+ steps:
74
+ - name: Checkout
75
+ uses: actions/checkout@v4
76
+
77
+ - name: Setup Python
78
+ uses: actions/setup-python@v5
79
+ with:
80
+ python-version: "3.12"
81
+
82
+ - name: Install build dependencies
83
+ run: |
84
+ python -m pip install --upgrade pip
85
+ pip install build twine
86
+
87
+ - name: Build pass A
88
+ run: python -m build --sdist --wheel --outdir dist-pass-a
89
+
90
+ - name: Build pass B
91
+ run: python -m build --sdist --wheel --outdir dist-pass-b
92
+
93
+ - name: Verify reproducibility
94
+ run: python scripts/verify_reproducible_build.py dist-pass-a dist-pass-b
95
+
96
+ - name: Validate distribution metadata
97
+ run: twine check dist-pass-a/*
98
+
99
+ - name: Upload package artifacts
100
+ uses: actions/upload-artifact@v4
101
+ with:
102
+ name: package-artifacts
103
+ path: dist-pass-a/*
104
+
105
+ security-compliance:
106
+ runs-on: ubuntu-latest
107
+ steps:
108
+ - name: Checkout
109
+ uses: actions/checkout@v4
110
+
111
+ - name: Install uv
112
+ uses: astral-sh/setup-uv@v5
113
+
114
+ - name: Setup Python
115
+ uses: actions/setup-python@v5
116
+ with:
117
+ python-version: "3.12"
118
+
119
+ - name: Install project + security/compliance tooling (locked)
120
+ run: uv sync --all-extras --frozen
121
+
122
+ - name: Export requirements for audit (exclude local package)
123
+ run: |
124
+ mkdir -p compliance
125
+ uv export --format requirements-txt --all-extras --no-emit-project --frozen -o compliance/audit-requirements.txt
126
+
127
+ - name: Dependency vulnerability audit
128
+ run: uv run pip-audit --strict -r compliance/audit-requirements.txt
129
+
130
+ - name: Generate SBOM
131
+ run: |
132
+ mkdir -p compliance
133
+ uv run cyclonedx-py environment --output-file compliance/sbom.cdx.json --of JSON
134
+
135
+ - name: Generate dependency licenses report
136
+ run: uv run pip-licenses --format=json --output-file=./compliance/licenses.json
137
+
138
+ - name: Enforce dependency license policy
139
+ run: uv run python scripts/check_license_policy.py
140
+
141
+ - name: Upload compliance artifacts
142
+ uses: actions/upload-artifact@v4
143
+ with:
144
+ name: compliance-artifacts
145
+ path: compliance/*
@@ -0,0 +1,85 @@
1
+ name: Publish Internal Registry
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ dry_run:
7
+ description: "Run build and checks without uploading"
8
+ required: true
9
+ default: true
10
+ type: boolean
11
+
12
+ permissions:
13
+ contents: read
14
+ id-token: write
15
+ attestations: write
16
+
17
+ jobs:
18
+ build:
19
+ runs-on: ubuntu-latest
20
+ env:
21
+ SOURCE_DATE_EPOCH: "1735689600"
22
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
23
+ steps:
24
+ - name: Checkout
25
+ uses: actions/checkout@v4
26
+
27
+ - name: Setup Python
28
+ uses: actions/setup-python@v5
29
+ with:
30
+ python-version: "3.12"
31
+
32
+ - name: Install release tools
33
+ run: |
34
+ python -m pip install --upgrade pip
35
+ pip install -e ".[release]"
36
+
37
+ - name: Build wheel and sdist
38
+ run: python -m build --sdist --wheel
39
+
40
+ - name: Validate distributions
41
+ run: twine check dist/*
42
+
43
+ - name: Upload package artifacts
44
+ uses: actions/upload-artifact@v4
45
+ with:
46
+ name: internal-release-artifacts
47
+ path: dist/*
48
+
49
+ # Skipped on private user-owned repos (GitHub does not persist attestations there).
50
+ - name: Generate provenance attestation
51
+ if: github.repository_visibility == 'public'
52
+ uses: actions/attest-build-provenance@v2
53
+ with:
54
+ subject-path: "dist/*"
55
+
56
+ publish:
57
+ runs-on: ubuntu-latest
58
+ needs: build
59
+ if: ${{ !inputs.dry_run }}
60
+ environment: internal-release
61
+ steps:
62
+ - name: Download build artifacts
63
+ uses: actions/download-artifact@v4
64
+ with:
65
+ name: internal-release-artifacts
66
+ path: dist
67
+
68
+ - name: Setup Python
69
+ uses: actions/setup-python@v5
70
+ with:
71
+ python-version: "3.12"
72
+
73
+ - name: Install twine
74
+ run: |
75
+ python -m pip install --upgrade pip
76
+ pip install twine
77
+
78
+ - name: Publish to internal package registry
79
+ env:
80
+ TWINE_USERNAME: ${{ secrets.INTERNAL_PYPI_USERNAME }}
81
+ TWINE_PASSWORD: ${{ secrets.INTERNAL_PYPI_PASSWORD }}
82
+ INTERNAL_REPOSITORY_URL: ${{ secrets.INTERNAL_PYPI_REPOSITORY_URL }}
83
+ run: |
84
+ test -n "$INTERNAL_REPOSITORY_URL"
85
+ twine upload --repository-url "$INTERNAL_REPOSITORY_URL" dist/*
@@ -0,0 +1,74 @@
1
+ name: Publish PyPI (Guarded)
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ dry_run:
7
+ description: "Run full release checks but do not publish"
8
+ required: true
9
+ default: true
10
+ type: boolean
11
+
12
+ permissions:
13
+ contents: read
14
+ id-token: write
15
+ # Only needed when "Generate provenance attestation" runs (public repos).
16
+ attestations: write
17
+
18
+ jobs:
19
+ build:
20
+ runs-on: ubuntu-latest
21
+ env:
22
+ SOURCE_DATE_EPOCH: "1735689600"
23
+ # Reduces Node 20 deprecation noise until upstream actions default to Node 24.
24
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@v4
28
+
29
+ - name: Setup Python
30
+ uses: actions/setup-python@v5
31
+ with:
32
+ python-version: "3.12"
33
+
34
+ - name: Install release tools
35
+ run: |
36
+ python -m pip install --upgrade pip
37
+ pip install -e ".[release]"
38
+
39
+ - name: Build wheel and sdist
40
+ run: python -m build --sdist --wheel
41
+
42
+ - name: Validate package
43
+ run: twine check dist/*
44
+
45
+ - name: Upload package artifacts
46
+ uses: actions/upload-artifact@v4
47
+ with:
48
+ name: pypi-release-artifacts
49
+ path: dist/*
50
+
51
+ # Build attestations are not available for user-owned private repositories.
52
+ # Re-enable when the repo is public (or organization-owned with attestations enabled).
53
+ - name: Generate provenance attestation
54
+ if: github.repository_visibility == 'public'
55
+ uses: actions/attest-build-provenance@v2
56
+ with:
57
+ subject-path: "dist/*"
58
+
59
+ publish:
60
+ runs-on: ubuntu-latest
61
+ needs: build
62
+ if: ${{ !inputs.dry_run }}
63
+ environment: pypi-release
64
+ steps:
65
+ - name: Download build artifacts
66
+ uses: actions/download-artifact@v4
67
+ with:
68
+ name: pypi-release-artifacts
69
+ path: dist
70
+
71
+ - name: Publish to PyPI
72
+ uses: pypa/gh-action-pypi-publish@release/v1
73
+ with:
74
+ packages-dir: dist
@@ -0,0 +1,13 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ .pytest_cache/
5
+ .mypy_cache/
6
+ .ruff_cache/
7
+ .venv/
8
+ venv/
9
+ dist/
10
+ build/
11
+ .DS_Store
12
+ .env
13
+ .env.local
@@ -0,0 +1,33 @@
1
+ # Contributing to EitohForge
2
+
3
+ ## Requirements
4
+
5
+ - Python 3.12+
6
+ - Install dev dependencies from `pyproject.toml`.
7
+
8
+ ## Local Workflow
9
+
10
+ 1. Run lint checks.
11
+ 2. Run type checks.
12
+ 3. Run tests.
13
+ 4. Update docs when behavior or APIs change.
14
+
15
+ ## Quality Gates
16
+
17
+ - Lint must pass.
18
+ - Type checks must pass.
19
+ - Tests must pass.
20
+ - Migration and config-impacting changes must include docs updates.
21
+ - Migration policy check must pass (`python scripts/check_migration_policy.py`).
22
+
23
+ ## Migration Safety Rules
24
+
25
+ - Destructive migrations (drop/truncate) are blocked unless explicitly approved.
26
+ - To approve a destructive migration, include this marker in the migration file:
27
+ - `MIGRATION_APPROVED_DESTRUCTIVE`
28
+
29
+ ## Coding Rules
30
+
31
+ - Keep domain logic framework-agnostic where possible.
32
+ - Prefer typed contracts over raw dictionaries.
33
+ - Avoid breaking public APIs without explicit versioning and release notes.
@@ -0,0 +1,72 @@
1
+ Metadata-Version: 2.4
2
+ Name: eitohforge
3
+ Version: 0.1.0
4
+ Summary: Enterprise backend SDK and CLI for FastAPI systems.
5
+ Project-URL: Homepage, https://github.com/eitoh-brand/EitohForge
6
+ Project-URL: Repository, https://github.com/eitoh-brand/EitohForge
7
+ Project-URL: Issues, https://github.com/eitoh-brand/EitohForge/issues
8
+ Author: EitohTech
9
+ License: Proprietary
10
+ Keywords: cli,enterprise,fastapi,scaffold,sdk
11
+ Classifier: Environment :: Console
12
+ Classifier: Framework :: FastAPI
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Typing :: Typed
19
+ Requires-Python: >=3.12
20
+ Requires-Dist: alembic>=1.16.0
21
+ Requires-Dist: fastapi>=0.116.0
22
+ Requires-Dist: jinja2>=3.1.0
23
+ Requires-Dist: opentelemetry-api>=1.0.0
24
+ Requires-Dist: opentelemetry-exporter-otlp>=1.0.0
25
+ Requires-Dist: opentelemetry-sdk>=1.0.0
26
+ Requires-Dist: prometheus-client>=0.20.0
27
+ Requires-Dist: psycopg[binary]>=3.2.0
28
+ Requires-Dist: pydantic-settings>=2.10.0
29
+ Requires-Dist: pydantic>=2.11.0
30
+ Requires-Dist: pymysql>=1.1.0
31
+ Requires-Dist: redis>=5.0.0
32
+ Requires-Dist: sqlalchemy>=2.0.0
33
+ Requires-Dist: typer>=0.16.0
34
+ Provides-Extra: dev
35
+ Requires-Dist: build>=1.2.0; extra == 'dev'
36
+ Requires-Dist: httpx>=0.28.0; extra == 'dev'
37
+ Requires-Dist: mypy>=1.16.0; extra == 'dev'
38
+ Requires-Dist: pytest-cov>=6.2.0; extra == 'dev'
39
+ Requires-Dist: pytest>=8.3.0; extra == 'dev'
40
+ Requires-Dist: ruff>=0.12.0; extra == 'dev'
41
+ Requires-Dist: uvicorn>=0.32.0; extra == 'dev'
42
+ Provides-Extra: release
43
+ Requires-Dist: build>=1.2.0; extra == 'release'
44
+ Requires-Dist: cyclonedx-bom>=4.0.0; extra == 'release'
45
+ Requires-Dist: pip-audit>=2.8.0; extra == 'release'
46
+ Requires-Dist: pip-licenses>=4.4.0; extra == 'release'
47
+ Requires-Dist: twine>=5.1.0; extra == 'release'
48
+ Description-Content-Type: text/markdown
49
+
50
+ # EitohForge
51
+
52
+ EitohForge is an enterprise-focused backend SDK and CLI framework for bootstrapping FastAPI services with strong architecture, security, and operations defaults.
53
+
54
+ ## Current State
55
+
56
+ This repository contains an actively implemented enterprise SDK/CLI baseline through Phase 14.
57
+
58
+ ## Planned Command
59
+
60
+ `eitohforge create project <name>`
61
+
62
+ ## Key Guides
63
+
64
+ - `docs/guides/usage-complete.md`
65
+ - `docs/guides/cookbook.md`
66
+ - `docs/guides/enterprise-readiness-checklist.md`
67
+ - `docs/releases/v0.1.0-rc.md`
68
+
69
+ ## Reference examples
70
+
71
+ - `examples/example-minimal/` — smallest SDK-backed app (health + capabilities).
72
+ - `examples/example-enterprise/` — middleware stack, health family, tenant, feature flags.
@@ -0,0 +1,23 @@
1
+ # EitohForge
2
+
3
+ EitohForge is an enterprise-focused backend SDK and CLI framework for bootstrapping FastAPI services with strong architecture, security, and operations defaults.
4
+
5
+ ## Current State
6
+
7
+ This repository contains an actively implemented enterprise SDK/CLI baseline through Phase 14.
8
+
9
+ ## Planned Command
10
+
11
+ `eitohforge create project <name>`
12
+
13
+ ## Key Guides
14
+
15
+ - `docs/guides/usage-complete.md`
16
+ - `docs/guides/cookbook.md`
17
+ - `docs/guides/enterprise-readiness-checklist.md`
18
+ - `docs/releases/v0.1.0-rc.md`
19
+
20
+ ## Reference examples
21
+
22
+ - `examples/example-minimal/` — smallest SDK-backed app (health + capabilities).
23
+ - `examples/example-enterprise/` — middleware stack, health family, tenant, feature flags.
@@ -0,0 +1,73 @@
1
+ # EitohForge Planning Docs
2
+
3
+ This folder contains the long-term planning and implementation documentation for the EitohForge backend SDK platform.
4
+
5
+ **Blueprint (repository root):** `../secure_backend_sdk_architecture.md` — full A–Z target architecture; the **Appendix — EitohForge implementation map** at the end of that file compares §1–§44 to what is implemented today.
6
+
7
+ ## Documents
8
+
9
+ - `roadmap/master-implementation-roadmap.md`
10
+ Full end-to-end phase plan (scope, milestones, acceptance criteria).
11
+ - `roadmap/execution-board.md`
12
+ Task-level execution board with IDs, estimates, dependencies, and done criteria.
13
+ - `roadmap/architecture-coverage-matrix.md`
14
+ Traceability map from all 44 architecture items to tracked tasks.
15
+ - `roadmap/blueprint-completion-waves.md`
16
+ Post-baseline plan to reach L1/L2/L3 depth vs `secure_backend_sdk_architecture.md`; links to Phase 17 tasks (`P17-*`).
17
+ - `standards/engineering-standards.md`
18
+ Coding, validation, migration, security, testing, and release standards.
19
+ - `standards/flaky-test-policy.md`
20
+ Quarantine, ownership, and remediation SLA for flaky tests.
21
+ - `guides/phase-0-and-1-kickoff.md`
22
+ Immediate implementation checklist for getting started.
23
+ - `guides/python-packaging-and-publishing.md`
24
+ Package build, release channels, and publish workflow.
25
+ - `guides/usage-complete.md`
26
+ Full usage: install, config, migrations, auth, plugins, deploy, troubleshooting.
27
+ - `guides/onboarding-qa-simulation.md`
28
+ New-hire / release QA checklist for onboarding without hand-holding.
29
+ - `guides/enterprise-readiness-checklist.md`
30
+ Production and enterprise readiness validation checklist.
31
+ - `guides/enterprise-deployment-and-networking.md`
32
+ SSL/TLS, load balancing, deployment reliability, and HA guidance.
33
+ - `guides/tls-and-cert-rotation-runbook.md`
34
+ Ingress TLS policy, cert lifecycle, and emergency rotation procedure.
35
+ - `guides/mtls-trust-model.md`
36
+ Optional internal mTLS trust domains, identity mapping, and rollout modes.
37
+ - `guides/load-balancing-and-health-routing.md`
38
+ LB architecture, readiness routing policy, and health-check baseline.
39
+ - `guides/deployment-strategies-and-rollback-controls.md`
40
+ Rolling/blue-green/canary playbooks with abort and rollback controls.
41
+ - `guides/testing-and-example-project-strategy.md`
42
+ Test completeness model and reference example project requirements.
43
+ - `guides/repository-contracts-and-dto-boundaries.md`
44
+ Clean architecture repository contract and persistence DTO reference.
45
+ - `guides/query-spec-reference.md`
46
+ `QuerySpec` filter operators, pagination modes, and optional column validation.
47
+ - `guides/cookbook.md`
48
+ Implementation recipes for tenanting, plugins, flags, hardening, and perf checks.
49
+ - `guides/operations-runbook.md`
50
+ Deploy, rollback, SLO, error budget, and incident response baseline.
51
+ - `performance/baseline.md`
52
+ Latest generated baseline benchmark report.
53
+ - `releases/v0.1.0-rc.md`
54
+ Release candidate readiness and validation checklist.
55
+
56
+ ## How to Use
57
+
58
+ 1. Review `master-implementation-roadmap.md` to confirm scope and sequence.
59
+ 2. Validate architecture completeness in `architecture-coverage-matrix.md`.
60
+ 3. Execute tasks from `execution-board.md` in dependency order.
61
+ 4. Follow `engineering-standards.md` for all PRs and generated templates.
62
+ 5. Align release expectations with `python-packaging-and-publishing.md`.
63
+ 6. Align deployment posture with `enterprise-deployment-and-networking.md`.
64
+ 7. Align test posture with `testing-and-example-project-strategy.md`.
65
+ 8. Validate launch quality with `enterprise-readiness-checklist.md`.
66
+ 9. Start implementation using `phase-0-and-1-kickoff.md`.
67
+
68
+ ## Update Rules
69
+
70
+ - Keep task IDs stable once assigned.
71
+ - Mark task state directly in `execution-board.md`.
72
+ - If scope changes, update both roadmap and execution board in the same change.
73
+ - Keep standards backward compatible unless versioned under a new section.
@@ -0,0 +1,22 @@
1
+ # ADR 0001: ORM and Migration Strategy
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Context
8
+
9
+ EitohForge needs a production-safe, typed, migration-driven relational persistence baseline that can evolve into polyglot storage later.
10
+
11
+ ## Decision
12
+
13
+ - Primary ORM stack: SQLAlchemy 2.x style.
14
+ - Migration tool: Alembic.
15
+ - Primary relational adapter for first release: Postgres.
16
+ - Migration operations are mandatory for schema changes.
17
+
18
+ ## Consequences
19
+
20
+ - Strong ecosystem support for enterprise usage.
21
+ - Stable migration workflow with upgrade/downgrade controls.
22
+ - Clear expansion path to other providers through adapter interfaces.
@@ -0,0 +1,22 @@
1
+ # ADR 0002: Typing and Linting Strategy
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Context
8
+
9
+ The SDK is intended for enterprise-grade adoption and requires strict static guarantees and consistent code quality.
10
+
11
+ ## Decision
12
+
13
+ - Type checker: `mypy` in strict mode.
14
+ - Linter/formatter baseline: `ruff`.
15
+ - All public SDK APIs must be explicitly typed.
16
+ - CI blocks merge when lint or type checks fail.
17
+
18
+ ## Consequences
19
+
20
+ - Higher initial development discipline.
21
+ - Lower runtime defect rate from type mismatches.
22
+ - More maintainable generated code for downstream teams.
@@ -0,0 +1,23 @@
1
+ # ADR 0003: Packaging and Publish Strategy
2
+
3
+ ## Status
4
+
5
+ Accepted
6
+
7
+ ## Context
8
+
9
+ EitohForge must be distributed in a reproducible, enterprise-ready way with predictable installs and release controls.
10
+
11
+ ## Decision
12
+
13
+ - Package distribution: single package `eitohforge` (SDK + CLI) for initial releases.
14
+ - Build backend: hatchling via `pyproject.toml`.
15
+ - Artifact formats: `wheel` and `sdist`.
16
+ - Primary publish channel: internal package registry.
17
+ - Optional external channel: PyPI with approval gate.
18
+
19
+ ## Consequences
20
+
21
+ - Simplified onboarding (`pip install eitohforge`).
22
+ - Stronger release control through internal-first distribution.
23
+ - Future split into separate `eitohforge-sdk` and `eitohforge-cli` remains possible.