simple-module-cli 0.0.38__tar.gz → 0.0.39__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 (178) hide show
  1. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/PKG-INFO +3 -3
  2. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/pyproject.toml +3 -3
  3. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-conventions/SKILL.md +11 -0
  4. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-creating/SKILL.md +6 -0
  5. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/service.py.tpl +7 -1
  6. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/conftest.py +15 -0
  7. simple_module_cli-0.0.39/tests/test_cli_asset_prerequisites.py +19 -0
  8. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_openapi_gen_types.py +2 -2
  9. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_css_build.py +11 -8
  10. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/.gitignore +0 -0
  11. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/LICENSE +0 -0
  12. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/README.md +0 -0
  13. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/__init__.py +0 -0
  14. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_add_install.py +0 -0
  15. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_add_sources.py +0 -0
  16. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_app_project_manifests.py +0 -0
  17. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_env.py +0 -0
  18. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_local_env.py +0 -0
  19. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_module_build.py +0 -0
  20. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_module_host.py +0 -0
  21. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/_templating.py +0 -0
  22. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/add_cmd.py +0 -0
  23. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/app_project.py +0 -0
  24. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/case.py +0 -0
  25. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/catalog.py +0 -0
  26. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/cli.py +0 -0
  27. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/docker_assets.py +0 -0
  28. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/docker_cmd.py +0 -0
  29. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/framework_repo.py +0 -0
  30. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/git_source.py +0 -0
  31. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/module_cmd.py +0 -0
  32. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/new.py +0 -0
  33. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/openapi_cmd.py +0 -0
  34. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/openapi_types.py +0 -0
  35. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/package_update.py +0 -0
  36. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/pins.py +0 -0
  37. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/plugins.py +0 -0
  38. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/pypi.py +0 -0
  39. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/pyproject_edit.py +0 -0
  40. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/recipes.py +0 -0
  41. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/requirements.py +0 -0
  42. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/scaffolding.py +0 -0
  43. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/README.md +0 -0
  44. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-cli/SKILL.md +0 -0
  45. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-database/SKILL.md +0 -0
  46. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-doctor/SKILL.md +0 -0
  47. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-inertia-pages/SKILL.md +0 -0
  48. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-locales/SKILL.md +0 -0
  49. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-migrations/SKILL.md +0 -0
  50. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-registries/SKILL.md +0 -0
  51. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills/simple-module-testing/SKILL.md +0 -0
  52. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/skills_cmd.py +0 -0
  53. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/Makefile.snippet +0 -0
  54. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/compose-base-postgres.yml.tpl +0 -0
  55. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/compose-base-sqlite.yml.tpl +0 -0
  56. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/compose-tasks-postgres.yml.tpl +0 -0
  57. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/compose-tasks-sqlite.yml.tpl +0 -0
  58. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/compose-worker.yml.tpl +0 -0
  59. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/dockerignore +0 -0
  60. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/host-flat.Dockerfile +0 -0
  61. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/host.Dockerfile +0 -0
  62. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/docker/worker.Dockerfile.tpl +0 -0
  63. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/.env.example +0 -0
  64. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/.gitignore +0 -0
  65. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/Makefile +0 -0
  66. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/README.md.tpl +0 -0
  67. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/_optional/background_tasks/Makefile.snippet +0 -0
  68. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/_optional/background_tasks/run_worker.py +0 -0
  69. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/alembic.ini +0 -0
  70. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/app.tsx +0 -0
  71. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/main.tsx +0 -0
  72. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/module-assets.ts +0 -0
  73. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/package.json.tpl +0 -0
  74. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/pages/Error.tsx +0 -0
  75. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/pages/Landing.tsx +0 -0
  76. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/pages.ts +0 -0
  77. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/styles.css +0 -0
  78. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/tsconfig.json +0 -0
  79. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/vite.config.ts +0 -0
  80. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/client_app/vite.dev-url.ts +0 -0
  81. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/main.py +0 -0
  82. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/migrations/env.py +0 -0
  83. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/migrations/script.py.mako +0 -0
  84. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/migrations/versions/.gitkeep +0 -0
  85. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/pyproject.toml.tpl +0 -0
  86. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/routes.py +0 -0
  87. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/host/templates/index.html +0 -0
  88. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/.github/workflows/ci.yml +0 -0
  89. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/.github/workflows/publish.yml.tpl +0 -0
  90. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/.gitignore +0 -0
  91. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/README.md.tpl +0 -0
  92. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/__init__.py +0 -0
  93. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/constants.py.tpl +0 -0
  94. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/contracts/__init__.py.tpl +0 -0
  95. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/contracts/schemas.py.tpl +0 -0
  96. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/deps.py.tpl +0 -0
  97. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/endpoints/__init__.py +0 -0
  98. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/endpoints/api.py.tpl +0 -0
  99. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/endpoints/views.py.tpl +0 -0
  100. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/locales/en.json.tpl +0 -0
  101. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/models.py.tpl +0 -0
  102. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/module.py.tpl +0 -0
  103. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/pages/Browse.tsx.tpl +0 -0
  104. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/pages/Create.tsx.tpl +0 -0
  105. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/pages/Edit.tsx.tpl +0 -0
  106. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/pages/api.generated.ts.tpl +0 -0
  107. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/pages/api.ts.tpl +0 -0
  108. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/py.typed +0 -0
  109. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/services.py.tpl +0 -0
  110. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/__PACKAGE__/settings.py.tpl +0 -0
  111. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/LICENSE +0 -0
  112. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/README.md.tpl +0 -0
  113. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/__PACKAGE__/pages/Browse.tsx.tpl +0 -0
  114. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/__PACKAGE__/pages/Create.tsx.tpl +0 -0
  115. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/__PACKAGE__/pages/Edit.tsx.tpl +0 -0
  116. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/framework_repo/pyproject.toml.tpl +0 -0
  117. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/standalone/package.json.tpl +0 -0
  118. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/_optional/standalone/tsconfig.json.tpl +0 -0
  119. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/package.json.tpl +0 -0
  120. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/pyproject.toml.tpl +0 -0
  121. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/tests/test___PACKAGE__.py.tpl +0 -0
  122. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/module/tsconfig.json.tpl +0 -0
  123. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/.env.example +0 -0
  124. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/.gitignore +0 -0
  125. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/Makefile +0 -0
  126. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/README.md.tpl +0 -0
  127. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/package.json.tpl +0 -0
  128. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/templates/workspace/pyproject.toml.tpl +0 -0
  129. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/update_cmd.py +0 -0
  130. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/uv_workspace.py +0 -0
  131. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/simple_module_cli/wizard.py +0 -0
  132. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_build_packaging.py +0 -0
  133. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_case.py +0 -0
  134. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_add_cmd.py +0 -0
  135. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_add_spec_parse.py +0 -0
  136. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_add_workspace_member.py +0 -0
  137. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_catalog.py +0 -0
  138. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_catalog_depends_on.py +0 -0
  139. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_docker_assets.py +0 -0
  140. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_docker_workers.py +0 -0
  141. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_gen_types_scaffold.py +0 -0
  142. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_git_scan.py +0 -0
  143. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new.py +0 -0
  144. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new_dest_tolerance.py +0 -0
  145. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new_git_module.py +0 -0
  146. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new_migration_bootstrap.py +0 -0
  147. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new_regressions.py +0 -0
  148. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_new_scaffold_layout.py +0 -0
  149. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_openapi_export.py +0 -0
  150. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_package_update.py +0 -0
  151. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_package_update_pins.py +0 -0
  152. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_pyproject_edit.py +0 -0
  153. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_recipes.py +0 -0
  154. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_update_sources.py +0 -0
  155. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_vite_port_env.py +0 -0
  156. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_wizard.py +0 -0
  157. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_cli_wizard_git.py +0 -0
  158. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_create_module_ci_skip.py +0 -0
  159. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_env_helper.py +0 -0
  160. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_framework_repo_wiring.py +0 -0
  161. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_cmd_build.py +0 -0
  162. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_cmd_e2e.py +0 -0
  163. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_cmd_verify.py +0 -0
  164. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_css_assets.py +0 -0
  165. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_css_subdir_sources.py +0 -0
  166. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_npm_aliases.py +0 -0
  167. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_module_pages_manifest.py +0 -0
  168. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_no_framework_deps.py +0 -0
  169. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_plugin_discovery.py +0 -0
  170. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffold_app_tsx_spa_links.py +0 -0
  171. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffold_rollback.py +0 -0
  172. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffolded_host_setup_wizard.py +0 -0
  173. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffolding_framework_repo.py +0 -0
  174. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffolding_host.py +0 -0
  175. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffolding_module.py +0 -0
  176. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_scaffolding_module_js.py +0 -0
  177. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_skills_cmd.py +0 -0
  178. {simple_module_cli-0.0.38 → simple_module_cli-0.0.39}/tests/test_template_requires_framework.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: simple_module_cli
3
- Version: 0.0.38
3
+ Version: 0.0.39
4
4
  Summary: Standalone scaffolder for the SimpleModule framework — `smpy new`, `smpy create-module`, plugin host.
5
5
  Project-URL: Homepage, https://github.com/antosubash/simple_module_python
6
6
  Project-URL: Repository, https://github.com/antosubash/simple_module_python
@@ -19,8 +19,8 @@ Classifier: Topic :: Software Development :: Code Generators
19
19
  Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
20
20
  Classifier: Typing :: Typed
21
21
  Requires-Python: >=3.12
22
- Requires-Dist: tomlkit>=0.13
23
- Requires-Dist: typer>=0.12
22
+ Requires-Dist: tomlkit<0.16,>=0.13
23
+ Requires-Dist: typer<0.28,>=0.12
24
24
  Description-Content-Type: text/markdown
25
25
 
26
26
  # simple_module_cli
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "simple_module_cli"
3
- version = "0.0.38"
3
+ version = "0.0.39"
4
4
  description = "Standalone scaffolder for the SimpleModule framework — `smpy new`, `smpy create-module`, plugin host."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -20,8 +20,8 @@ classifiers = [
20
20
  "Typing :: Typed",
21
21
  ]
22
22
  dependencies = [
23
- "typer>=0.12",
24
- "tomlkit>=0.13",
23
+ "typer>=0.12,<0.28",
24
+ "tomlkit>=0.13,<0.16",
25
25
  ]
26
26
 
27
27
  [project.scripts]
@@ -121,6 +121,17 @@ Build a `MailMessage(to, subject, text)` and send it with `current_mail_sender()
121
121
 
122
122
  Which module holds the accounts depends on the auth provider (`users` or `keycloak`). To name, look up, search or count users, use `get_user_directory(app)` from `simple_module_core.user_directory`: `get_many(db, ids, with_roles=...)`, `search(db, term, limit=...)`, `match_ids(term)` (a subquery) and `stats(db, active_window=...)`. Name a user with `DirectoryUser.label`. `roles is None` means the provider does not know them (Keycloak) — refuse anything that needs roles rather than treating the user as role-less. Importing `users.models` from another module silently queries an empty table under Keycloak.
123
123
 
124
+ ### 13. Raise domain exceptions from services
125
+
126
+ Define a per-module base error in `<module>/exceptions.py` or `errors.py` and
127
+ subclass it for business failures. Services must not raise `HTTPException`:
128
+ CLI commands, tasks and durable handlers need transport-independent failures.
129
+ Follow `file_storage`: map errors in endpoints or install HTTP handlers through
130
+ `register_exception_handlers(app)`. Preserve status codes, exact JSON bodies,
131
+ headers and translation keys when migrating; translate at the request boundary.
132
+ Endpoint-level `HTTPException` for pure request validation is fine. Inertia
133
+ forms may catch domain errors to report field errors or redirect.
134
+
124
135
  ## Related skills
125
136
 
126
137
  - **simple-module-database** — per-module Base, mixins, session lifecycle
@@ -129,4 +129,10 @@ The new module should appear in the registered-modules log line. If it has a vie
129
129
  - **`name=` collides.** Two modules with the same `ModuleMeta.name` raise `SM008` at dev boot / `make doctor` (their lowercased names would also collide as table prefixes in the shared schema).
130
130
  - **Registered the module by hand in host code.** Don't — discovery is entry-point-only; host code never imports module code.
131
131
 
132
+ Services raise domain exceptions derived from a per-module base in
133
+ `exceptions.py` or `errors.py`, never `HTTPException`. Map them in endpoints or
134
+ `register_exception_handlers(app)` (as in `file_storage`); translate at the
135
+ request boundary. Preserve existing status codes, JSON bodies and headers.
136
+ Endpoint-level `HTTPException` for pure request validation remains fine.
137
+
132
138
  For framework-wide rules that apply once the module exists (SQLModel-everywhere, file-size cap, settings layout, no `session.commit()` in services), see the **simple-module-conventions** skill. For migration mechanics see **simple-module-migrations**.
@@ -1,4 +1,10 @@
1
- """{{SINGULAR_CLASS}} service implementation."""
1
+ """{{SINGULAR_CLASS}} service implementation.
2
+
3
+ Business failures raise domain exceptions derived from a per-module base in
4
+ exceptions.py or errors.py, never HTTPException. Map them in endpoints or via
5
+ ModuleBase.register_exception_handlers; keep HTTP status, payload, headers and
6
+ translation at that boundary so this service also works in CLI/tasks.
7
+ """
2
8
 
3
9
  from __future__ import annotations
4
10
 
@@ -7,6 +7,7 @@ how the factory below gets shared.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
+ import os
10
11
  import subprocess
11
12
  import sys
12
13
  from pathlib import Path
@@ -154,3 +155,17 @@ def make_git_module_repo(tmp_path: Path):
154
155
  return repo
155
156
 
156
157
  return factory
158
+
159
+
160
+ @pytest.fixture
161
+ def require_cli_asset():
162
+ """Keep optional local tooling from silently reducing CI coverage."""
163
+
164
+ def require(available: bool, message: str) -> None:
165
+ if available:
166
+ return
167
+ if os.environ.get("CI"):
168
+ pytest.fail(f"{message}. On CI this must fail rather than skip.")
169
+ pytest.skip(message)
170
+
171
+ return require
@@ -0,0 +1,19 @@
1
+ """Missing frontend prerequisites may skip locally but must fail on CI."""
2
+
3
+ import pytest
4
+
5
+
6
+ @pytest.mark.parametrize("ci", [None, "true"])
7
+ def test_cli_missing_asset_prerequisite_fails_on_ci(monkeypatch, require_cli_asset, ci):
8
+ if ci:
9
+ monkeypatch.setenv("CI", ci)
10
+ else:
11
+ monkeypatch.delenv("CI", raising=False)
12
+ outcome = pytest.fail.Exception if ci else pytest.skip.Exception
13
+ with pytest.raises(outcome, match="missing tool"):
14
+ require_cli_asset(False, "missing tool")
15
+
16
+
17
+ def test_cli_available_asset_prerequisite_runs_on_ci(monkeypatch, require_cli_asset):
18
+ monkeypatch.setenv("CI", "true")
19
+ require_cli_asset(True, "missing tool")
@@ -185,8 +185,8 @@ def test_pinned_version_matches_the_ui_dev_dependency() -> None:
185
185
  assert ui["devDependencies"]["openapi-typescript"] == ot.OPENAPI_TYPESCRIPT_VERSION
186
186
 
187
187
 
188
- @pytest.mark.skipif(not LOCAL_TOOL.is_file(), reason="needs `npm install` (openapi-typescript)")
189
- def test_real_tool_emits_paths(importable: Path) -> None:
188
+ def test_real_tool_emits_paths(importable: Path, require_cli_asset) -> None:
189
+ require_cli_asset(LOCAL_TOOL.is_file(), "needs `npm ci` (openapi-typescript)")
190
190
  targets = ot.module_targets(
191
191
  [_fake_module(importable, "gt_real", "Widgets", opted_in=True)], importable, []
192
192
  )
@@ -6,9 +6,8 @@ resolves the path and keeps the rule. This is the one assertion that exercises
6
6
  that whole chain, so it drives a genuine build rather than inspecting the
7
7
  generated text.
8
8
 
9
- Skipped where a build is impossible: CI's `python-tests` job installs Python
10
- deps only (`make install-py`), so `node_modules` is absent there. The JS jobs
11
- and local runs do have it.
9
+ Missing build prerequisites skip locally and fail on CI, where the Python
10
+ and JS build jobs install the required Node dependencies.
12
11
  """
13
12
 
14
13
  from __future__ import annotations
@@ -22,17 +21,21 @@ import pytest
22
21
  REPO_ROOT = Path(__file__).resolve().parents[3]
23
22
 
24
23
  pytestmark = [
25
- pytest.mark.skipif(
26
- not (REPO_ROOT / "node_modules").is_dir(),
27
- reason="node_modules absent — run `npm install` to exercise the real build",
28
- ),
29
- pytest.mark.skipif(shutil.which("npm") is None, reason="npm not on PATH"),
30
24
  # Both tests rewrite the shared tree (generated manifests, host/static/dist, a
31
25
  # probe page under audit_log), so under xdist they must share one worker.
32
26
  pytest.mark.xdist_group("repo-build"),
33
27
  ]
34
28
 
35
29
 
30
+ @pytest.fixture(autouse=True)
31
+ def require_build_tools(require_cli_asset):
32
+ require_cli_asset(shutil.which("npm") is not None, "npm not on PATH")
33
+ require_cli_asset(
34
+ (REPO_ROOT / "node_modules").is_dir(),
35
+ "node_modules absent — run `npm ci` to exercise the real build",
36
+ )
37
+
38
+
36
39
  class TestModuleCssReachesBundle:
37
40
  def test_module_class_is_emitted_by_vite_build(self):
38
41
  """A class defined only in a module's styles.css appears in the built CSS.