stkit 17.3.0__tar.gz → 17.3.1__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 (241) hide show
  1. {stkit-17.3.0 → stkit-17.3.1}/CHANGELOG.md +7 -0
  2. {stkit-17.3.0 → stkit-17.3.1}/PKG-INFO +1 -1
  3. {stkit-17.3.0 → stkit-17.3.1}/pyproject.toml +1 -1
  4. {stkit-17.3.0 → stkit-17.3.1}/stk/__init__.py +1 -1
  5. {stkit-17.3.0 → stkit-17.3.1}/stk/app.py +10 -5
  6. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/copy_rules.py +2 -1
  7. {stkit-17.3.0 → stkit-17.3.1}/tests/test_copy_rules.py +6 -0
  8. {stkit-17.3.0 → stkit-17.3.1}/tests/test_static_versioning.py +15 -0
  9. {stkit-17.3.0 → stkit-17.3.1}/.gitignore +0 -0
  10. {stkit-17.3.0 → stkit-17.3.1}/LICENSE +0 -0
  11. {stkit-17.3.0 → stkit-17.3.1}/README.md +0 -0
  12. {stkit-17.3.0 → stkit-17.3.1}/SECURITY.md +0 -0
  13. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/.env-sample +0 -0
  14. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/.gitignore +0 -0
  15. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/README.md +0 -0
  16. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/__init__.py +0 -0
  17. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/app.py +0 -0
  18. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/migrations/364232ae77d5_add_note.py +0 -0
  19. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/note/__init__.py +0 -0
  20. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/note/models.py +0 -0
  21. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/note/templates/note/index.html +0 -0
  22. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/note/views.py +0 -0
  23. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/settings.py +0 -0
  24. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/minimal/templates/layout.html +0 -0
  25. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/pyproject.toml +0 -0
  26. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/tests/__init__.py +0 -0
  27. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/tests/test_app.py +0 -0
  28. {stkit-17.3.0 → stkit-17.3.1}/examples/minimal/uv.lock +0 -0
  29. {stkit-17.3.0 → stkit-17.3.1}/stk/__main__.py +0 -0
  30. {stkit-17.3.0 → stkit-17.3.1}/stk/agent_login.py +0 -0
  31. {stkit-17.3.0 → stkit-17.3.1}/stk/checks.py +0 -0
  32. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/__init__.py +0 -0
  33. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/agent.py +0 -0
  34. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/base.py +0 -0
  35. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/database.py +0 -0
  36. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/develop.py +0 -0
  37. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/doctor.py +0 -0
  38. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/main.py +0 -0
  39. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/reports.py +0 -0
  40. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/smoke.py +0 -0
  41. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/users.py +0 -0
  42. {stkit-17.3.0 → stkit-17.3.1}/stk/cli/watch.py +0 -0
  43. {stkit-17.3.0 → stkit-17.3.1}/stk/extensions.py +0 -0
  44. {stkit-17.3.0 → stkit-17.3.1}/stk/files/__init__.py +0 -0
  45. {stkit-17.3.0 → stkit-17.3.1}/stk/files/models.py +0 -0
  46. {stkit-17.3.0 → stkit-17.3.1}/stk/files/store.py +0 -0
  47. {stkit-17.3.0 → stkit-17.3.1}/stk/files/views.py +0 -0
  48. {stkit-17.3.0 → stkit-17.3.1}/stk/mcp/__init__.py +0 -0
  49. {stkit-17.3.0 → stkit-17.3.1}/stk/mcp/models.py +0 -0
  50. {stkit-17.3.0 → stkit-17.3.1}/stk/mcp/server.py +0 -0
  51. {stkit-17.3.0 → stkit-17.3.1}/stk/mcp/views.py +0 -0
  52. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/__init__.py +0 -0
  53. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/env.py +0 -0
  54. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/script.py.mako +0 -0
  55. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0001_initial_schema.py +0 -0
  56. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0002_jobs.py +0 -0
  57. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0003_files.py +0 -0
  58. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0004_notifications.py +0 -0
  59. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0005_mcp_tokens.py +0 -0
  60. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0006_stk_mcp_token.py +0 -0
  61. {stkit-17.3.0 → stkit-17.3.1}/stk/migrations/versions/stk_0007_confirm_existing_users.py +0 -0
  62. {stkit-17.3.0 → stkit-17.3.1}/stk/notification/__init__.py +0 -0
  63. {stkit-17.3.0 → stkit-17.3.1}/stk/notification/models.py +0 -0
  64. {stkit-17.3.0 → stkit-17.3.1}/stk/notification/views.py +0 -0
  65. {stkit-17.3.0 → stkit-17.3.1}/stk/portal/views.py +0 -0
  66. {stkit-17.3.0 → stkit-17.3.1}/stk/public/__init__.py +0 -0
  67. {stkit-17.3.0 → stkit-17.3.1}/stk/public/models.py +0 -0
  68. {stkit-17.3.0 → stkit-17.3.1}/stk/public/views.py +0 -0
  69. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/__init__.py +0 -0
  70. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/CLAUDE.md +0 -0
  71. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/Dockerfile +0 -0
  72. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/README.md +0 -0
  73. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/__app__/__init__.py +0 -0
  74. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/__app__/app.py +0 -0
  75. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/__app__/settings.py +0 -0
  76. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/claude/skills/stk-api/SKILL.md +0 -0
  77. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/claude/skills/stk-blueprint/SKILL.md +0 -0
  78. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/claude/skills/stk-deploy/SKILL.md +0 -0
  79. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/claude/skills/stk-lessons/SKILL.md +0 -0
  80. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/claude/skills/stk-migrate/SKILL.md +0 -0
  81. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/docker-compose.yml +0 -0
  82. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/dockerignore +0 -0
  83. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/env-sample +0 -0
  84. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/github/workflows/checks.yml +0 -0
  85. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/gitignore +0 -0
  86. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/nginx/nginx.conf +0 -0
  87. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/nginx/stk.conf +0 -0
  88. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/postgres/init-db.sh +0 -0
  89. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/pyproject.toml +0 -0
  90. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/tests/__init__.py +0 -0
  91. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/app/tests/test_app.py +0 -0
  92. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/generator.py +0 -0
  93. {stkit-17.3.0 → stkit-17.3.1}/stk/scaffold/templates.py +0 -0
  94. {stkit-17.3.0 → stkit-17.3.1}/stk/security.py +0 -0
  95. {stkit-17.3.0 → stkit-17.3.1}/stk/settings.py +0 -0
  96. {stkit-17.3.0 → stkit-17.3.1}/stk/shell.py +0 -0
  97. {stkit-17.3.0 → stkit-17.3.1}/stk/static/VERSIONS.txt +0 -0
  98. {stkit-17.3.0 → stkit-17.3.1}/stk/static/css/app.css +0 -0
  99. {stkit-17.3.0 → stkit-17.3.1}/stk/static/css/layout.css +0 -0
  100. {stkit-17.3.0 → stkit-17.3.1}/stk/static/css/vuetify.min.css +0 -0
  101. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.animals.woff2 +0 -0
  102. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.arrows-1.woff2 +0 -0
  103. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.arrows-2.woff2 +0 -0
  104. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.badges.woff2 +0 -0
  105. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.brand-1.woff2 +0 -0
  106. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.brand-2.woff2 +0 -0
  107. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.buildings.woff2 +0 -0
  108. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.charts.woff2 +0 -0
  109. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.communication.woff2 +0 -0
  110. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.computers.woff2 +0 -0
  111. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.core.woff2 +0 -0
  112. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.currencies.woff2 +0 -0
  113. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.database.woff2 +0 -0
  114. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.design-1.woff2 +0 -0
  115. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.design-2.woff2 +0 -0
  116. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.development.woff2 +0 -0
  117. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.devices-1.woff2 +0 -0
  118. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.devices-2.woff2 +0 -0
  119. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.document.woff2 +0 -0
  120. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.e-commerce.woff2 +0 -0
  121. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.electrical.woff2 +0 -0
  122. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.extensions.woff2 +0 -0
  123. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.food.woff2 +0 -0
  124. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.games.woff2 +0 -0
  125. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.gender.woff2 +0 -0
  126. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.gestures.woff2 +0 -0
  127. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.health.woff2 +0 -0
  128. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.laundry.woff2 +0 -0
  129. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.letters.woff2 +0 -0
  130. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.logic.woff2 +0 -0
  131. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.map.woff2 +0 -0
  132. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.math.woff2 +0 -0
  133. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.media.woff2 +0 -0
  134. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.mood.woff2 +0 -0
  135. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.nature.woff2 +0 -0
  136. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.numbers.woff2 +0 -0
  137. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.photography.woff2 +0 -0
  138. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.shapes.woff2 +0 -0
  139. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.sport.woff2 +0 -0
  140. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.symbols.woff2 +0 -0
  141. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.system-1.woff2 +0 -0
  142. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.system-2.woff2 +0 -0
  143. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.system-3.woff2 +0 -0
  144. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.text.woff2 +0 -0
  145. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.vehicles.woff2 +0 -0
  146. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.version-control.woff2 +0 -0
  147. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.weather.woff2 +0 -0
  148. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/fonts/tabler-icons.zodiac.woff2 +0 -0
  149. {stkit-17.3.0 → stkit-17.3.1}/stk/static/icons/tabler-icons.min.css +0 -0
  150. {stkit-17.3.0 → stkit-17.3.1}/stk/static/img/auth-bg.webp +0 -0
  151. {stkit-17.3.0 → stkit-17.3.1}/stk/static/img/favicon.ico +0 -0
  152. {stkit-17.3.0 → stkit-17.3.1}/stk/static/img/stk.svg +0 -0
  153. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/axios.min.js +0 -0
  154. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/NotificationDropdown.js +0 -0
  155. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/ThemeSwitcher.js +0 -0
  156. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/TransitionExpand.js +0 -0
  157. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/VerticalNavGroup.js +0 -0
  158. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/VerticalNavLink.js +0 -0
  159. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/VerticalNavSectionTitle.js +0 -0
  160. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/components/index.js +0 -0
  161. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/config.js +0 -0
  162. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/vue.min.js +0 -0
  163. {stkit-17.3.0 → stkit-17.3.1}/stk/static/js/vuetify.min.js +0 -0
  164. {stkit-17.3.0 → stkit-17.3.1}/stk/static/robots.txt +0 -0
  165. {stkit-17.3.0 → stkit-17.3.1}/stk/tasks/__init__.py +0 -0
  166. {stkit-17.3.0 → stkit-17.3.1}/stk/tasks/models.py +0 -0
  167. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/401.html +0 -0
  168. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/404.html +0 -0
  169. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/500.html +0 -0
  170. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/_brand.html +0 -0
  171. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/auth_layout.html +0 -0
  172. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/cms/activities.html +0 -0
  173. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/cms/jobs.html +0 -0
  174. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/cms/roles.html +0 -0
  175. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/cms/users.html +0 -0
  176. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/dashboard.html +0 -0
  177. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/index.html +0 -0
  178. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/layout.html +0 -0
  179. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/login-layout.html +0 -0
  180. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/mcp/tokens.html +0 -0
  181. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/_macros.html +0 -0
  182. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/_messages.html +0 -0
  183. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/change_password.html +0 -0
  184. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/confirm_email.html +0 -0
  185. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/change_notice.html +0 -0
  186. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/change_notice.txt +0 -0
  187. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/confirmation_instructions.html +0 -0
  188. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/confirmation_instructions.txt +0 -0
  189. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/login_instructions.html +0 -0
  190. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/login_instructions.txt +0 -0
  191. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/reset_instructions.html +0 -0
  192. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/reset_instructions.txt +0 -0
  193. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/reset_notice.html +0 -0
  194. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/reset_notice.txt +0 -0
  195. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/welcome.html +0 -0
  196. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/email/welcome.txt +0 -0
  197. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/forgot_password.html +0 -0
  198. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/login_user.html +0 -0
  199. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/mf_recovery.html +0 -0
  200. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/mf_recovery_codes.html +0 -0
  201. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/register_user.html +0 -0
  202. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/reset_password.html +0 -0
  203. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/send_confirmation.html +0 -0
  204. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/send_login.html +0 -0
  205. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/two_factor_select.html +0 -0
  206. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/two_factor_setup.html +0 -0
  207. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/two_factor_verify_code.html +0 -0
  208. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/wan_register.html +0 -0
  209. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/wan_signin.html +0 -0
  210. {stkit-17.3.0 → stkit-17.3.1}/stk/templates/security/wan_verify.html +0 -0
  211. {stkit-17.3.0 → stkit-17.3.1}/stk/user/__init__.py +0 -0
  212. {stkit-17.3.0 → stkit-17.3.1}/stk/user/forms.py +0 -0
  213. {stkit-17.3.0 → stkit-17.3.1}/stk/user/models.py +0 -0
  214. {stkit-17.3.0 → stkit-17.3.1}/stk/user/views.py +0 -0
  215. {stkit-17.3.0 → stkit-17.3.1}/stk/utils/email.py +0 -0
  216. {stkit-17.3.0 → stkit-17.3.1}/stk/utils/netguard.py +0 -0
  217. {stkit-17.3.0 → stkit-17.3.1}/stk/utils/ratelimit.py +0 -0
  218. {stkit-17.3.0 → stkit-17.3.1}/stk/websocket.py +0 -0
  219. {stkit-17.3.0 → stkit-17.3.1}/tests/test_agent_operability.py +0 -0
  220. {stkit-17.3.0 → stkit-17.3.1}/tests/test_app_index.py +0 -0
  221. {stkit-17.3.0 → stkit-17.3.1}/tests/test_branding.py +0 -0
  222. {stkit-17.3.0 → stkit-17.3.1}/tests/test_builder_ux.py +0 -0
  223. {stkit-17.3.0 → stkit-17.3.1}/tests/test_cli.py +0 -0
  224. {stkit-17.3.0 → stkit-17.3.1}/tests/test_composition.py +0 -0
  225. {stkit-17.3.0 → stkit-17.3.1}/tests/test_confirm_migration.py +0 -0
  226. {stkit-17.3.0 → stkit-17.3.1}/tests/test_csrf_exempt.py +0 -0
  227. {stkit-17.3.0 → stkit-17.3.1}/tests/test_error_handler.py +0 -0
  228. {stkit-17.3.0 → stkit-17.3.1}/tests/test_files.py +0 -0
  229. {stkit-17.3.0 → stkit-17.3.1}/tests/test_jobs.py +0 -0
  230. {stkit-17.3.0 → stkit-17.3.1}/tests/test_mcp.py +0 -0
  231. {stkit-17.3.0 → stkit-17.3.1}/tests/test_mcp_migration.py +0 -0
  232. {stkit-17.3.0 → stkit-17.3.1}/tests/test_migration_drift.py +0 -0
  233. {stkit-17.3.0 → stkit-17.3.1}/tests/test_netguard.py +0 -0
  234. {stkit-17.3.0 → stkit-17.3.1}/tests/test_notifications.py +0 -0
  235. {stkit-17.3.0 → stkit-17.3.1}/tests/test_production_security.py +0 -0
  236. {stkit-17.3.0 → stkit-17.3.1}/tests/test_revision_imports.py +0 -0
  237. {stkit-17.3.0 → stkit-17.3.1}/tests/test_route_collisions.py +0 -0
  238. {stkit-17.3.0 → stkit-17.3.1}/tests/test_scaffolder.py +0 -0
  239. {stkit-17.3.0 → stkit-17.3.1}/tests/test_security_compatibility.py +0 -0
  240. {stkit-17.3.0 → stkit-17.3.1}/tests/test_shell.py +0 -0
  241. {stkit-17.3.0 → stkit-17.3.1}/tests/test_smoke_pages.py +0 -0
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## v17.3.1 (2026-10-31)
4
+
5
+ No migration required.
6
+
7
+ - Versioned static responses were marked public and immutable for a year even when they were a 404 or carried a session cookie change, such as clearing a stale login. A shared cache could then replay them to other visitors. Only a 200 with no cookie change is cached publicly now; a response that changes the session is `private, no-store`.
8
+ - `stk smoke`'s raw-score rule could take tens of seconds on a page with a long run of blanks after the word "score", from two adjacent optional-blank patterns backtracking. It is linear now (Build Loop).
9
+
3
10
  ## v17.3.0 (2026-10-31)
4
11
 
5
12
  Run `uv run stk db upgrade`: `stk_0007` marks every existing account confirmed. Requires quart-security 2.1.0.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: stkit
3
- Version: 17.3.0
3
+ Version: 17.3.1
4
4
  Summary: An async Quart framework optimized for AI-assisted development workflows
5
5
  Project-URL: Documentation, https://docs.stkit.dev
6
6
  Project-URL: Source, https://github.com/level09/stk
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "stkit"
3
- version = "17.3.0"
3
+ version = "17.3.1"
4
4
  description = "An async Quart framework optimized for AI-assisted development workflows"
5
5
  authors = [
6
6
  {name = "Level09", email = "hello@level09.com"}
@@ -3,7 +3,7 @@ stk Framework
3
3
  A modern Python web framework optimized for AI-assisted development.
4
4
  """
5
5
 
6
- __version__ = "17.3.0"
6
+ __version__ = "17.3.1"
7
7
 
8
8
 
9
9
  def __getattr__(name):
@@ -18,6 +18,7 @@ from quart import (
18
18
  send_from_directory,
19
19
  url_for,
20
20
  )
21
+ from quart import session as quart_session
21
22
  from quart_security import Security, SQLAlchemyUserDatastore
22
23
  from quart_security.views import _ensure_csrf_token
23
24
  from sqlalchemy.ext.asyncio import async_sessionmaker, create_async_engine
@@ -253,11 +254,15 @@ def register_static_versioning(app):
253
254
  @app.after_request
254
255
  async def _cache_static(response):
255
256
  if request.path.startswith(f"{app.static_url_path}/"):
256
- response.headers["Cache-Control"] = (
257
- "public, max-age=31536000, immutable"
258
- if request.args.get("v")
259
- else "no-cache"
260
- )
257
+ if quart_session.modified:
258
+ # This response sets or clears a session cookie; a shared cache
259
+ # must never replay it to someone else.
260
+ policy = "private, no-store"
261
+ elif request.args.get("v") and response.status_code == 200:
262
+ policy = "public, max-age=31536000, immutable"
263
+ else:
264
+ policy = "no-cache"
265
+ response.headers["Cache-Control"] = policy
261
266
  return response
262
267
 
263
268
  def import_map():
@@ -41,7 +41,8 @@ HEX = re.compile(r"[0-9a-f]{6,}", re.I)
41
41
  HASH_LABEL = re.compile(r"(?:sha-?256|sha|md5|hash|digest|fingerprint)\W{0,3}$", re.I)
42
42
  SNAKE = re.compile(r"(?<![\w./@-])[a-z][a-z0-9]*(?:_[a-z0-9]+)+(?![\w@-]|\.\w)")
43
43
  SCORE = re.compile(
44
- r"\b(?:score|similarity|confidence|distance|cosine)\b\s*[:=]?\s*-?\d*\.\d+", re.I
44
+ r"\b(?:score|similarity|confidence|distance|cosine)\b\s*(?:[:=]\s*)?-?\d*\.\d+",
45
+ re.I,
45
46
  )
46
47
  ONE = re.compile(r"(?<![\d.,:/-])\b1[ \t]+([A-Za-z]+s)\b")
47
48
  # Words ending in s after a 1 that are not plurals: "1 is", "1 status".
@@ -1,3 +1,4 @@
1
+ import time
1
2
  import unittest
2
3
 
3
4
  from stk.cli.copy_rules import (
@@ -49,6 +50,11 @@ class CopyRuleTests(unittest.TestCase):
49
50
  ["jane_doe@example.com", "/static/app_icon.png", "STK_ENV", "Pending"],
50
51
  )
51
52
 
53
+ def test_raw_score_is_linear_on_long_blank_runs(self):
54
+ start = time.perf_counter()
55
+ self.assertEqual(raw_score("score" + " " * 50_000 + "!"), [])
56
+ self.assertLess(time.perf_counter() - start, 1)
57
+
52
58
  def test_raw_score(self):
53
59
  self.assertRule(
54
60
  raw_score,
@@ -22,6 +22,21 @@ class StaticVersioningTests(unittest.IsolatedAsyncioTestCase):
22
22
  bare = await client.get("/static/js/config.js")
23
23
  self.assertEqual(bare.headers["Cache-Control"], "no-cache")
24
24
 
25
+ async def test_errors_and_session_cookies_are_never_cached_publicly(self):
26
+ app = Stk(__name__, config=TestingConfig)
27
+ client = app.test_client()
28
+ missing = await client.get("/static/missing.css?v=1")
29
+ self.assertEqual(missing.status_code, 404)
30
+ self.assertNotIn("public", missing.headers["Cache-Control"])
31
+ # A stale login is cleared on any request, static ones included; that
32
+ # response carries a cookie change and must stay private.
33
+ async with client.session_transaction() as cookie:
34
+ cookie["_user_id"] = "gone"
35
+ async with app.test_request_context("/"):
36
+ url = url_for("static", filename="js/config.js")
37
+ cleared = await client.get(url)
38
+ self.assertEqual(cleared.headers["Cache-Control"], "private, no-store")
39
+
25
40
 
26
41
  if __name__ == "__main__":
27
42
  unittest.main()
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes