quadkit-cli 0.0.3__tar.gz → 0.0.41__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 (199) hide show
  1. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/PKG-INFO +66 -32
  2. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/README.md +44 -10
  3. quadkit_cli-0.0.41/example.yaml +8 -0
  4. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/pyproject.toml +22 -23
  5. quadkit_cli-0.0.41/src/quadkit/cli/commands/__init__.py +48 -0
  6. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/config.py +37 -10
  7. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_bootstrap.py +5 -5
  8. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/events.py +7 -6
  9. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/init.py +3 -1
  10. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/inspect.py +2 -1
  11. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/meta.py +58 -38
  12. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/new.py +6 -3
  13. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/project.py +3 -4
  14. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/system.py +38 -33
  15. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/config.py +0 -3
  16. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/core.py +4 -1
  17. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/__init__.py +0 -2
  18. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/config_loader.py +10 -2
  19. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/output/manager.py +8 -9
  20. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/package_names.py +42 -8
  21. quadkit_cli-0.0.41/src/quadkit/cli/registry/__init__.py +363 -0
  22. quadkit_cli-0.0.41/src/quadkit/cli/registry/_lazy_exports.py +167 -0
  23. quadkit_cli-0.0.41/src/quadkit/cli/registry/database.py +216 -0
  24. quadkit_cli-0.0.3/src/quadkit/cli/registry/database.py → quadkit_cli-0.0.41/src/quadkit/cli/registry/database_backends.py +6 -192
  25. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/environment.py +52 -2
  26. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/providers.py +3 -14
  27. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/migration.py +7 -1
  28. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/presets.py +7 -5
  29. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/secrets.py +6 -1
  30. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/template.py +4 -5
  31. quadkit_cli-0.0.41/src/quadkit/cli/runtime/__init__.py +37 -0
  32. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/runtime/context.py +8 -1
  33. quadkit_cli-0.0.41/src/quadkit/cli/runtime/main.py +330 -0
  34. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/__init__.py +59 -0
  35. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/app_files.py +377 -0
  36. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/module_files.py +328 -0
  37. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/render.py +193 -0
  38. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/specs.py +201 -0
  39. quadkit_cli-0.0.41/src/quadkit/cli/scaffold/support_files.py +143 -0
  40. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/conftest.py +2 -4
  41. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_system.py +15 -5
  42. quadkit_cli-0.0.41/tests/unit/registry/test_completion.py +80 -0
  43. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_database.py +5 -5
  44. quadkit_cli-0.0.41/tests/unit/registry/test_presets.py +120 -0
  45. quadkit_cli-0.0.41/tests/unit/test_cli_import_isolation.py +229 -0
  46. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_new.py +1 -1
  47. quadkit_cli-0.0.3/example.yaml +0 -13
  48. quadkit_cli-0.0.3/src/quadkit/cli/commands/__init__.py +0 -36
  49. quadkit_cli-0.0.3/src/quadkit/cli/lib/config_gen.py +0 -310
  50. quadkit_cli-0.0.3/src/quadkit/cli/lib/console.py +0 -18
  51. quadkit_cli-0.0.3/src/quadkit/cli/registry/__init__.py +0 -338
  52. quadkit_cli-0.0.3/src/quadkit/cli/runtime/__init__.py +0 -8
  53. quadkit_cli-0.0.3/src/quadkit/cli/runtime/main.py +0 -154
  54. quadkit_cli-0.0.3/src/quadkit/cli/scaffold.py +0 -1176
  55. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/.gitignore +0 -0
  56. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/LICENSE +0 -0
  57. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/NOTICE +0 -0
  58. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/__init__.py +0 -0
  59. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/assembly/__init__.py +0 -0
  60. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/assembly/assembler.py +0 -0
  61. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/add.py +0 -0
  62. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/config_utils.py +0 -0
  63. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/contrib.py +0 -0
  64. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db.py +0 -0
  65. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_data.py +0 -0
  66. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_migrations.py +0 -0
  67. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/db_commands_ops.py +0 -0
  68. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/dev.py +0 -0
  69. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/gen.py +0 -0
  70. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/py.typed +0 -0
  71. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/run.py +0 -0
  72. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/commands/shell.py +0 -0
  73. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/constants.py +0 -0
  74. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/__init__.py +0 -0
  75. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/base.py +0 -0
  76. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/discovery.py +0 -0
  77. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/registry.py +0 -0
  78. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/contributors/runtime.py +1 -1
  79. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/decorators.py +0 -0
  80. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/__init__.py +0 -0
  81. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/provider.py +0 -0
  82. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/sub_providers/__init__.py +0 -0
  83. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/di/sub_providers/contributor.py +0 -0
  84. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/events.py +0 -0
  85. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/exceptions.py +0 -0
  86. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/__init__.py +0 -0
  87. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/base.py +0 -0
  88. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/field_parser.py +0 -0
  89. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/provider.py +0 -0
  90. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/generators/test.py +0 -0
  91. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/hooks.py +0 -0
  92. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/layout.py +0 -0
  93. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/entry_point.py +0 -0
  94. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/naming.py +0 -0
  95. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/lib/templates.py +0 -0
  96. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/module.py +0 -0
  97. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/output/__init__.py +0 -0
  98. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/protocols.py +0 -0
  99. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/py.typed +0 -0
  100. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/backend_base.py +0 -0
  101. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/command.py +0 -0
  102. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/completion.py +0 -0
  103. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/config.py +0 -0
  104. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/formatter.py +0 -0
  105. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/generator.py +0 -0
  106. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health.py +0 -0
  107. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/__init__.py +0 -0
  108. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/base.py +0 -0
  109. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/deps.py +0 -0
  110. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/project.py +0 -0
  111. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/python_env.py +0 -0
  112. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/tools.py +0 -0
  113. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/health_checks/vcs_docker.py +0 -0
  114. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/hook.py +0 -0
  115. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/inspect.py +0 -0
  116. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider.py +0 -0
  117. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider_catalog.py +0 -0
  118. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/provider_registry.py +0 -0
  119. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/serializer.py +0 -0
  120. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/server.py +0 -0
  121. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/task.py +0 -0
  122. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/telemetry.py +0 -0
  123. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/version.py +0 -0
  124. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/registry/watcher.py +0 -0
  125. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/runtime/error_handler.py +0 -0
  126. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/scaffold_package.py +0 -0
  127. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/provider.py.jinja2 +0 -0
  128. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/py.typed +0 -0
  129. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/templates/test_unit.py.jinja2 +0 -0
  130. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/cli/types.py +0 -0
  131. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/src/quadkit/py.typed +0 -0
  132. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/integration/__init__.py +0 -0
  133. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/integration/test_cli_lifecycle.py +0 -0
  134. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/test_package_structure_p1.py +0 -0
  135. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/__init__.py +0 -0
  136. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/_test_cli_contribution_system_support.py +0 -0
  137. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/__init__.py +0 -0
  138. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_config.py +0 -0
  139. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_config_happy_paths.py +0 -0
  140. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_contrib.py +0 -0
  141. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_inspect.py +0 -0
  142. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_meta.py +0 -0
  143. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_run.py +0 -0
  144. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/commands/test_shell.py +0 -0
  145. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/di/test_config_alignment.py +0 -0
  146. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/lib/test_templates.py +0 -0
  147. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/__init__.py +0 -0
  148. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_environment.py +0 -0
  149. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_formatter.py +0 -0
  150. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_health.py +0 -0
  151. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_hook.py +0 -0
  152. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_inspect_registry.py +0 -0
  153. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_migration.py +0 -0
  154. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_secrets.py +0 -0
  155. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_serializer.py +0 -0
  156. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_task.py +0 -0
  157. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_telemetry.py +0 -0
  158. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_version.py +0 -0
  159. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/registry/test_watcher.py +0 -0
  160. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_base_contributor.py +0 -0
  161. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_constants.py +0 -0
  162. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_context.py +0 -0
  163. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_contribution_system.py +0 -0
  164. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_errors.py +0 -0
  165. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_exceptions.py +0 -0
  166. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_module.py +0 -0
  167. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_cli_types.py +0 -0
  168. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_async.py +0 -0
  169. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_loader.py +0 -0
  170. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_save.py +0 -0
  171. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_config_validate.py +0 -0
  172. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_contributor_registry.py +0 -0
  173. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_contributor_runtime.py +0 -0
  174. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_core_contributor.py +0 -0
  175. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_db.py +0 -0
  176. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_decorators.py +0 -0
  177. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_dev_command.py +0 -0
  178. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_error_handler.py +0 -0
  179. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_events.py +0 -0
  180. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_exception_handling.py +0 -0
  181. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_field_parser.py +0 -0
  182. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen.py +0 -0
  183. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen_controller.py +0 -0
  184. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_gen_provider.py +0 -0
  185. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generator_base.py +0 -0
  186. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generator_registry.py +0 -0
  187. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_generators_contract.py +0 -0
  188. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_hooks.py +0 -0
  189. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_init_command.py +0 -0
  190. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_layout.py +0 -0
  191. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_main.py +0 -0
  192. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_output.py +0 -0
  193. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_output_json.py +0 -0
  194. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_project.py +0 -0
  195. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_project_layout.py +0 -0
  196. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_provider_registry.py +0 -0
  197. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_round40_hardening.py +0 -0
  198. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_run_detection.py +0 -0
  199. {quadkit_cli-0.0.3 → quadkit_cli-0.0.41}/tests/unit/test_server_registry.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit-cli
3
- Version: 0.0.3
3
+ Version: 0.0.41
4
4
  Summary: Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools
5
- Project-URL: Homepage, https://quadkit.dev
5
+ Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
7
- Project-URL: Documentation, https://quadkit.dev
7
+ Project-URL: Documentation, https://dbtinoy-.github.io/quadkit/
8
8
  Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
9
9
  Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
10
10
  Author-email: Quadkit Framework Team <team@quadkit.dev>
@@ -26,36 +26,42 @@ Classifier: Topic :: Software Development :: Code Generators
26
26
  Classifier: Topic :: Utilities
27
27
  Classifier: Typing :: Typed
28
28
  Requires-Python: >=3.11
29
- Requires-Dist: aiofiles>=23.0.0
30
- Requires-Dist: httpx>=0.25.0
31
- Requires-Dist: jinja2>=3.1.0
32
- Requires-Dist: pydantic>=2.10.0
33
- Requires-Dist: pyyaml>=6.0
29
+ Requires-Dist: aiofiles<26,>=23.0.0
30
+ Requires-Dist: click<9,>=8.1.0
31
+ Requires-Dist: httpx<1,>=0.25.0
32
+ Requires-Dist: jinja2<4,>=3.1.0
33
+ Requires-Dist: pyyaml<7,>=6.0
34
34
  Requires-Dist: quadkit-contracts>=0.0.2
35
35
  Requires-Dist: quadkit>=0.0.2
36
- Requires-Dist: rich>=13.0.0
37
- Requires-Dist: shellingham>=1.5.0
38
- Requires-Dist: tomli>=2.0.0
39
- Requires-Dist: typer[all]>=0.9.0
40
- Requires-Dist: watchfiles>=0.21.0
36
+ Requires-Dist: rich<14,>=13.0.0
37
+ Requires-Dist: shellingham<2,>=1.5.0
38
+ Requires-Dist: tomli<3,>=2.0.0
39
+ Requires-Dist: typer[all]<1,>=0.9.0
40
+ Requires-Dist: watchfiles<2,>=0.21.0
41
41
  Provides-Extra: all
42
- Requires-Dist: pytest-asyncio>=0.21.0; extra == 'all'
43
- Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
44
- Requires-Dist: pytest>=8.0.0; extra == 'all'
42
+ Requires-Dist: pytest-asyncio<2,>=0.21.0; extra == 'all'
43
+ Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'all'
44
+ Requires-Dist: pytest<10,>=8.0.0; extra == 'all'
45
45
  Requires-Dist: quadkit-testing>=0.0.2; extra == 'all'
46
46
  Provides-Extra: dev
47
- Requires-Dist: black>=23.0.0; extra == 'dev'
48
- Requires-Dist: mypy>=1.0.0; extra == 'dev'
49
- Requires-Dist: ruff>=0.1.0; extra == 'dev'
47
+ Requires-Dist: black<27,>=23.0.0; extra == 'dev'
48
+ Requires-Dist: mypy<3,>=1.0.0; extra == 'dev'
49
+ Requires-Dist: ruff<1,>=0.1.0; extra == 'dev'
50
50
  Provides-Extra: test
51
- Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
52
- Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
53
- Requires-Dist: pytest>=8.0.0; extra == 'test'
51
+ Requires-Dist: pytest-asyncio<2,>=0.21.0; extra == 'test'
52
+ Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'test'
53
+ Requires-Dist: pytest<10,>=8.0.0; extra == 'test'
54
54
  Requires-Dist: quadkit-testing>=0.0.2; extra == 'test'
55
55
  Description-Content-Type: text/markdown
56
56
 
57
57
  # quadkit-cli
58
58
 
59
+ ![Quadkit](https://raw.githubusercontent.com/dbtinoy-/quadkit/main/banner.jpg)
60
+
61
+ [![PyPI](https://img.shields.io/pypi/v/quadkit-cli?color=%2322c55e&label=pypi)](https://pypi.org/project/quadkit-cli/)
62
+ [![Python](https://img.shields.io/pypi/pyversions/quadkit-cli?color=%2322c55e)](https://pypi.org/project/quadkit-cli/)
63
+ [![License](https://img.shields.io/pypi/l/quadkit-cli?color=%2322c55e)](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
64
+
59
65
  The `quadkit` command line: project scaffolding, generators, a smart
60
66
  runner, and administrative commands for every stage of the application
61
67
  lifecycle. Contributor-based — other packages can register their own
@@ -63,6 +69,16 @@ commands.
63
69
 
64
70
  For day-to-day Quadkit developers: scaffold, generate, run, inspect.
65
71
 
72
+ ## The quadkit family
73
+
74
+ | Package | Role |
75
+ | --- | --- |
76
+ | [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
77
+ | [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
78
+ | [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
79
+ | [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
80
+ | [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
81
+
66
82
  ## Installation
67
83
 
68
84
  ```bash
@@ -78,15 +94,24 @@ Requires **Python >= 3.11**.
78
94
  There is no code to write — the product is the command line:
79
95
 
80
96
  ```bash
81
- # Create a new project (template defaults to web-api)
97
+ # Create a new project (template defaults to web-api); the package
98
+ # inside is my_api/ with app.py exposing create_app()
82
99
  quadkit new project my-api
100
+ cd my-api
83
101
 
84
102
  # Generate application code (list all generators: quadkit gen list)
85
103
  quadkit gen provider MyProvider
86
104
  quadkit gen controller Orders
87
105
 
88
106
  # Serve the application; reload is on by default, pass --no-reload in prod
89
- quadkit run my_app.app:create_app --host 0.0.0.0 --port 8000 --workers 4
107
+ quadkit run my_api.app:create_app --host 0.0.0.0 --port 8000 --workers 4
108
+ ```
109
+
110
+ Eleven generators ship today (`quadkit gen list`):
111
+
112
+ ```text
113
+ controller middleware graphql webhook websocket exception_filter
114
+ interceptor error resource provider test
90
115
  ```
91
116
 
92
117
  Global options: `--json` for machine-readable output, `--quiet`,
@@ -110,18 +135,16 @@ Global options: `--json` for machine-readable output, `--quiet`,
110
135
  | `quadkit version` | framework and package versions |
111
136
 
112
137
  Per-distribution guide:
113
- [quadkit-cli reference](../../docs/reference/quadkit-cli.md).
138
+ [quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
114
139
 
115
140
  ## Optional extras
116
141
 
117
- Verified against the package's `pyproject.toml`: `[dev]`, `[test]`,
118
- `[all]`.
142
+ `[dev]` and `[test]` bundle tooling; `[all]` pulls everything.
119
143
 
120
144
  ## Configuration
121
145
 
122
146
  The CLI reads `application.yaml` like any Quadkit application; its own
123
- section is `cli` (fields include `default_template`, `default_database`,
124
- `color`, `verbose`), overridable via `QK_CLI__*`, e.g.
147
+ section is `cli` (`color`), overridable via `QK_CLI__*`, e.g.
125
148
  `QK_CLI__COLOR=false`.
126
149
 
127
150
  ## Error handling
@@ -140,7 +163,7 @@ exported tree.
140
163
  The CLI reads configuration and scaffolds code — it does not serve
141
164
  traffic. As with every distribution, keep the `0.x` line pinned and
142
165
  review release notes on upgrade. Report vulnerabilities privately per
143
- [SECURITY.md](../../SECURITY.md).
166
+ [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
144
167
 
145
168
  ## Stability
146
169
 
@@ -148,6 +171,17 @@ Version `0.0.3` in the `0.x` series, released in lockstep with the
148
171
  other four distributions; APIs may change between minor versions until
149
172
  1.0 — pin an exact version (`quadkit-cli==0.0.3`) or a tight range
150
173
  (`>=0.0.3,<0.1.0`). Full policy:
151
- [stability and compatibility](../../docs/reference/stability.md).
174
+ [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
175
+
176
+ ## Links
177
+
178
+ - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
179
+ - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
180
+ - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
181
+ - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
182
+ - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
183
+ - **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
152
184
 
153
- Issues: <https://github.com/dbtinoy-/quadkit/issues>
185
+ Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
186
+ Quadkit logo are trademarks of the project — see
187
+ [TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).
@@ -1,5 +1,11 @@
1
1
  # quadkit-cli
2
2
 
3
+ ![Quadkit](https://raw.githubusercontent.com/dbtinoy-/quadkit/main/banner.jpg)
4
+
5
+ [![PyPI](https://img.shields.io/pypi/v/quadkit-cli?color=%2322c55e&label=pypi)](https://pypi.org/project/quadkit-cli/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/quadkit-cli?color=%2322c55e)](https://pypi.org/project/quadkit-cli/)
7
+ [![License](https://img.shields.io/pypi/l/quadkit-cli?color=%2322c55e)](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
8
+
3
9
  The `quadkit` command line: project scaffolding, generators, a smart
4
10
  runner, and administrative commands for every stage of the application
5
11
  lifecycle. Contributor-based — other packages can register their own
@@ -7,6 +13,16 @@ commands.
7
13
 
8
14
  For day-to-day Quadkit developers: scaffold, generate, run, inspect.
9
15
 
16
+ ## The quadkit family
17
+
18
+ | Package | Role |
19
+ | --- | --- |
20
+ | [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
21
+ | [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
22
+ | [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
23
+ | [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
24
+ | [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
25
+
10
26
  ## Installation
11
27
 
12
28
  ```bash
@@ -22,15 +38,24 @@ Requires **Python >= 3.11**.
22
38
  There is no code to write — the product is the command line:
23
39
 
24
40
  ```bash
25
- # Create a new project (template defaults to web-api)
41
+ # Create a new project (template defaults to web-api); the package
42
+ # inside is my_api/ with app.py exposing create_app()
26
43
  quadkit new project my-api
44
+ cd my-api
27
45
 
28
46
  # Generate application code (list all generators: quadkit gen list)
29
47
  quadkit gen provider MyProvider
30
48
  quadkit gen controller Orders
31
49
 
32
50
  # Serve the application; reload is on by default, pass --no-reload in prod
33
- quadkit run my_app.app:create_app --host 0.0.0.0 --port 8000 --workers 4
51
+ quadkit run my_api.app:create_app --host 0.0.0.0 --port 8000 --workers 4
52
+ ```
53
+
54
+ Eleven generators ship today (`quadkit gen list`):
55
+
56
+ ```text
57
+ controller middleware graphql webhook websocket exception_filter
58
+ interceptor error resource provider test
34
59
  ```
35
60
 
36
61
  Global options: `--json` for machine-readable output, `--quiet`,
@@ -54,18 +79,16 @@ Global options: `--json` for machine-readable output, `--quiet`,
54
79
  | `quadkit version` | framework and package versions |
55
80
 
56
81
  Per-distribution guide:
57
- [quadkit-cli reference](../../docs/reference/quadkit-cli.md).
82
+ [quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
58
83
 
59
84
  ## Optional extras
60
85
 
61
- Verified against the package's `pyproject.toml`: `[dev]`, `[test]`,
62
- `[all]`.
86
+ `[dev]` and `[test]` bundle tooling; `[all]` pulls everything.
63
87
 
64
88
  ## Configuration
65
89
 
66
90
  The CLI reads `application.yaml` like any Quadkit application; its own
67
- section is `cli` (fields include `default_template`, `default_database`,
68
- `color`, `verbose`), overridable via `QK_CLI__*`, e.g.
91
+ section is `cli` (`color`), overridable via `QK_CLI__*`, e.g.
69
92
  `QK_CLI__COLOR=false`.
70
93
 
71
94
  ## Error handling
@@ -84,7 +107,7 @@ exported tree.
84
107
  The CLI reads configuration and scaffolds code — it does not serve
85
108
  traffic. As with every distribution, keep the `0.x` line pinned and
86
109
  review release notes on upgrade. Report vulnerabilities privately per
87
- [SECURITY.md](../../SECURITY.md).
110
+ [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
88
111
 
89
112
  ## Stability
90
113
 
@@ -92,6 +115,17 @@ Version `0.0.3` in the `0.x` series, released in lockstep with the
92
115
  other four distributions; APIs may change between minor versions until
93
116
  1.0 — pin an exact version (`quadkit-cli==0.0.3`) or a tight range
94
117
  (`>=0.0.3,<0.1.0`). Full policy:
95
- [stability and compatibility](../../docs/reference/stability.md).
118
+ [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
119
+
120
+ ## Links
121
+
122
+ - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
123
+ - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
124
+ - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
125
+ - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
126
+ - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
127
+ - **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
96
128
 
97
- Issues: <https://github.com/dbtinoy-/quadkit/issues>
129
+ Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
130
+ Quadkit logo are trademarks of the project — see
131
+ [TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).
@@ -0,0 +1,8 @@
1
+ # Copy to application.yaml and adjust to your environment. Remove sections you don't use.
2
+ # Full field reference: see the README Configuration section.
3
+ # YAML key: cli:
4
+ # Environment variable prefix: QK_CLI__
5
+
6
+ cli:
7
+ # Output
8
+ color: true # Enable coloured terminal output (QK_CLI__COLOR)
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "quadkit-cli"
9
- version = "0.0.3"
9
+ version = "0.0.41"
10
10
  description = "Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools"
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.11"
@@ -33,18 +33,18 @@ classifiers = [
33
33
  "Typing :: Typed",
34
34
  ]
35
35
  dependencies = [
36
- "typer[all]>=0.9.0",
37
- "rich>=13.0.0",
38
- "jinja2>=3.1.0",
36
+ "typer[all]>=0.9.0,<1",
37
+ "click>=8.1.0,<9",
38
+ "rich>=13.0.0,<14",
39
+ "jinja2>=3.1.0,<4",
39
40
  "quadkit>=0.0.2",
40
41
  "quadkit-contracts>=0.0.2",
41
- "pyyaml>=6.0",
42
- "httpx>=0.25.0",
43
- "watchfiles>=0.21.0",
44
- "shellingham>=1.5.0",
45
- "pydantic>=2.10.0",
46
- "aiofiles>=23.0.0",
47
- "tomli>=2.0.0",
42
+ "pyyaml>=6.0,<7",
43
+ "httpx>=0.25.0,<1",
44
+ "watchfiles>=0.21.0,<2",
45
+ "shellingham>=1.5.0,<2",
46
+ "aiofiles>=23.0.0,<26",
47
+ "tomli>=2.0.0,<3",
48
48
  ]
49
49
  authors = [
50
50
  { name = "Quadkit Framework Team", email = "team@quadkit.dev" },
@@ -64,27 +64,27 @@ core = "quadkit.cli.contributors.core:CoreCliContributor"
64
64
 
65
65
  [project.optional-dependencies]
66
66
  dev = [
67
- "black>=23.0.0",
68
- "ruff>=0.1.0",
69
- "mypy>=1.0.0",
67
+ "black>=23.0.0,<27",
68
+ "ruff>=0.1.0,<1",
69
+ "mypy>=1.0.0,<3",
70
70
  ]
71
71
  test = [
72
72
  "quadkit-testing>=0.0.2",
73
- "pytest>=8.0.0",
74
- "pytest-asyncio>=0.21.0",
75
- "pytest-cov>=4.0.0",
73
+ "pytest>=8.0.0,<10",
74
+ "pytest-asyncio>=0.21.0,<2",
75
+ "pytest-cov>=4.0.0,<8",
76
76
  ]
77
77
  all = [
78
78
  "quadkit-testing>=0.0.2",
79
- "pytest>=8.0.0",
80
- "pytest-asyncio>=0.21.0",
81
- "pytest-cov>=4.0.0",
79
+ "pytest>=8.0.0,<10",
80
+ "pytest-asyncio>=0.21.0,<2",
81
+ "pytest-cov>=4.0.0,<8",
82
82
  ]
83
83
 
84
84
  [project.urls]
85
- Homepage = "https://quadkit.dev"
85
+ Homepage = "https://dbtinoy-.github.io/quadkit/"
86
86
  Repository = "https://github.com/dbtinoy-/quadkit"
87
- Documentation = "https://quadkit.dev"
87
+ Documentation = "https://dbtinoy-.github.io/quadkit/"
88
88
  Issues = "https://github.com/dbtinoy-/quadkit/issues"
89
89
  Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
90
90
 
@@ -169,4 +169,3 @@ addopts = ["--cov=quadkit.cli", "--cov-report=term", "--cov-fail-under=84"]
169
169
  packages = [
170
170
  "src/quadkit",
171
171
  ]
172
-
@@ -0,0 +1,48 @@
1
+ """Quadkit CLI command modules.
2
+
3
+ Command modules resolve lazily (PEP 562; plans/09172026 C-01): importing a
4
+ single command module — e.g. ``quadkit.cli.commands.meta`` for
5
+ ``quadkit version`` — must not import the other fourteen. The names remain
6
+ importable exactly as before: ``from quadkit.cli.commands import new``.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from typing import Any
12
+
13
+ __all__ = [
14
+ "add",
15
+ "config",
16
+ "contrib",
17
+ "db",
18
+ "dev",
19
+ "events",
20
+ "gen",
21
+ "init",
22
+ "inspect",
23
+ "new",
24
+ "project",
25
+ "run",
26
+ "shell",
27
+ "system",
28
+ ]
29
+
30
+ _LAZY_MODULES: dict[str, str] = {
31
+ name: f"quadkit.cli.commands.{name}" for name in __all__
32
+ }
33
+
34
+
35
+ def __getattr__(name: str) -> Any:
36
+ """Import a command module on first access."""
37
+ module_path = _LAZY_MODULES.get(name)
38
+ if module_path is None:
39
+ raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
40
+ from importlib import import_module
41
+
42
+ value = import_module(module_path)
43
+ globals()[name] = value
44
+ return value
45
+
46
+
47
+ def __dir__() -> list[str]:
48
+ return sorted(set(globals()) | set(_LAZY_MODULES))
@@ -3,10 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import asyncio
6
+ from collections.abc import Callable
6
7
  import os
7
8
  from pathlib import Path
8
9
  import re
9
- from typing import Annotated
10
+ from typing import Annotated, Any
10
11
 
11
12
  import aiofiles
12
13
  import typer
@@ -26,11 +27,37 @@ from quadkit.cli.registry.config import (
26
27
  validate_config,
27
28
  )
28
29
  from quadkit.cli.runtime import handle_errors
30
+ from quadkit.contracts.constants import DOCS_BASE_URL
29
31
  from quadkit.contracts.exceptions.domain import ValidationError
30
32
 
31
33
  app = typer.Typer()
32
34
 
33
35
 
36
+ def _write_config_yaml(out: OutputManager, data: dict[str, Any]) -> None:
37
+ """Print the config as YAML."""
38
+ out.print(yaml.dump(data, sort_keys=False))
39
+
40
+
41
+ def _write_config_json(out: OutputManager, data: dict[str, Any]) -> None:
42
+ """Print the config as JSON."""
43
+ from quadkit import serialization as json
44
+
45
+ out.print(json.dumps(data, indent=2))
46
+
47
+
48
+ def _write_config_table(out: OutputManager, data: dict[str, Any]) -> None:
49
+ """Print the config as a two-column table."""
50
+ out.table(["Key", "Value"], [[k, str(v)] for k, v in data.items()])
51
+
52
+
53
+ #: `--format` value → writer (registry dispatch, no branch chain).
54
+ _CONFIG_WRITERS: dict[str, Callable[[OutputManager, dict[str, Any]], None]] = {
55
+ "yaml": _write_config_yaml,
56
+ "json": _write_config_json,
57
+ "table": _write_config_table,
58
+ }
59
+
60
+
34
61
  @app.command()
35
62
  @handle_errors
36
63
  def show(
@@ -59,15 +86,15 @@ def show(
59
86
 
60
87
  masked_config = _mask_secrets(config_data, reveal=reveal_secrets)
61
88
 
62
- if file_format == "yaml":
63
- out.print(yaml.dump(masked_config, sort_keys=False))
64
- elif file_format == "json":
65
- from quadkit import serialization as json
89
+ writer = _CONFIG_WRITERS.get(file_format)
90
+ if writer is None:
91
+ out.error(
92
+ f"Unsupported format: {file_format}",
93
+ hint=f"Use one of: {', '.join(sorted(_CONFIG_WRITERS))}",
94
+ )
95
+ raise typer.Exit(1)
66
96
 
67
- out.print(json.dumps(masked_config, indent=2))
68
- elif file_format == "table":
69
- rows = [[k, str(v)] for k, v in masked_config.items()]
70
- out.table(["Key", "Value"], rows)
97
+ writer(out, masked_config)
71
98
 
72
99
  asyncio.run(_run())
73
100
 
@@ -121,7 +148,7 @@ def init(
121
148
  default_config,
122
149
  header=(
123
150
  "# Quadkit Framework Configuration\n"
124
- "# Documented at https://quadkit.dev/config\n\n"
151
+ f"# Documented at {DOCS_BASE_URL}/config\n\n"
125
152
  ),
126
153
  )
127
154
 
@@ -31,7 +31,7 @@ async def _bootstrap_migration_runner() -> tuple[Any, Any, Any]:
31
31
  from quadkit.di.container import Container
32
32
  from quadkit.di.orchestrator import ProviderOrchestrator
33
33
 
34
- sql_provider_mod = importlib.import_module(module_for('sql', 'di.provider'))
34
+ sql_provider_mod = importlib.import_module(module_for("sql", "di.provider"))
35
35
  DBDIProvider = sql_provider_mod.DatabaseProvider
36
36
 
37
37
  container = Container()
@@ -48,7 +48,7 @@ async def _bootstrap_migration_runner() -> tuple[Any, Any, Any]:
48
48
  except ImportError:
49
49
  # Database provider not installed — fall back to legacy direct factory.
50
50
  try:
51
- db_cli = importlib.import_module(module_for('sql', 'cli'))
51
+ db_cli = importlib.import_module(module_for("sql", "cli"))
52
52
  manager = db_cli.create_cli_migration_manager(db_url)
53
53
  return manager, None, None
54
54
  except ImportError as e:
@@ -78,9 +78,9 @@ async def _bootstrap_db_provider() -> tuple[Any, Any]:
78
78
  from quadkit.di.container import Container
79
79
  from quadkit.di.orchestrator import ProviderOrchestrator
80
80
 
81
- sql_provider_mod = importlib.import_module(module_for('sql', 'di.provider'))
81
+ sql_provider_mod = importlib.import_module(module_for("sql", "di.provider"))
82
82
  DatabaseProvider = sql_provider_mod.DatabaseProvider
83
- sql_config_mod = importlib.import_module(module_for('sql', 'config'))
83
+ sql_config_mod = importlib.import_module(module_for("sql", "config"))
84
84
  DatabaseConfig = sql_config_mod.DatabaseConfig
85
85
 
86
86
  container = Container()
@@ -115,7 +115,7 @@ async def get_migration_manager() -> Any:
115
115
  try:
116
116
  import os
117
117
 
118
- db_cli = importlib.import_module(module_for('sql', 'cli'))
118
+ db_cli = importlib.import_module(module_for("sql", "cli"))
119
119
  db_url = os.environ.get("DATABASE_URL", "sqlite:///./dev.db")
120
120
  return db_cli.create_cli_migration_manager(db_url)
121
121
  except ImportError as e:
@@ -15,6 +15,7 @@ import typer
15
15
  from quadkit.cli.output import OutputManager
16
16
  from quadkit.cli.package_names import module_for
17
17
  from quadkit.cli.runtime import handle_errors
18
+ from quadkit.contracts.constants import DOCS_BASE_URL
18
19
 
19
20
  app = typer.Typer(name="events")
20
21
 
@@ -30,9 +31,9 @@ def _make_evolution() -> Any:
30
31
  try:
31
32
  import importlib as _importlib
32
33
 
33
- _evo_mod = _importlib.import_module(module_for('events', 'schema.evolution'))
34
- _reg_mod = _importlib.import_module(module_for('events', 'schema.registry'))
35
- _store_mod = _importlib.import_module(module_for('events', 'schema.store'))
34
+ _evo_mod = _importlib.import_module(module_for("events", "schema.evolution"))
35
+ _reg_mod = _importlib.import_module(module_for("events", "schema.registry"))
36
+ _store_mod = _importlib.import_module(module_for("events", "schema.store"))
36
37
  SchemaEvolution = _evo_mod.SchemaEvolution
37
38
  SchemaRegistry = _reg_mod.SchemaRegistry
38
39
  InMemorySchemaStore = _store_mod.InMemorySchemaStore
@@ -90,8 +91,8 @@ def migrate(
90
91
  # hard cross-extension import at module level.
91
92
  import importlib as _importlib
92
93
 
93
- _reg_mod = _importlib.import_module(module_for('events', 'schema.registry'))
94
- _store_mod = _importlib.import_module(module_for('events', 'schema.store'))
94
+ _reg_mod = _importlib.import_module(module_for("events", "schema.registry"))
95
+ _store_mod = _importlib.import_module(module_for("events", "schema.store"))
95
96
  registry = _reg_mod.SchemaRegistry(store=_store_mod.InMemorySchemaStore())
96
97
  latest = await registry.get_latest_version(event_type)
97
98
  target = latest if latest is not None else from_version
@@ -200,4 +201,4 @@ def replay(
200
201
  " [cyan]await bus.replay(event_type='UserCreated', since=start_time)[/cyan]"
201
202
  )
202
203
  out.print()
203
- out.print("See: https://quadkit.dev/events/replay")
204
+ out.print(f"See: {DOCS_BASE_URL}/events/replay")
@@ -43,7 +43,9 @@ web:
43
43
  host: "${{WEB_HOST:127.0.0.1}}"
44
44
  port: "${{WEB_PORT:8000}}"
45
45
  api_docs:
46
- enabled: true
46
+ # Serve the docs outside production; true publishes them in production
47
+ # as well.
48
+ enabled: null
47
49
 
48
50
  sql:
49
51
  enabled: true
@@ -5,6 +5,7 @@ This module provides commands for inspecting the runtime state of a Quadkit appl
5
5
 
6
6
  from __future__ import annotations
7
7
 
8
+ from collections.abc import Callable, Mapping
8
9
  from typing import Annotated
9
10
 
10
11
  import typer
@@ -206,7 +207,7 @@ def main(
206
207
  """Inspect runtime state (alias for subcommands)."""
207
208
  out = OutputManager()
208
209
 
209
- commands = {
210
+ commands: Mapping[str, Callable[[], None]] = {
210
211
  "providers": inspect_providers,
211
212
  "routes": inspect_routes,
212
213
  "middleware": inspect_middleware,