quadkit-cli 0.0.44__tar.gz → 0.0.46__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 (203) hide show
  1. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/PKG-INFO +14 -14
  2. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/README.md +9 -9
  3. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/pyproject.toml +5 -5
  4. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/config.py +1 -1
  5. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/events.py +1 -1
  6. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/new.py +4 -6
  7. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/__init__.py +2 -11
  8. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/_lazy_exports.py +2 -11
  9. quadkit_cli-0.0.46/src/quadkit/cli/registry/presets.py +104 -0
  10. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/template.py +9 -86
  11. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/__init__.py +12 -4
  12. quadkit_cli-0.0.46/src/quadkit/cli/scaffold/metadata.py +204 -0
  13. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/module_files.py +65 -24
  14. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/render.py +85 -3
  15. quadkit_cli-0.0.46/src/quadkit/cli/scaffold/specs.py +90 -0
  16. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/support_files.py +18 -4
  17. quadkit_cli-0.0.46/tests/unit/registry/test_presets.py +87 -0
  18. quadkit_cli-0.0.46/tests/unit/registry/test_template.py +134 -0
  19. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_new.py +5 -6
  20. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_project_layout.py +6 -8
  21. quadkit_cli-0.0.46/tests/unit/test_project_metadata.py +178 -0
  22. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_scaffold_and_validators.py +37 -28
  23. quadkit_cli-0.0.44/src/quadkit/cli/registry/presets.py +0 -219
  24. quadkit_cli-0.0.44/src/quadkit/cli/scaffold/specs.py +0 -203
  25. quadkit_cli-0.0.44/tests/unit/registry/test_presets.py +0 -120
  26. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/.gitignore +0 -0
  27. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/LICENSE +0 -0
  28. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/NOTICE +0 -0
  29. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/example.yaml +0 -0
  30. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/__init__.py +0 -0
  31. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/assembly/__init__.py +0 -0
  32. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/assembly/assembler.py +0 -0
  33. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/__init__.py +0 -0
  34. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/add.py +0 -0
  35. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/config_utils.py +0 -0
  36. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/contrib.py +0 -0
  37. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db.py +0 -0
  38. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_bootstrap.py +0 -0
  39. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_data.py +0 -0
  40. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_migrations.py +0 -0
  41. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/db_commands_ops.py +0 -0
  42. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/dev.py +0 -0
  43. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/gen.py +0 -0
  44. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/init.py +0 -0
  45. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/inspect.py +0 -0
  46. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/meta.py +0 -0
  47. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/project.py +0 -0
  48. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/py.typed +0 -0
  49. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/run.py +0 -0
  50. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/shell.py +0 -0
  51. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/commands/system.py +0 -0
  52. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/config.py +0 -0
  53. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/constants.py +0 -0
  54. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/__init__.py +0 -0
  55. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/base.py +0 -0
  56. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/core.py +0 -0
  57. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/discovery.py +0 -0
  58. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/registry.py +0 -0
  59. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/contributors/runtime.py +0 -0
  60. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/decorators.py +0 -0
  61. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/__init__.py +0 -0
  62. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/provider.py +0 -0
  63. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/sub_providers/__init__.py +0 -0
  64. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/di/sub_providers/contributor.py +0 -0
  65. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/events.py +0 -0
  66. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/exceptions.py +0 -0
  67. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/__init__.py +0 -0
  68. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/base.py +0 -0
  69. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/field_parser.py +0 -0
  70. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/provider.py +0 -0
  71. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/generators/test.py +0 -0
  72. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/hooks.py +0 -0
  73. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/layout.py +0 -0
  74. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/__init__.py +0 -0
  75. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/config_loader.py +0 -0
  76. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/entry_point.py +0 -0
  77. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/naming.py +0 -0
  78. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/lib/templates.py +0 -0
  79. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/module.py +0 -0
  80. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/output/__init__.py +0 -0
  81. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/output/manager.py +0 -0
  82. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/package_names.py +0 -0
  83. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/protocols.py +0 -0
  84. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/py.typed +0 -0
  85. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/backend_base.py +0 -0
  86. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/command.py +0 -0
  87. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/completion.py +0 -0
  88. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/config.py +0 -0
  89. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/database.py +0 -0
  90. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/database_backends.py +0 -0
  91. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/environment.py +0 -0
  92. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/formatter.py +0 -0
  93. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/generator.py +0 -0
  94. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health.py +0 -0
  95. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/__init__.py +0 -0
  96. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/base.py +0 -0
  97. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/deps.py +0 -0
  98. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/project.py +0 -0
  99. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/providers.py +0 -0
  100. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/python_env.py +0 -0
  101. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/tools.py +0 -0
  102. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/health_checks/vcs_docker.py +0 -0
  103. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/hook.py +0 -0
  104. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/inspect.py +0 -0
  105. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/migration.py +0 -0
  106. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider.py +0 -0
  107. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider_catalog.py +0 -0
  108. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/provider_registry.py +0 -0
  109. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/secrets.py +0 -0
  110. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/serializer.py +0 -0
  111. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/server.py +0 -0
  112. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/task.py +0 -0
  113. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/telemetry.py +0 -0
  114. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/version.py +0 -0
  115. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/registry/watcher.py +0 -0
  116. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/__init__.py +0 -0
  117. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/context.py +0 -0
  118. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/error_handler.py +0 -0
  119. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/runtime/main.py +0 -0
  120. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold/app_files.py +0 -0
  121. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/scaffold_package.py +0 -0
  122. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/provider.py.jinja2 +0 -0
  123. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/py.typed +0 -0
  124. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/templates/test_unit.py.jinja2 +0 -0
  125. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/cli/types.py +0 -0
  126. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/src/quadkit/py.typed +0 -0
  127. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/conftest.py +0 -0
  128. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/integration/__init__.py +0 -0
  129. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/integration/test_cli_lifecycle.py +0 -0
  130. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/test_package_structure_p1.py +0 -0
  131. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/__init__.py +0 -0
  132. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/_test_cli_contribution_system_support.py +0 -0
  133. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/__init__.py +0 -0
  134. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_config.py +0 -0
  135. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_config_happy_paths.py +0 -0
  136. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_contrib.py +0 -0
  137. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_events_cmd.py +0 -0
  138. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_inspect.py +0 -0
  139. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_meta.py +0 -0
  140. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_run.py +0 -0
  141. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_shell.py +0 -0
  142. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/commands/test_system.py +0 -0
  143. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/di/test_config_alignment.py +0 -0
  144. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/lib/test_templates.py +0 -0
  145. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/__init__.py +0 -0
  146. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_completion.py +0 -0
  147. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_database.py +0 -0
  148. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_environment.py +0 -0
  149. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_formatter.py +0 -0
  150. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_health.py +0 -0
  151. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_hook.py +0 -0
  152. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_inspect_registry.py +0 -0
  153. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_migration.py +0 -0
  154. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_secrets.py +0 -0
  155. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_serializer.py +0 -0
  156. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_task.py +0 -0
  157. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_telemetry.py +0 -0
  158. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_version.py +0 -0
  159. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/registry/test_watcher.py +0 -0
  160. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_base_contributor.py +0 -0
  161. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_constants.py +0 -0
  162. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_context.py +0 -0
  163. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_contribution_system.py +0 -0
  164. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_contribution_system__testclicontributorsubprovider.py +0 -0
  165. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_errors.py +0 -0
  166. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_exceptions.py +0 -0
  167. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_import_isolation.py +0 -0
  168. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_module.py +0 -0
  169. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_cli_types.py +0 -0
  170. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_async.py +0 -0
  171. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_loader.py +0 -0
  172. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_save.py +0 -0
  173. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_config_validate.py +0 -0
  174. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_contributor_registry.py +0 -0
  175. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_contributor_runtime.py +0 -0
  176. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_core_contributor.py +0 -0
  177. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_db.py +0 -0
  178. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_decorators.py +0 -0
  179. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_dev_command.py +0 -0
  180. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_error_handler.py +0 -0
  181. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_events.py +0 -0
  182. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_exception_handling.py +0 -0
  183. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_field_parser.py +0 -0
  184. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen.py +0 -0
  185. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen_controller.py +0 -0
  186. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_gen_provider.py +0 -0
  187. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_base.py +0 -0
  188. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_option_help.py +0 -0
  189. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generator_registry.py +0 -0
  190. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_generators_contract.py +0 -0
  191. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_health_checks.py +0 -0
  192. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_hooks.py +0 -0
  193. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_init_command.py +0 -0
  194. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_layout.py +0 -0
  195. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_main.py +0 -0
  196. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_output.py +0 -0
  197. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_output_json.py +0 -0
  198. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_project.py +0 -0
  199. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_provider_registry.py +0 -0
  200. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_round40_hardening.py +0 -0
  201. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_run_detection.py +0 -0
  202. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_server_registry.py +0 -0
  203. {quadkit_cli-0.0.44 → quadkit_cli-0.0.46}/tests/unit/test_storage_driver_generator.py +0 -0
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit-cli
3
- Version: 0.0.44
3
+ Version: 0.0.46
4
4
  Summary: Command-line interface for Quadkit Framework - Project scaffolding, code generation, and development tools
5
- Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
5
+ Project-URL: Homepage, https://oridecon.dev
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
7
- Project-URL: Documentation, https://dbtinoy-.github.io/quadkit/
7
+ Project-URL: Documentation, https://oridecon.dev/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
- Author-email: Quadkit Framework Team <team@quadkit.dev>
11
- Maintainer-email: Quadkit Framework Team <team@quadkit.dev>
10
+ Author-email: Quadkit Framework Team <hello@oridecon.dev>
11
+ Maintainer-email: Quadkit Framework Team <hello@oridecon.dev>
12
12
  License: Apache-2.0
13
13
  License-File: LICENSE
14
14
  License-File: NOTICE
@@ -94,7 +94,7 @@ Requires **Python >= 3.11**.
94
94
  There is no code to write — the product is the command line:
95
95
 
96
96
  ```bash
97
- # Create a new project (template defaults to web-api); the package
97
+ # Create a new project (single `api` template); the package
98
98
  # inside is my_api/ with app.py exposing create_app()
99
99
  quadkit new project my-api
100
100
  cd my-api
@@ -135,7 +135,7 @@ Global options: `--json` for machine-readable output, `--quiet`,
135
135
  | `quadkit version` | framework and package versions |
136
136
 
137
137
  Per-distribution guide:
138
- [quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
138
+ [quadkit-cli reference](https://oridecon.dev/quadkit/reference/cli/).
139
139
 
140
140
  ## Optional extras
141
141
 
@@ -167,16 +167,16 @@ review release notes on upgrade. Report vulnerabilities privately per
167
167
 
168
168
  ## Stability
169
169
 
170
- Version `0.0.44` in the `0.x` series, released in lockstep with the
171
- other four distributions; APIs may change between minor versions until
172
- 1.0 — pin an exact version (`quadkit-cli==0.0.44`) or a tight range
173
- (`>=0.0.44,<0.1.0`). Full policy:
174
- [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
170
+ Version `0.0.46` in the `0.x` series, released in lockstep with the
171
+ other twelve distributions; APIs may change between minor versions until
172
+ 1.0 — pin an exact version (`quadkit-cli==0.0.46`) or a tight range
173
+ (`>=0.0.46,<0.1.0`). Full policy:
174
+ [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
175
175
 
176
176
  ## Links
177
177
 
178
- - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
179
- - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
178
+ - **Documentation** — <https://oridecon.dev/quadkit/>
179
+ - **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
180
180
  - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
181
181
  - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
182
182
  - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
@@ -38,7 +38,7 @@ Requires **Python >= 3.11**.
38
38
  There is no code to write — the product is the command line:
39
39
 
40
40
  ```bash
41
- # Create a new project (template defaults to web-api); the package
41
+ # Create a new project (single `api` template); the package
42
42
  # inside is my_api/ with app.py exposing create_app()
43
43
  quadkit new project my-api
44
44
  cd my-api
@@ -79,7 +79,7 @@ Global options: `--json` for machine-readable output, `--quiet`,
79
79
  | `quadkit version` | framework and package versions |
80
80
 
81
81
  Per-distribution guide:
82
- [quadkit-cli reference](https://dbtinoy-.github.io/quadkit/reference/quadkit-cli/).
82
+ [quadkit-cli reference](https://oridecon.dev/quadkit/reference/cli/).
83
83
 
84
84
  ## Optional extras
85
85
 
@@ -111,16 +111,16 @@ review release notes on upgrade. Report vulnerabilities privately per
111
111
 
112
112
  ## Stability
113
113
 
114
- Version `0.0.44` in the `0.x` series, released in lockstep with the
115
- other four distributions; APIs may change between minor versions until
116
- 1.0 — pin an exact version (`quadkit-cli==0.0.44`) or a tight range
117
- (`>=0.0.44,<0.1.0`). Full policy:
118
- [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
114
+ Version `0.0.46` in the `0.x` series, released in lockstep with the
115
+ other twelve distributions; APIs may change between minor versions until
116
+ 1.0 — pin an exact version (`quadkit-cli==0.0.46`) or a tight range
117
+ (`>=0.0.46,<0.1.0`). Full policy:
118
+ [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
119
119
 
120
120
  ## Links
121
121
 
122
- - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
123
- - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
122
+ - **Documentation** — <https://oridecon.dev/quadkit/>
123
+ - **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
124
124
  - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
125
125
  - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
126
126
  - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "quadkit-cli"
9
- version = "0.0.44"
9
+ version = "0.0.46"
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"
@@ -47,10 +47,10 @@ dependencies = [
47
47
  "tomli>=2.0.0,<3",
48
48
  ]
49
49
  authors = [
50
- { name = "Quadkit Framework Team", email = "team@quadkit.dev" },
50
+ { name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
51
51
  ]
52
52
  maintainers = [
53
- { name = "Quadkit Framework Team", email = "team@quadkit.dev" },
53
+ { name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
54
54
  ]
55
55
 
56
56
  [project.license]
@@ -82,9 +82,9 @@ all = [
82
82
  ]
83
83
 
84
84
  [project.urls]
85
- Homepage = "https://dbtinoy-.github.io/quadkit/"
85
+ Homepage = "https://oridecon.dev"
86
86
  Repository = "https://github.com/dbtinoy-/quadkit"
87
- Documentation = "https://dbtinoy-.github.io/quadkit/"
87
+ Documentation = "https://oridecon.dev/quadkit/"
88
88
  Issues = "https://github.com/dbtinoy-/quadkit/issues"
89
89
  Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
90
90
 
@@ -151,7 +151,7 @@ def init(
151
151
  default_config,
152
152
  header=(
153
153
  "# Quadkit Framework Configuration\n"
154
- f"# Documented at {DOCS_BASE_URL}/config\n\n"
154
+ f"# Documented at {DOCS_BASE_URL}/getting-started/configuration/\n\n"
155
155
  ),
156
156
  )
157
157
 
@@ -201,4 +201,4 @@ def replay(
201
201
  " [cyan]await bus.replay(event_type='UserCreated', since=start_time)[/cyan]"
202
202
  )
203
203
  out.print()
204
- out.print(f"See: {DOCS_BASE_URL}/events/replay")
204
+ out.print(f"See: {DOCS_BASE_URL}/packages/events/quadkit-events/docs/guide/")
@@ -35,10 +35,7 @@ def main(
35
35
  "api",
36
36
  "--template",
37
37
  "-t",
38
- help=(
39
- "Project template "
40
- f"(available in this install: {', '.join(template_names())})"
41
- ),
38
+ help=f"Project template (the only template: {', '.join(template_names())})",
42
39
  ),
43
40
  directory: str = typer.Option(".", "--directory", "-d", help="Target directory"),
44
41
  interactive: bool = typer.Option(
@@ -53,13 +50,14 @@ def main(
53
50
  project_name = _valid_name(name, "Project")
54
51
  selected_template = template
55
52
 
56
- if interactive:
53
+ names = template_names()
54
+ if interactive and len(names) > 1:
57
55
  import click
58
56
 
59
57
  selected_template = typer.prompt(
60
58
  "Select a template",
61
59
  default="api",
62
- type=click.Choice(template_names()),
60
+ type=click.Choice(names),
63
61
  )
64
62
 
65
63
  try:
@@ -128,15 +128,10 @@ if TYPE_CHECKING:
128
128
  TasksInspector,
129
129
  )
130
130
  from quadkit.cli.registry.presets import (
131
- FullStackPreset,
132
- GraphQLPreset,
133
- MicroservicePreset,
134
- MinimalPreset,
131
+ ApiPreset,
135
132
  Preset,
136
133
  PresetDefinition,
137
134
  PresetRegistry,
138
- WebAPIPreset,
139
- WorkerPreset,
140
135
  )
141
136
  from quadkit.cli.registry.provider import (
142
137
  AdminProvider,
@@ -200,15 +195,11 @@ if TYPE_CHECKING:
200
195
  get_telemetry_status,
201
196
  )
202
197
  from quadkit.cli.registry.template import (
203
- FullStackTemplate,
204
- GraphQLTemplate,
205
- MinimalTemplate,
198
+ ApiTemplate,
206
199
  ProjectBuilder,
207
200
  ProjectTemplate,
208
201
  TemplateConfig,
209
202
  TemplateRegistry,
210
- WebAPITemplate,
211
- WorkerTemplate,
212
203
  )
213
204
  from quadkit.cli.registry.version import (
214
205
  VersionInfo,
@@ -11,6 +11,8 @@ from __future__ import annotations
11
11
  LAZY_IMPORTS: dict[str, str] = {
12
12
  "AIProvider": "quadkit.cli.registry.provider",
13
13
  "AdminProvider": "quadkit.cli.registry.provider",
14
+ "ApiPreset": "quadkit.cli.registry.presets",
15
+ "ApiTemplate": "quadkit.cli.registry.template",
14
16
  "AuthConfigValidator": "quadkit.cli.registry.config",
15
17
  "AuthProvider": "quadkit.cli.registry.provider",
16
18
  "BashCompletionGenerator": "quadkit.cli.registry.completion",
@@ -46,16 +48,12 @@ LAZY_IMPORTS: dict[str, str] = {
46
48
  "FishCompletionGenerator": "quadkit.cli.registry.completion",
47
49
  "FormatOptions": "quadkit.cli.registry.formatter",
48
50
  "FormatterRegistry": "quadkit.cli.registry.formatter",
49
- "FullStackPreset": "quadkit.cli.registry.presets",
50
- "FullStackTemplate": "quadkit.cli.registry.template",
51
51
  "GeneratorAdapter": "quadkit.cli.registry.generator",
52
52
  "GeneratorRegistry": "quadkit.cli.registry.generator",
53
53
  "GeneratorResult": "quadkit.cli.registry.generator",
54
54
  "GitCheck": "quadkit.cli.registry.health",
55
55
  "GranianBackend": "quadkit.cli.registry.server",
56
- "GraphQLPreset": "quadkit.cli.registry.presets",
57
56
  "GraphQLProvider": "quadkit.cli.registry.provider",
58
- "GraphQLTemplate": "quadkit.cli.registry.template",
59
57
  "GunicornBackend": "quadkit.cli.registry.server",
60
58
  "HealthCheck": "quadkit.cli.registry.health",
61
59
  "HealthCheckRegistry": "quadkit.cli.registry.health",
@@ -73,10 +71,7 @@ LAZY_IMPORTS: dict[str, str] = {
73
71
  "JSONFormatter": "quadkit.cli.registry.formatter",
74
72
  "LoggingHook": "quadkit.cli.registry.hook",
75
73
  "MessagingProvider": "quadkit.cli.registry.provider",
76
- "MicroservicePreset": "quadkit.cli.registry.presets",
77
74
  "MiddlewareInspector": "quadkit.cli.registry.inspect",
78
- "MinimalPreset": "quadkit.cli.registry.presets",
79
- "MinimalTemplate": "quadkit.cli.registry.template",
80
75
  "MonitorProvider": "quadkit.cli.registry.provider",
81
76
  "MonitoringProvider": "quadkit.cli.registry.provider",
82
77
  "MySQLBackend": "quadkit.cli.registry.database",
@@ -141,11 +136,7 @@ LAZY_IMPORTS: dict[str, str] = {
141
136
  "VersionInfo": "quadkit.cli.registry.version",
142
137
  "VersionRegistry": "quadkit.cli.registry.version",
143
138
  "VersionSource": "quadkit.cli.registry.version",
144
- "WebAPIPreset": "quadkit.cli.registry.presets",
145
- "WebAPITemplate": "quadkit.cli.registry.template",
146
139
  "WebProvider": "quadkit.cli.registry.provider",
147
- "WorkerPreset": "quadkit.cli.registry.presets",
148
- "WorkerTemplate": "quadkit.cli.registry.template",
149
140
  "YAMLFormatter": "quadkit.cli.registry.formatter",
150
141
  "ZshCompletionGenerator": "quadkit.cli.registry.completion",
151
142
  "create_database_connection": "quadkit.cli.registry.database",
@@ -0,0 +1,104 @@
1
+ """Presets registry for application presets.
2
+
3
+ This module provides a registry pattern for application presets.
4
+ """
5
+
6
+ from __future__ import annotations
7
+
8
+ import abc
9
+ from dataclasses import dataclass, field
10
+ from typing import Any, ClassVar
11
+
12
+ from quadkit.cli.package_names import packages_for
13
+
14
+
15
+ @dataclass
16
+ class Preset:
17
+ """A preset configuration of providers."""
18
+
19
+ name: str
20
+ description: str
21
+ packages: list[str] = field(default_factory=list)
22
+ config: dict[str, Any] = field(default_factory=dict)
23
+
24
+
25
+ class PresetDefinition(abc.ABC):
26
+ """Abstract base class for preset definitions."""
27
+
28
+ name: ClassVar[str]
29
+ description: ClassVar[str]
30
+ packages: ClassVar[list[str]] = []
31
+ config: ClassVar[dict[str, Any]] = {}
32
+
33
+ @abc.abstractmethod
34
+ def get_preset(self) -> Preset:
35
+ """Get the preset configuration."""
36
+
37
+
38
+ class ApiPreset(PresetDefinition):
39
+ """The single application preset: REST API with the web framework."""
40
+
41
+ name = "api"
42
+ description = "REST API with the web framework"
43
+ packages = packages_for("web")
44
+ config = {
45
+ "web": {"host": "0.0.0.0", "port": 8000}, # noqa: S104 — preset template default
46
+ }
47
+
48
+ def get_preset(self) -> Preset:
49
+ return Preset(
50
+ name=self.name,
51
+ description=self.description,
52
+ packages=self.packages.copy(),
53
+ config=self.config.copy(),
54
+ )
55
+
56
+
57
+ class PresetRegistry:
58
+ """Registry for application presets.
59
+
60
+ Instances are always empty — use :meth:`with_defaults` for the
61
+ in-package built-ins or :meth:`register` for plugin presets.
62
+ """
63
+
64
+ def __init__(self) -> None:
65
+ self._presets: dict[str, Preset] = {}
66
+
67
+ def register(self, preset_class: type[PresetDefinition]) -> None:
68
+ """Register a preset class."""
69
+ instance = preset_class()
70
+ preset = instance.get_preset()
71
+ self._presets[preset.name] = preset
72
+
73
+ def get(self, name: str) -> Preset | None:
74
+ """Get a preset by name."""
75
+ return self._presets.get(name)
76
+
77
+ def get_all(self) -> dict[str, Preset]:
78
+ """Get all registered presets."""
79
+ return self._presets.copy()
80
+
81
+ def get_choices(self) -> list[str]:
82
+ """Get list of available preset names."""
83
+ return list(self._presets.keys())
84
+
85
+ @classmethod
86
+ def _default_entries(cls) -> tuple[type[PresetDefinition], ...]:
87
+ """Return the built-in presets (a single one today)."""
88
+ return (ApiPreset,)
89
+
90
+ @classmethod
91
+ def with_defaults(cls) -> PresetRegistry:
92
+ """Return an instance populated with the built-in presets."""
93
+ registry = cls()
94
+ for entry in cls._default_entries():
95
+ registry.register(entry)
96
+ return registry
97
+
98
+
99
+ __all__ = [
100
+ "ApiPreset",
101
+ "Preset",
102
+ "PresetDefinition",
103
+ "PresetRegistry",
104
+ ]
@@ -9,7 +9,7 @@ import abc
9
9
  from dataclasses import dataclass, field
10
10
  from typing import TYPE_CHECKING, Any, ClassVar
11
11
 
12
- from quadkit.cli.package_names import packages_for, provider_available
12
+ from quadkit.cli.package_names import packages_for
13
13
 
14
14
  if TYPE_CHECKING:
15
15
  from pathlib import Path
@@ -43,76 +43,12 @@ class ProjectTemplate(abc.ABC):
43
43
  return self.packages.copy()
44
44
 
45
45
 
46
- class MinimalTemplate(ProjectTemplate):
47
- """Minimal template with just the core framework."""
46
+ class ApiTemplate(ProjectTemplate):
47
+ """The single project template: REST API with the web framework."""
48
48
 
49
- name = "minimal"
50
- description = "Bare minimum Quadkit application"
51
- packages = [
52
- "quadkit",
53
- ]
54
-
55
- def get_config(self) -> TemplateConfig:
56
- return TemplateConfig(
57
- name=self.name,
58
- description=self.description,
59
- packages=self.packages,
60
- )
61
-
62
-
63
- class WebAPITemplate(ProjectTemplate):
64
- """REST API template."""
65
-
66
- name = "web-api"
67
- description = "REST API with web framework"
68
- packages = packages_for("web", "sql")
69
-
70
- def get_config(self) -> TemplateConfig:
71
- return TemplateConfig(
72
- name=self.name,
73
- description=self.description,
74
- packages=self.packages,
75
- )
76
-
77
-
78
- class GraphQLTemplate(ProjectTemplate):
79
- """GraphQL API template."""
80
-
81
- name = "graphql"
82
- description = "GraphQL API with web framework"
83
- packages = packages_for("web", "sql", "graphql")
84
-
85
- def get_config(self) -> TemplateConfig:
86
- return TemplateConfig(
87
- name=self.name,
88
- description=self.description,
89
- packages=self.packages,
90
- )
91
-
92
-
93
- class WorkerTemplate(ProjectTemplate):
94
- """Background worker template."""
95
-
96
- name = "worker"
97
- description = "Background job processor"
98
- packages = packages_for("sql", "tasks", "queue")
99
-
100
- def get_config(self) -> TemplateConfig:
101
- return TemplateConfig(
102
- name=self.name,
103
- description=self.description,
104
- packages=self.packages,
105
- )
106
-
107
-
108
- class FullStackTemplate(ProjectTemplate):
109
- """Full-stack application template."""
110
-
111
- name = "fullstack"
112
- description = "Full application: auth, cache, storage, events, tasks, HTTP, monitoring"
113
- packages = packages_for(
114
- "web", "sql", "auth", "cache", "storage", "events", "tasks", "http", "monitor"
115
- )
49
+ name = "api"
50
+ description = "REST API with the web framework"
51
+ packages = packages_for("web")
116
52
 
117
53
  def get_config(self) -> TemplateConfig:
118
54
  return TemplateConfig(
@@ -151,17 +87,8 @@ class TemplateRegistry:
151
87
 
152
88
  @classmethod
153
89
  def _default_entries(cls) -> tuple[type[ProjectTemplate], ...]:
154
- """Return templates supported by installed optional providers."""
155
- entries: list[type[ProjectTemplate]] = [MinimalTemplate, WebAPITemplate]
156
- optional = (
157
- (GraphQLTemplate, ("sql", "graphql")),
158
- (WorkerTemplate, ("sql", "tasks", "queue")),
159
- (FullStackTemplate, ("web", "sql", "auth", "cache", "storage", "events", "tasks", "http", "monitor")),
160
- )
161
- for entry, features in optional:
162
- if all(provider_available(feature) for feature in features):
163
- entries.append(entry)
164
- return tuple(entries)
90
+ """Return the built-in templates (a single one today)."""
91
+ return (ApiTemplate,)
165
92
 
166
93
  @classmethod
167
94
  def with_defaults(cls) -> TemplateRegistry:
@@ -214,13 +141,9 @@ class ProjectBuilder:
214
141
 
215
142
 
216
143
  __all__ = [
217
- "FullStackTemplate",
218
- "GraphQLTemplate",
219
- "MinimalTemplate",
144
+ "ApiTemplate",
220
145
  "ProjectBuilder",
221
146
  "ProjectTemplate",
222
147
  "TemplateConfig",
223
148
  "TemplateRegistry",
224
- "WebAPITemplate",
225
- "WorkerTemplate",
226
149
  ]
@@ -4,9 +4,12 @@ Single source of truth for project bootstrapping — the catalogue lives in
4
4
  :mod:`quadkit.cli.scaffold.specs`, the rendered files in
5
5
  :mod:`quadkit.cli.scaffold.app_files`, :mod:`quadkit.cli.scaffold.module_files`
6
6
  and :mod:`quadkit.cli.scaffold.support_files`, and the writers in
7
- :mod:`quadkit.cli.scaffold.render`:
7
+ :mod:`quadkit.cli.scaffold.render`. Project metadata is rendered by
8
+ :func:`render_project_metadata` from an explicit :class:`ProjectMetadataContext`;
9
+ downstream builders can use this side-effect-free API without depending on
10
+ private template functions:
8
11
 
9
- - ``quadkit new project --template <name>`` (``commands/new.py``)
12
+ - ``quadkit new project`` (``commands/new.py``)
10
13
  - ``ProjectBuilder.create_project`` (``registry/template.py``)
11
14
  - scaffold alignment tests (``tests/unit/test_scaffold_alignment.py``)
12
15
 
@@ -15,7 +18,7 @@ Every generated file targets the **real** quadkit APIs (``Application``,
15
18
  generator map** in :mod:`quadkit.cli.layout`, so a scaffolded project and
16
19
  its generators stay aligned:
17
20
 
18
- quadkit new project myapp --template web-api
21
+ quadkit new project myapp
19
22
  cd myapp && pip install -e .
20
23
  quadkit gen controller users # src/myapp/controllers/users_controller.py
21
24
  quadkit dev # WebModule auto-discovers it
@@ -36,10 +39,13 @@ and directly in pytest fixtures.
36
39
 
37
40
  from __future__ import annotations
38
41
 
42
+ from quadkit.cli.scaffold.metadata import (
43
+ ProjectMetadataContext,
44
+ render_project_metadata,
45
+ )
39
46
  from quadkit.cli.scaffold.render import render_module, render_project
40
47
  from quadkit.cli.scaffold.specs import (
41
48
  _TEMPLATE_SPECS,
42
- TEMPLATE_ALIASES,
43
49
  TEMPLATES,
44
50
  ProjectTemplateSpec,
45
51
  component_packages,
@@ -50,9 +56,11 @@ from quadkit.cli.scaffold.specs import (
50
56
 
51
57
  __all__ = [
52
58
  "TEMPLATES",
59
+ "ProjectMetadataContext",
53
60
  "component_packages",
54
61
  "render_module",
55
62
  "render_project",
63
+ "render_project_metadata",
56
64
  "resolve_template",
57
65
  "root_output_dirs",
58
66
  "template_names",