tina4-python 3.13.33__tar.gz → 3.13.35__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 (157) hide show
  1. {tina4_python-3.13.33 → tina4_python-3.13.35}/PKG-INFO +7 -5
  2. {tina4_python-3.13.33 → tina4_python-3.13.35}/README.md +6 -4
  3. {tina4_python-3.13.33 → tina4_python-3.13.35}/pyproject.toml +1 -1
  4. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/__init__.py +1 -1
  5. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/__init__.py +46 -0
  6. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/tools.py +1 -1
  7. {tina4_python-3.13.33 → tina4_python-3.13.35}/.gitignore +0 -0
  8. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/CLAUDE.md +0 -0
  9. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/HtmlElement.py +0 -0
  10. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/Testing.py +0 -0
  11. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/ai/__init__.py +0 -0
  12. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/api/__init__.py +0 -0
  13. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/auth/__init__.py +0 -0
  14. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/cache/__init__.py +0 -0
  15. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/cli/__init__.py +0 -0
  16. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/container/__init__.py +0 -0
  17. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/__init__.py +0 -0
  18. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/cache.py +0 -0
  19. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/constants.py +0 -0
  20. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/events.py +0 -0
  21. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/middleware.py +0 -0
  22. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/rate_limiter.py +0 -0
  23. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/request.py +0 -0
  24. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/response.py +0 -0
  25. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/router.py +0 -0
  26. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/core/server.py +0 -0
  27. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/crud/__init__.py +0 -0
  28. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/__init__.py +0 -0
  29. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/adapter.py +0 -0
  30. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/connection.py +0 -0
  31. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/firebird.py +0 -0
  32. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mongodb.py +0 -0
  33. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mssql.py +0 -0
  34. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/mysql.py +0 -0
  35. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/odbc.py +0 -0
  36. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/postgres.py +0 -0
  37. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/database/sqlite.py +0 -0
  38. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/debug/__init__.py +0 -0
  39. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/debug/error_overlay.py +0 -0
  40. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/metrics.py +0 -0
  41. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/plan.py +0 -0
  42. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dev_admin/project_index.py +0 -0
  43. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/docs.py +0 -0
  44. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/dotenv/__init__.py +0 -0
  45. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/env.py +0 -0
  46. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/FROND.md +0 -0
  47. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/__init__.py +0 -0
  48. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/frond/engine.py +0 -0
  49. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/auth/meta.json +0 -0
  50. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
  51. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/database/meta.json +0 -0
  52. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
  53. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/error-overlay/meta.json +0 -0
  54. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
  55. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/meta.json +0 -0
  56. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
  57. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
  58. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/queue/meta.json +0 -0
  59. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
  60. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/rest-api/meta.json +0 -0
  61. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
  62. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/meta.json +0 -0
  63. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
  64. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
  65. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/graphql/__init__.py +0 -0
  66. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/i18n/__init__.py +0 -0
  67. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/__init__.py +0 -0
  68. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/mcp/protocol.py +0 -0
  69. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/messenger/__init__.py +0 -0
  70. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/migration/__init__.py +0 -0
  71. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/migration/runner.py +0 -0
  72. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/__init__.py +0 -0
  73. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/fields.py +0 -0
  74. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/orm/model.py +0 -0
  75. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/__feedback/widget.js +0 -0
  76. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/css/tina4.css +0 -0
  77. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/css/tina4.min.css +0 -0
  78. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/favicon.ico +0 -0
  79. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/images/logo.svg +0 -0
  80. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
  81. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/frond.js +0 -0
  82. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/frond.min.js +0 -0
  83. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4-dev-admin.js +0 -0
  84. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
  85. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4.min.js +0 -0
  86. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/js/tina4js.min.js +0 -0
  87. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/swagger/index.html +0 -0
  88. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
  89. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/query_builder/__init__.py +0 -0
  90. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/__init__.py +0 -0
  91. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/job.py +0 -0
  92. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/kafka_backend.py +0 -0
  93. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/lite_backend.py +0 -0
  94. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/mongo_backend.py +0 -0
  95. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue/rabbitmq_backend.py +0 -0
  96. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/__init__.py +0 -0
  97. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/kafka_backend.py +0 -0
  98. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/mongo_backend.py +0 -0
  99. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/queue_backends/rabbitmq_backend.py +0 -0
  100. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/__init__.py +0 -0
  101. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_alerts.scss +0 -0
  102. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_badges.scss +0 -0
  103. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_buttons.scss +0 -0
  104. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_cards.scss +0 -0
  105. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_forms.scss +0 -0
  106. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_grid.scss +0 -0
  107. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_modals.scss +0 -0
  108. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_nav.scss +0 -0
  109. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_reset.scss +0 -0
  110. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_tables.scss +0 -0
  111. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_typography.scss +0 -0
  112. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_utilities.scss +0 -0
  113. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/_variables.scss +0 -0
  114. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/base.scss +0 -0
  115. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/colors.scss +0 -0
  116. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/scss/tina4css/tina4.scss +0 -0
  117. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/seeder/__init__.py +0 -0
  118. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/service/__init__.py +0 -0
  119. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session/__init__.py +0 -0
  120. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/__init__.py +0 -0
  121. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/mongodb_handler.py +0 -0
  122. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/redis_handler.py +0 -0
  123. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/session_handlers/valkey_handler.py +0 -0
  124. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/swagger/__init__.py +0 -0
  125. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/components/crud.twig +0 -0
  126. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
  127. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
  128. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/python/Dockerfile +0 -0
  129. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/docker/uv/Dockerfile +0 -0
  130. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/302.twig +0 -0
  131. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/401.twig +0 -0
  132. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/403.twig +0 -0
  133. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/404.twig +0 -0
  134. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/500.twig +0 -0
  135. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/502.twig +0 -0
  136. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/503.twig +0 -0
  137. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/errors/base.twig +0 -0
  138. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/frontend/README.md +0 -0
  139. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/templates/readme.md +0 -0
  140. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/test/__init__.py +0 -0
  141. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/test_client/__init__.py +0 -0
  142. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
  143. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
  144. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
  145. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
  146. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
  147. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
  148. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
  149. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
  150. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
  151. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
  152. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
  153. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
  154. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/validator/__init__.py +0 -0
  155. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/websocket/__init__.py +0 -0
  156. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/websocket/backplane.py +0 -0
  157. {tina4_python-3.13.33 → tina4_python-3.13.35}/tina4_python/wsdl/__init__.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: tina4-python
3
- Version: 3.13.33
3
+ Version: 3.13.35
4
4
  Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
5
5
  Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
6
6
  License: MIT
@@ -74,6 +74,8 @@ cd my-app && tina4 serve
74
74
 
75
75
  Open http://localhost:7146 — your app is running.
76
76
 
77
+ > **Two CLIs:** `tina4` is the cross-language Rust CLI — it scaffolds projects, runs the dev server, and watches files. `tina4python` is the Python package's own CLI for project tasks (`migrate`, `seed`, `generate`, `test`). This guide uses `tina4` to scaffold and run, and `tina4python` for those tasks.
78
+
77
79
  <details>
78
80
  <summary><strong>Without the Tina4 CLI (Docker / CI only)</strong></summary>
79
81
 
@@ -162,7 +164,7 @@ pip install tina4-python[dev-reload] # Hot-patching via jurigged
162
164
  ### 1. Create a project
163
165
 
164
166
  ```bash
165
- tina4python init my-app
167
+ tina4 init python my-app
166
168
  cd my-app
167
169
  ```
168
170
 
@@ -694,13 +696,13 @@ Frond.clear_cache()
694
696
  ## Environment
695
697
 
696
698
  ```bash
697
- SECRET=your-jwt-secret
699
+ TINA4_SECRET=your-jwt-secret
698
700
  TINA4_DATABASE_URL=sqlite:///data/app.db
699
701
  TINA4_DEBUG=true # Enable dev toolbar, error overlay
700
702
  TINA4_LOG_LEVEL=ALL # ALL, DEBUG, INFO, WARNING, ERROR
701
703
  TINA4_LOCALE=en # en, fr, af, zh, ja, es
702
- TINA4_SESSION_BACKEND=SessionFileHandler
703
- SWAGGER_TITLE=My API
704
+ TINA4_SESSION_BACKEND=file # file (default), redis, valkey, mongodb, database
705
+ TINA4_SWAGGER_TITLE=My API
704
706
  ```
705
707
 
706
708
  ## AI Tool Integration
@@ -42,6 +42,8 @@ cd my-app && tina4 serve
42
42
 
43
43
  Open http://localhost:7146 — your app is running.
44
44
 
45
+ > **Two CLIs:** `tina4` is the cross-language Rust CLI — it scaffolds projects, runs the dev server, and watches files. `tina4python` is the Python package's own CLI for project tasks (`migrate`, `seed`, `generate`, `test`). This guide uses `tina4` to scaffold and run, and `tina4python` for those tasks.
46
+
45
47
  <details>
46
48
  <summary><strong>Without the Tina4 CLI (Docker / CI only)</strong></summary>
47
49
 
@@ -130,7 +132,7 @@ pip install tina4-python[dev-reload] # Hot-patching via jurigged
130
132
  ### 1. Create a project
131
133
 
132
134
  ```bash
133
- tina4python init my-app
135
+ tina4 init python my-app
134
136
  cd my-app
135
137
  ```
136
138
 
@@ -662,13 +664,13 @@ Frond.clear_cache()
662
664
  ## Environment
663
665
 
664
666
  ```bash
665
- SECRET=your-jwt-secret
667
+ TINA4_SECRET=your-jwt-secret
666
668
  TINA4_DATABASE_URL=sqlite:///data/app.db
667
669
  TINA4_DEBUG=true # Enable dev toolbar, error overlay
668
670
  TINA4_LOG_LEVEL=ALL # ALL, DEBUG, INFO, WARNING, ERROR
669
671
  TINA4_LOCALE=en # en, fr, af, zh, ja, es
670
- TINA4_SESSION_BACKEND=SessionFileHandler
671
- SWAGGER_TITLE=My API
672
+ TINA4_SESSION_BACKEND=file # file (default), redis, valkey, mongodb, database
673
+ TINA4_SWAGGER_TITLE=My API
672
674
  ```
673
675
 
674
676
  ## AI Tool Integration
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tina4-python"
3
- version = "3.13.33"
3
+ version = "3.13.35"
4
4
  description = "Tina4 Python v3 — Zero-dependency, lightweight web framework"
5
5
  authors = [
6
6
  {name = "Andre van Zuydam", email = "andrevanzuydam@gmail.com"}
@@ -8,7 +8,7 @@ Tina4 Python v3.0 — Zero-dependency, lightweight web framework.
8
8
 
9
9
  One import, everything works.
10
10
  """
11
- __version__ = "3.13.33"
11
+ __version__ = "3.13.35"
12
12
 
13
13
  # ── Route decorators ──
14
14
  from tina4_python.core.router import ( # noqa: E402, F401
@@ -485,6 +485,12 @@ def get_api_handlers() -> dict:
485
485
  # @mcp_tool decorator appear in both immediately.
486
486
  "/__dev/api/mcp/tools": ("GET", _api_mcp_tools),
487
487
  "/__dev/api/mcp/call": ("POST", _api_mcp_call),
488
+ # JSON-RPC + SSE surface for real MCP clients (Claude Desktop/Code).
489
+ # Same registry as the REST shim above; this is what makes /__dev/mcp
490
+ # actually reachable as an MCP server (previously defined but unmounted).
491
+ "/__dev/mcp": ("POST", _api_mcp_rpc),
492
+ "/__dev/mcp/message": ("POST", _api_mcp_rpc),
493
+ "/__dev/mcp/sse": ("GET", _api_mcp_sse),
488
494
  # ── Scaffold REST shim ──
489
495
  # Wraps the tina4python CLI's `generate <kind> <name>` so the
490
496
  # + Route / + Model / + Migration / + Middleware buttons work
@@ -2861,6 +2867,46 @@ async def _api_mcp_call(request, response):
2861
2867
  return response({"ok": False, "name": name, "error": str(exc)}, 500)
2862
2868
 
2863
2869
 
2870
+ # ─── MCP JSON-RPC + SSE endpoint ───────────────────────────────────
2871
+ #
2872
+ # The protocol surface real MCP clients (Claude Desktop/Code) speak —
2873
+ # JSON-RPC 2.0 over the HTTP+SSE transport. Mounted on the running dev
2874
+ # server so each `tina4 serve`d project exposes its OWN endpoint, giving
2875
+ # an AI agent live access scoped to that project. Shares the same
2876
+ # `_default_server` tool registry as the REST shim above, so every
2877
+ # @mcp_tool shows up on both surfaces.
2878
+
2879
+ async def _api_mcp_rpc(request, response):
2880
+ """POST — the JSON-RPC endpoint. Mounted at /__dev/mcp and
2881
+ /__dev/mcp/message. Forwards to the default MCP server's
2882
+ handle_message() and returns the JSON-RPC response; notifications
2883
+ (no id) yield an empty 204.
2884
+ """
2885
+ import json as _json
2886
+ from tina4_python.mcp import _get_default_server, is_enabled
2887
+ if not is_enabled():
2888
+ return response({"error": "MCP disabled"}, 404)
2889
+ server = _get_default_server()
2890
+ body = request.body
2891
+ raw = body if isinstance(body, (dict, str)) else str(body)
2892
+ result = server.handle_message(raw)
2893
+ if not result:
2894
+ return response("", 204)
2895
+ return response(_json.loads(result))
2896
+
2897
+
2898
+ async def _api_mcp_sse(request, response):
2899
+ """GET — SSE handshake. Emits the `endpoint` event telling the client
2900
+ where to POST JSON-RPC messages, per the MCP HTTP+SSE transport.
2901
+ """
2902
+ from tina4_python.mcp import is_enabled
2903
+ if not is_enabled():
2904
+ return response({"error": "MCP disabled"}, 404)
2905
+ base = request.path.rsplit("/sse", 1)[0]
2906
+ sse = f"event: endpoint\ndata: {base}/message\n\n"
2907
+ return response(sse, 200, "text/event-stream")
2908
+
2909
+
2864
2910
  # ─── Scaffold REST shim ────────────────────────────────────────────
2865
2911
  #
2866
2912
  # Wraps the tina4python `generate <kind> <name>` CLI commands so the
@@ -259,7 +259,7 @@ def register_dev_tools(server):
259
259
  """List all registered routes with methods and paths."""
260
260
  from tina4_python.core.router import Router
261
261
  routes = []
262
- for route in Router._routes:
262
+ for route in Router.get_routes():
263
263
  routes.append({
264
264
  "method": route.get("method", ""),
265
265
  "path": route.get("path", ""),