kinemotion 0.47.4__tar.gz → 0.49.0__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.

Potentially problematic release.


This version of kinemotion might be problematic. Click here for more details.

Files changed (532) hide show
  1. kinemotion-0.49.0/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +243 -0
  2. kinemotion-0.49.0/.basic-memory/development/feature-request-system-configuration.md +97 -0
  3. kinemotion-0.49.0/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +240 -0
  4. kinemotion-0.49.0/.basic-memory/development/supabase-database-integration-setup.md +104 -0
  5. {kinemotion-0.47.4 → kinemotion-0.49.0}/.cursor/mcp.json +13 -0
  6. {kinemotion-0.47.4 → kinemotion-0.49.0}/CHANGELOG.md +45 -0
  7. {kinemotion-0.47.4 → kinemotion-0.49.0}/PKG-INFO +1 -1
  8. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/README.md +20 -0
  9. kinemotion-0.49.0/backend/src/kinemotion_backend/analysis_api.py +303 -0
  10. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/app.py +109 -12
  11. kinemotion-0.49.0/backend/src/kinemotion_backend/database.py +298 -0
  12. kinemotion-0.49.0/backend/src/kinemotion_backend/models.py +108 -0
  13. kinemotion-0.49.0/backend/src/kinemotion_backend/types.py +5 -0
  14. kinemotion-0.49.0/backend/supabase-schema.sql +148 -0
  15. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_r2_integration.py +164 -2
  16. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/README.md +2 -0
  17. kinemotion-0.49.0/docs/development/feature-request-system.md +191 -0
  18. kinemotion-0.49.0/docs/development/feedback-system-setup.md +192 -0
  19. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/deployment-checklist.md +52 -1
  20. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/package.json +1 -0
  21. kinemotion-0.49.0/frontend/src/components/FeatureRequestButton.tsx +103 -0
  22. kinemotion-0.49.0/frontend/src/components/FeedbackForm.css +308 -0
  23. kinemotion-0.49.0/frontend/src/components/FeedbackForm.tsx +212 -0
  24. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsDisplay.test.tsx +11 -1
  25. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsDisplay.tsx +231 -6
  26. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/UploadForm.test.tsx +17 -2
  27. kinemotion-0.49.0/frontend/src/config/links.ts +46 -0
  28. kinemotion-0.49.0/frontend/src/hooks/useDatabaseStatus.ts +62 -0
  29. kinemotion-0.49.0/frontend/src/test/setup.ts +21 -0
  30. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/types/api.ts +1 -0
  31. kinemotion-0.49.0/frontend/src/vite-env.d.ts +35 -0
  32. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/yarn.lock +363 -3
  33. {kinemotion-0.47.4 → kinemotion-0.49.0}/pyproject.toml +1 -1
  34. {kinemotion-0.47.4 → kinemotion-0.49.0}/sonar-project.properties +1 -1
  35. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/api.py +6 -0
  36. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/api.py +24 -22
  37. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/cli.py +10 -5
  38. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/api.py +242 -110
  39. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/cli.py +40 -8
  40. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_api.py +122 -3
  41. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_api.py +11 -3
  42. {kinemotion-0.47.4 → kinemotion-0.49.0}/uv.lock +1 -1
  43. kinemotion-0.47.4/frontend/src/test/setup.ts +0 -1
  44. kinemotion-0.47.4/frontend/src/vite-env.d.ts +0 -9
  45. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/README.md +0 -0
  46. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
  47. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
  48. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
  49. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
  50. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
  51. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
  52. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
  53. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
  54. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
  55. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
  56. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
  57. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
  58. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
  59. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
  60. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
  61. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
  62. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
  63. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
  64. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
  65. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
  66. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
  67. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
  68. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
  69. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
  70. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
  71. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
  72. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
  73. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
  74. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
  75. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
  76. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
  77. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
  78. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
  79. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
  80. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
  81. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
  82. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
  83. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
  84. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
  85. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
  86. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
  87. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
  88. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
  89. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
  90. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
  91. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
  92. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
  93. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
  94. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
  95. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
  96. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
  97. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
  98. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
  99. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
  100. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
  101. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
  102. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
  103. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
  104. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
  105. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-quick-reference.md +0 -0
  106. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
  107. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
  108. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
  109. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
  110. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
  111. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
  112. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
  113. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
  114. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
  115. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
  116. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
  117. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
  118. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
  119. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
  120. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
  121. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
  122. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
  123. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
  124. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
  125. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
  126. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
  127. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
  128. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
  129. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
  130. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
  131. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
  132. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
  133. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
  134. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
  135. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
  136. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
  137. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
  138. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
  139. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
  140. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
  141. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
  142. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
  143. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
  144. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
  145. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
  146. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
  147. {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
  148. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/biomechanics-specialist.md +0 -0
  149. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/computer-vision-engineer.md +0 -0
  150. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/devops-cicd-engineer.md +0 -0
  151. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/frontend-developer.md +0 -0
  152. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/ml-data-scientist.md +0 -0
  153. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/project-manager.md +0 -0
  154. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/python-backend-developer.md +0 -0
  155. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/qa-test-engineer.md +0 -0
  156. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/technical-writer.md +0 -0
  157. {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/settings.local.json +0 -0
  158. {kinemotion-0.47.4 → kinemotion-0.49.0}/.dockerignore +0 -0
  159. {kinemotion-0.47.4 → kinemotion-0.49.0}/.envrc +0 -0
  160. {kinemotion-0.47.4 → kinemotion-0.49.0}/.gitattributes +0 -0
  161. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  162. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  163. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  164. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/dependabot.yml +0 -0
  165. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/pull_request_template.md +0 -0
  166. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/deploy-backend.yml +0 -0
  167. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/docs.yml +0 -0
  168. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/release.yml +0 -0
  169. {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/test.yml +0 -0
  170. {kinemotion-0.47.4 → kinemotion-0.49.0}/.gitignore +0 -0
  171. {kinemotion-0.47.4 → kinemotion-0.49.0}/.mcp.json +0 -0
  172. {kinemotion-0.47.4 → kinemotion-0.49.0}/.pre-commit-config.yaml +0 -0
  173. {kinemotion-0.47.4 → kinemotion-0.49.0}/.readthedocs.yml +0 -0
  174. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/.gitignore +0 -0
  175. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
  176. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
  177. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/code_style_and_conventions.md +0 -0
  178. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/current-project-architecture.md +0 -0
  179. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
  180. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/deployment-setup-complete.md +0 -0
  181. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/github-project-setup-summary.md +0 -0
  182. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/mvp-first-strategy.md +0 -0
  183. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
  184. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/project_overview.md +0 -0
  185. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/specialist-agents-routing.md +0 -0
  186. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/suggested_commands.md +0 -0
  187. {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/project.yml +0 -0
  188. {kinemotion-0.47.4 → kinemotion-0.49.0}/.tool-versions +0 -0
  189. {kinemotion-0.47.4 → kinemotion-0.49.0}/.vercelignore +0 -0
  190. {kinemotion-0.47.4 → kinemotion-0.49.0}/CLAUDE.md +0 -0
  191. {kinemotion-0.47.4 → kinemotion-0.49.0}/CODE_OF_CONDUCT.md +0 -0
  192. {kinemotion-0.47.4 → kinemotion-0.49.0}/CONTRIBUTING.md +0 -0
  193. {kinemotion-0.47.4 → kinemotion-0.49.0}/Dockerfile +0 -0
  194. {kinemotion-0.47.4 → kinemotion-0.49.0}/GEMINI.md +0 -0
  195. {kinemotion-0.47.4 → kinemotion-0.49.0}/LICENSE +0 -0
  196. {kinemotion-0.47.4 → kinemotion-0.49.0}/README.md +0 -0
  197. {kinemotion-0.47.4 → kinemotion-0.49.0}/SECURITY.md +0 -0
  198. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/.dockerignore +0 -0
  199. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/.env.example +0 -0
  200. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/Dockerfile +0 -0
  201. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/fly-deployment.md +0 -0
  202. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/implementation-summary.md +0 -0
  203. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/setup.md +0 -0
  204. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/tests.md +0 -0
  205. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/pyproject.toml +0 -0
  206. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/__init__.py +0 -0
  207. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/auth.py +0 -0
  208. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
  209. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/middleware.py +0 -0
  210. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/README.md +0 -0
  211. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/__init__.py +0 -0
  212. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/conftest.py +0 -0
  213. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_api_endpoints.py +0 -0
  214. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_error_handling.py +0 -0
  215. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_health.py +0 -0
  216. {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_validation.py +0 -0
  217. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/cmj.md +0 -0
  218. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/core.md +0 -0
  219. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/dropjump.md +0 -0
  220. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/overview.md +0 -0
  221. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/agents-guide.md +0 -0
  222. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/errors-findings.md +0 -0
  223. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/test-suite-review-december-2025.md +0 -0
  224. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/testing-standards.md +0 -0
  225. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/testing.md +0 -0
  226. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/type-hints.md +0 -0
  227. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/validation-plan.md +0 -0
  228. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/validation-roadmap.md +0 -0
  229. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/wallball-norep-detection.md +0 -0
  230. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/bulk-processing.md +0 -0
  231. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/camera-setup.md +0 -0
  232. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cloud-run-deployment.md +0 -0
  233. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-guide.md +0 -0
  234. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
  235. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-recording-protocol.md +0 -0
  236. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/local-testing.md +0 -0
  237. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/setup-issue-12.md +0 -0
  238. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/index.md +0 -0
  239. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/quick-start.md +0 -0
  240. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/cloud-run-quick-reference.md +0 -0
  241. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/json-output-format.md +0 -0
  242. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/json-structure-comparison.md +0 -0
  243. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/parameters.md +0 -0
  244. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/pose-systems.md +0 -0
  245. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
  246. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/README.md +0 -0
  247. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/dois.txt +0 -0
  248. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/download.py +0 -0
  249. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/pyproject.toml +0 -0
  250. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/uv.lock +0 -0
  251. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
  252. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
  253. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/README.md +0 -0
  254. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
  255. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
  256. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
  257. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
  258. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
  259. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
  260. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
  261. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
  262. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
  263. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
  264. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
  265. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
  266. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
  267. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
  268. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
  269. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
  270. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
  271. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
  272. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
  273. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
  274. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
  275. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
  276. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
  277. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
  278. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
  279. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
  280. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
  281. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
  282. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
  283. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
  284. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
  285. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
  286. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
  287. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
  288. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
  289. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
  290. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
  291. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
  292. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
  293. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
  294. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
  295. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
  296. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
  297. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
  298. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
  299. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
  300. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
  301. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
  302. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
  303. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
  304. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
  305. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
  306. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
  307. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
  308. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
  309. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
  310. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
  311. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
  312. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
  313. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
  314. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
  315. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
  316. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
  317. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
  318. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
  319. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
  320. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
  321. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
  322. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
  323. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
  324. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
  325. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
  326. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
  327. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
  328. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
  329. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
  330. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
  331. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
  332. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
  333. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
  334. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
  335. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
  336. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
  337. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
  338. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
  339. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
  340. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
  341. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
  342. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/README.md +0 -0
  343. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/STYLE_GUIDE.md +0 -0
  344. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
  345. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
  346. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
  347. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
  348. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
  349. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
  350. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
  351. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
  352. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
  353. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
  354. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
  355. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
  356. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
  357. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
  358. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
  359. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
  360. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
  361. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
  362. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
  363. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
  364. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
  365. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
  366. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
  367. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
  368. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
  369. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
  370. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
  371. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
  372. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
  373. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
  374. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
  375. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
  376. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
  377. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
  378. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
  379. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
  380. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/framerate.md +0 -0
  381. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/implementation-details.md +0 -0
  382. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/imu-metadata.md +0 -0
  383. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/real-time-analysis.md +0 -0
  384. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/triple-extension.md +0 -0
  385. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/translations/es/camera-setup.md +0 -0
  386. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation/determinism-test.md +0 -0
  387. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation/known-height-validation.md +0 -0
  388. {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation-status.md +0 -0
  389. {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/README.md +0 -0
  390. {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/bulk_processing.py +0 -0
  391. {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/simple_example.py +0 -0
  392. {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/programmatic_usage.py +0 -0
  393. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.editorconfig +0 -0
  394. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.env.example +0 -0
  395. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.gitattributes +0 -0
  396. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.gitignore +0 -0
  397. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
  398. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.yarnrc.yml +0 -0
  399. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/README.md +0 -0
  400. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/index.html +0 -0
  401. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/App.test.tsx +0 -0
  402. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/App.tsx +0 -0
  403. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/Auth.tsx +0 -0
  404. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
  405. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
  406. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
  407. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/RecentUploads.tsx +0 -0
  408. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
  409. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/UploadForm.tsx +0 -0
  410. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
  411. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAnalysis.ts +0 -0
  412. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAuth.ts +0 -0
  413. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
  414. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
  415. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/index.css +0 -0
  416. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/lib/supabase.ts +0 -0
  417. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/main.tsx +0 -0
  418. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/vercel.json +0 -0
  419. {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/vite.config.ts +0 -0
  420. {kinemotion-0.47.4 → kinemotion-0.49.0}/justfile +0 -0
  421. {kinemotion-0.47.4 → kinemotion-0.49.0}/local_dev.sh +0 -0
  422. {kinemotion-0.47.4 → kinemotion-0.49.0}/mkdocs.yml +0 -0
  423. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/.gitignore +0 -0
  424. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/README.md +0 -0
  425. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/.gitignore +0 -0
  426. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/README.md +0 -0
  427. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/api_demo.ipynb +0 -0
  428. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/batch_processing_demo.py +0 -0
  429. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/sample_data/.gitkeep +0 -0
  430. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/presentation_guide.md +0 -0
  431. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/.gitignore +0 -0
  432. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/Makefile +0 -0
  433. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/README.md +0 -0
  434. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/slides.md +0 -0
  435. {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/speaker_script.md +0 -0
  436. {kinemotion-0.47.4 → kinemotion-0.49.0}/requirements-docs.txt +0 -0
  437. {kinemotion-0.47.4 → kinemotion-0.49.0}/samples/cmjs/README.md +0 -0
  438. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/README.md +0 -0
  439. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
  440. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/analyze_determinism_variance.py +0 -0
  441. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/basic-memory-utils.sh +0 -0
  442. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/debug_contact_states.py +0 -0
  443. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/debug_detection.py +0 -0
  444. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/find_unused_features.py +0 -0
  445. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/generate_test_data.py +0 -0
  446. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/optimize_detection_params.py +0 -0
  447. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_cmj_velocities.py +0 -0
  448. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_validation_results.py +0 -0
  449. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_velocities.py +0 -0
  450. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/prepare_ground_truth.py +0 -0
  451. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/README.md +0 -0
  452. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/add-issue.sh +0 -0
  453. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/batch-set-fields.sh +0 -0
  454. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/helpers.sh +0 -0
  455. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/list.sh +0 -0
  456. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/set-field.sh +0 -0
  457. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/set-status.sh +0 -0
  458. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/summary.sh +0 -0
  459. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project.sh +0 -0
  460. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-github-deploy.sh +0 -0
  461. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-google-oauth.sh +0 -0
  462. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-supabase-local.sh +0 -0
  463. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-supabase-production.sh +0 -0
  464. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_acceleration_standing.py +0 -0
  465. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_determinism.sh +0 -0
  466. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_drop_start_debug.py +0 -0
  467. {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/validate_known_heights.py +0 -0
  468. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/__init__.py +0 -0
  469. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cli.py +0 -0
  470. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/__init__.py +0 -0
  471. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/analysis.py +0 -0
  472. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
  473. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/joint_angles.py +0 -0
  474. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/kinematics.py +0 -0
  475. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
  476. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
  477. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/__init__.py +0 -0
  478. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/auto_tuning.py +0 -0
  479. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/cli_utils.py +0 -0
  480. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
  481. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/determinism.py +0 -0
  482. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/experimental.py +0 -0
  483. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/filtering.py +0 -0
  484. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/formatting.py +0 -0
  485. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/metadata.py +0 -0
  486. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/pipeline_utils.py +0 -0
  487. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/pose.py +0 -0
  488. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/quality.py +0 -0
  489. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/smoothing.py +0 -0
  490. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/timing.py +0 -0
  491. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/validation.py +0 -0
  492. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/video_io.py +0 -0
  493. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/__init__.py +0 -0
  494. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/analysis.py +0 -0
  495. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
  496. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/kinematics.py +0 -0
  497. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
  498. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
  499. {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/py.typed +0 -0
  500. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/__init__.py +0 -0
  501. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/__init__.py +0 -0
  502. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_cmj.py +0 -0
  503. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_dropjump.py +0 -0
  504. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_imports.py +0 -0
  505. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/__init__.py +0 -0
  506. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_analysis.py +0 -0
  507. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_cli.py +0 -0
  508. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_joint_angles.py +0 -0
  509. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_kinematics.py +0 -0
  510. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_physiological_bounds.py +0 -0
  511. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/conftest.py +0 -0
  512. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/__init__.py +0 -0
  513. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_auto_tuning.py +0 -0
  514. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_cli_utils.py +0 -0
  515. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_filtering.py +0 -0
  516. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_formatting.py +0 -0
  517. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_metadata.py +0 -0
  518. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_pipeline_utils.py +0 -0
  519. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_pose.py +0 -0
  520. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_quality.py +0 -0
  521. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_smoothing.py +0 -0
  522. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_timing.py +0 -0
  523. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_validation.py +0 -0
  524. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_video_io.py +0 -0
  525. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/__init__.py +0 -0
  526. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
  527. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_analysis.py +0 -0
  528. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_cli.py +0 -0
  529. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_contact_detection.py +0 -0
  530. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_kinematics.py +0 -0
  531. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_physiological_bounds.py +0 -0
  532. {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_validation_integration.py +0 -0
@@ -0,0 +1,243 @@
1
+ ---
2
+ title: 'Commit Review: R2 Video Storage Migration (fe74d1f)'
3
+ type: note
4
+ permalink: development/commit-review-r2-video-storage-migration-fe74d1f
5
+ ---
6
+
7
+ # Commit Review: R2 Video Storage Migration
8
+
9
+ **Commit Hash:** fe74d1fc51103df2fb505a1cdc1f0e1f53845c3f
10
+ **Date:** December 12, 2025
11
+ **Author:** Sebastian Otaegui
12
+ **Type:** feat (feature addition)
13
+
14
+ ## Overview
15
+
16
+ This commit implements a complete migration from Vercel blob storage to Cloudflare R2 for serving original videos. The change addresses MVP requirement #12 and introduces a flexible URL generation strategy supporting both public and presigned URLs.
17
+
18
+ ## Key Changes
19
+
20
+ ### Backend (app.py)
21
+
22
+ #### 1. **New `get_object_url()` Method** ✅
23
+ - **Location:** `R2StorageClient` class (lines 161-172)
24
+ - **Purpose:** Abstracts URL generation logic with fallback strategy
25
+ - **Implementation:**
26
+ - Prefers public URL if `R2_PUBLIC_BASE_URL` is configured
27
+ - Falls back to presigned URL with configurable expiration
28
+ - **Best Practice Alignment:** Matches Cloudflare R2 documentation patterns (from Exa context)
29
+ - **Code Quality:** Clean separation of concerns, well-documented
30
+
31
+ #### 2. **Configuration Enhancements** ✅
32
+ - Added `public_base_url` attribute (line 115)
33
+ - Added `presign_expiration_s` attribute with error handling (lines 117-122)
34
+ - Default: 3600 seconds (1 hour) for presigned URLs
35
+ - **Security:** Supports both public domains and custom R2 domains
36
+
37
+ #### 3. **Video Upload Strategy** ✅
38
+ - **UUID-based naming:** `{upload_id}{suffix}` instead of original filename (line 625)
39
+ - **Benefits:**
40
+ - Prevents filename collisions
41
+ - Maintains file extension for proper MIME types
42
+ - Consistent naming across original/debug/results files
43
+ - **R2 Path Structure:**
44
+ - Original videos: `videos/{jump_type}/{uuid}.mp4`
45
+ - Results: `results/{jump_type}/{uuid}_results.json`
46
+ - Debug videos: `debug_videos/{jump_type}/{uuid}_debug.mp4`
47
+
48
+ #### 4. **AnalysisResponse Extension** ✅
49
+ - Added `original_video_url` field (lines 62, 71, 92-93)
50
+ - Properly serialized in `to_dict()` method
51
+ - **Type Safety:** Optional field with `str | None`
52
+
53
+ ### Frontend (React/TypeScript)
54
+
55
+ #### 1. **ResultsDisplay.tsx Changes** ✅
56
+ - **Smart URL Prioritization:** R2 URL > local blob URL > undefined (line 231)
57
+ - **useEffect Hook:** Proper cleanup of blob URLs to prevent memory leaks (lines 216-229)
58
+ - **Conditional Rendering:** Shows original video when either URL is available (line 232)
59
+ - **Download Links:** Both original and debug videos (lines 269-291)
60
+
61
+ #### 2. **Type Definitions** ✅
62
+ - Added `original_video_url?: string` to `AnalysisResponse` interface (frontend/src/types/api.ts)
63
+
64
+ #### 3. **Test Updates** ✅
65
+ - **ResultsDisplay.test.tsx:**
66
+ - Added test for R2 original video URL rendering
67
+ - Verified download link presence
68
+ - **UploadForm.test.tsx:**
69
+ - Fixed React import (explicit import)
70
+ - Added proper TypeScript interface
71
+ - Fixed timestamp type (number vs ISO string)
72
+
73
+ ### Dependencies
74
+
75
+ #### Frontend Package Updates ✅
76
+ - Added `@types/jest@^30.0.0` for better test type safety
77
+ - Updated yarn.lock with 366 new lines (Jest-related dependencies)
78
+
79
+ ## Code Quality Assessment
80
+
81
+ ### ✅ **Strengths**
82
+
83
+ 1. **Conventional Commits:** Properly formatted commit message with scope
84
+ 2. **Type Safety:** All new fields properly typed (TypeScript + Python)
85
+ 3. **Error Handling:** OSError exceptions with proper logging
86
+ 4. **Documentation:** Clear docstrings for `get_object_url()`
87
+ 5. **Flexibility:** Supports both public and presigned URL strategies
88
+ 6. **Memory Safety:** Proper blob URL cleanup in useEffect
89
+ 7. **Testing:** Comprehensive test coverage for new features
90
+ 8. **Logging:** Added URL logging for R2 uploads (lines 633-634)
91
+
92
+ ### ⚠️ **Minor Concerns**
93
+
94
+ 1. **Presigned URL Expiration:**
95
+ - Default 1 hour may be too short for long analysis sessions
96
+ - **Recommendation:** Consider 24 hours for production (86400s)
97
+ - **Justification:** Videos should remain accessible after analysis
98
+
99
+ 2. **Missing Backend Tests:**
100
+ - No explicit backend tests for `get_object_url()` method
101
+ - Search didn't find tests for `original_video_url` in backend
102
+ - **Recommendation:** Add unit tests for R2StorageClient methods
103
+
104
+ 3. **Public URL Configuration:**
105
+ - `R2_PUBLIC_BASE_URL` not documented in commit message
106
+ - **Missing:** Deployment documentation for environment variable
107
+ - **Recommendation:** Update deployment checklist
108
+
109
+ 4. **Frontend Type Import:**
110
+ - Explicit `import React` added to test files (lines 174, 300)
111
+ - This is unnecessary with React 17+ JSX transform
112
+ - **Note:** May be required by test setup (vitest)
113
+
114
+ ### 📋 **Compliance with Project Standards**
115
+
116
+ | Standard | Status | Notes |
117
+ |----------|--------|-------|
118
+ | Conventional Commits | ✅ | `feat:` prefix, clear description |
119
+ | Type Safety | ✅ | All new code properly typed |
120
+ | Test Coverage | ⚠️ | Frontend tested, backend needs tests |
121
+ | Documentation | ⚠️ | Code documented, deployment docs needed |
122
+ | Error Handling | ✅ | Proper exception handling with logging |
123
+ | Code Duplication | ✅ | No new duplication introduced |
124
+ | Linting | ✅ | Follows project formatting standards |
125
+
126
+ ## Best Practices Validation
127
+
128
+ ### Cloudflare R2 Best Practices (from Exa research)
129
+
130
+ 1. **✅ Presigned URLs:** Correctly implemented with boto3 client
131
+ 2. **✅ Public URLs:** Supports custom domain configuration
132
+ 3. **✅ S3-Compatible API:** Uses standard boto3 S3 client
133
+ 4. **✅ Error Handling:** OSError wrapping for R2 operations
134
+
135
+ ### FastAPI Best Practices (from Ref documentation)
136
+
137
+ 1. **⚠️ Response Models:** Uses custom `AnalysisResponse` class instead of Pydantic
138
+ - **Current:** Manual `to_dict()` serialization
139
+ - **Better:** Use `@dataclass` with FastAPI's dataclass support
140
+ - **Trade-off:** Current approach works fine, but less idiomatic
141
+
142
+ ### React Best Practices
143
+
144
+ 1. **✅ useEffect Dependencies:** Correctly specified `[videoFile]`
145
+ 2. **✅ Cleanup Functions:** Revokes blob URLs on unmount
146
+ 3. **✅ Conditional Rendering:** Proper boolean coercion with `Boolean()`
147
+ 4. **✅ Test Coverage:** Tests for new URL prioritization logic
148
+
149
+ ## Performance Impact
150
+
151
+ ### Positive
152
+ - **Reduced Vercel bandwidth:** Videos served from R2 (cheaper)
153
+ - **Better CDN support:** R2 has global edge caching
154
+ - **No frontend blob creation:** When R2 URL is available
155
+
156
+ ### Neutral
157
+ - **Upload time:** Still uploads to R2 (no change)
158
+ - **Analysis time:** No impact on kinemotion processing
159
+
160
+ ### Potential Issues
161
+ - **Presigned URL expiration:** Short-lived URLs may break if page stays open
162
+ - **Mitigation:** Increase expiration to 24 hours
163
+
164
+ ## Security Considerations
165
+
166
+ ### ✅ **Good**
167
+ - UUID-based filenames prevent enumeration attacks
168
+ - Configurable expiration for presigned URLs
169
+ - Supports both private (presigned) and public (CDN) strategies
170
+
171
+ ### ⚠️ **Consider**
172
+ - Public URLs expose video content to anyone with the link
173
+ - **Recommendation:** Document security trade-offs in deployment guide
174
+ - **Future:** Consider signed cookies for private video access
175
+
176
+ ## Integration with MVP Goals
177
+
178
+ **Alignment:** ✅ Excellent
179
+
180
+ - Closes Issue #12 (MVP video serving migration)
181
+ - Reduces infrastructure costs (Vercel → R2)
182
+ - Improves scalability for MVP validation phase
183
+ - Maintains backward compatibility (local blob URLs still work)
184
+
185
+ ## Recommendations
186
+
187
+ ### Immediate (Before Next Deploy)
188
+
189
+ 1. **Add Backend Tests:**
190
+ ```python
191
+ # backend/tests/test_r2_storage.py
192
+ def test_get_object_url_with_public_base():
193
+ """Test that public URL is preferred when configured."""
194
+ pass
195
+
196
+ def test_get_object_url_fallback_to_presigned():
197
+ """Test fallback to presigned URL when no public base."""
198
+ pass
199
+ ```
200
+
201
+ 2. **Update Deployment Docs:**
202
+ - Add `R2_PUBLIC_BASE_URL` to environment variable checklist
203
+ - Document presigned URL expiration trade-offs
204
+ - Add R2 bucket CORS configuration steps
205
+
206
+ 3. **Increase Presigned Expiration:**
207
+ - Change default from 3600s (1 hour) to 86400s (24 hours)
208
+ - Or make it configurable per environment
209
+
210
+ ### Future Enhancements
211
+
212
+ 1. **Pydantic Response Models:**
213
+ - Migrate `AnalysisResponse` to use Pydantic's `@dataclass`
214
+ - Leverage FastAPI's automatic validation and serialization
215
+
216
+ 2. **URL Refresh Mechanism:**
217
+ - Frontend polling to refresh expiring presigned URLs
218
+ - Or use public URLs in production
219
+
220
+ 3. **Metrics Tracking:**
221
+ - Track R2 bandwidth usage
222
+ - Monitor presigned URL expiration issues
223
+
224
+ ## Conclusion
225
+
226
+ **Overall Assessment:** ✅ **Excellent**
227
+
228
+ This is a well-executed feature addition that successfully migrates video serving from Vercel to R2. The implementation is clean, flexible, and follows best practices for cloud storage integration.
229
+
230
+ **Key Strengths:**
231
+ - Flexible URL strategy (public vs presigned)
232
+ - UUID-based naming prevents collisions
233
+ - Proper error handling and logging
234
+ - Good test coverage for frontend changes
235
+
236
+ **Minor Improvements Needed:**
237
+ - Add backend tests for `get_object_url()`
238
+ - Update deployment documentation
239
+ - Consider increasing presigned URL expiration
240
+
241
+ **Recommendation:** ✅ **Approve with minor follow-ups**
242
+
243
+ The commit is ready to merge. The recommended follow-ups (backend tests, deployment docs) can be addressed in subsequent commits without blocking this feature.
@@ -0,0 +1,97 @@
1
+ ---
2
+ title: Feature Request System Configuration
3
+ type: note
4
+ permalink: development/feature-request-system-configuration
5
+ ---
6
+
7
+ # Feature Request & Feedback System Configuration
8
+
9
+ ## Frontend Configuration
10
+
11
+ ### External Links Setup
12
+ Edit `frontend/src/config/links.ts`:
13
+
14
+ ```typescript
15
+ export const EXTERNAL_LINKS = {
16
+ // Replace with actual Google Forms URL
17
+ FEATURE_REQUEST: 'https://docs.google.com/forms/d/e/YOUR_FORM_ID/viewform',
18
+ GITHUB_ISSUES: 'https://github.com/feniix/kinemotion/issues',
19
+ DOCUMENTATION: 'https://github.com/feniix/kinemotion#readme',
20
+ } as const
21
+
22
+ export const UI_CONFIG = {
23
+ FEATURE_REQUEST: {
24
+ enabled: true,
25
+ buttonText: 'Request Feature',
26
+ buttonIcon: '💡',
27
+ tooltip: 'Share your ideas and suggestions for improving Kinemotion',
28
+ openInNewTab: true,
29
+ },
30
+ } as const
31
+ ```
32
+
33
+ ### Google Forms Setup
34
+
35
+ 1. Create form at [Google Forms](https://forms.google.com)
36
+ 2. Include fields:
37
+ - Feature category (Analysis, UI, Performance, etc.)
38
+ - Feature description
39
+ - Use case/priority
40
+ - Additional comments
41
+ 3. Get form URL and update FEATURE_REQUEST constant
42
+
43
+ ## Component Usage
44
+
45
+ ### FeatureRequestButton Props
46
+ ```typescript
47
+ <FeatureRequestButton
48
+ variant="primary" // or "secondary"
49
+ size="medium" // "small", "medium", "large"
50
+ showIcon={true}
51
+ className="custom-class"
52
+ />
53
+ ```
54
+
55
+ ### Button Styles
56
+ - **Primary**: Blue background (`#6366f1`), white text
57
+ - **Secondary**: Light gray background (`#f3f4f6`), dark text
58
+ - **Sizes**: Small (0.75rem font), Medium (0.875rem), Large (1rem font)
59
+
60
+ ## Database Detection
61
+
62
+ The frontend automatically detects backend database connectivity:
63
+
64
+ ```typescript
65
+ const { status: dbStatus, loading: dbLoading } = useDatabaseStatus()
66
+
67
+ // Conditional UI rendering
68
+ {dbStatus?.database_connected && (
69
+ <button>Add Coach Feedback</button>
70
+ )}
71
+
72
+ {!dbStatus?.database_connected && (
73
+ <span>Database Offline - Feedback Unavailable</span>
74
+ )}
75
+ ```
76
+
77
+ ## Files Created
78
+ - `frontend/src/components/FeatureRequestButton.tsx`
79
+ - `frontend/src/components/FeedbackForm.tsx`
80
+ - `frontend/src/hooks/useDatabaseStatus.ts`
81
+ - `frontend/src/config/links.ts`
82
+
83
+ ## Integration Points
84
+ - **ResultsDisplay**: Dedicated feedback section
85
+ - **Health Check**: Database status in `/health` endpoint
86
+ - **Analytics**: Google Analytics tracking included
87
+
88
+ ## User Flow
89
+ 1. Analysis completes → Results display
90
+ 2. "Share Your Feedback" section appears
91
+ 3. Options based on database status:
92
+ - Database connected: Coach feedback + feature request + report issue
93
+ - Database offline: Feature request + report issue + error message
94
+ 4. Feature request opens Google Forms in new tab
95
+ 5. Coach feedback saves to Supabase (if connected)
96
+
97
+ This system provides comprehensive user feedback collection while maintaining a seamless experience.
@@ -0,0 +1,240 @@
1
+ ---
2
+ title: Follow-up Improvements to R2 Video Storage Migration
3
+ type: note
4
+ permalink: development/follow-up-improvements-to-r2-video-storage-migration
5
+ ---
6
+
7
+ # Follow-up Improvements to R2 Video Storage Migration
8
+
9
+ **Date:** December 12, 2025
10
+ **Parent Commit:** fe74d1fc (R2 video storage migration)
11
+ **Improvements Implemented:** Default expiration + tests + documentation
12
+
13
+ ---
14
+
15
+ ## Summary of Changes
16
+
17
+ Following the comprehensive commit review, three key improvements were implemented to address identified gaps:
18
+
19
+ ### 1. ✅ Changed Default Presigned URL Expiration
20
+
21
+ **File:** `backend/src/kinemotion_backend/app.py`
22
+
23
+ **Change:** Updated default presigned URL expiration from 1 hour (3600s) to 7 days (604800s)
24
+
25
+ **Rationale:**
26
+ - 1 hour is too short for production use cases
27
+ - 7 days is the maximum allowed by S3 API
28
+ - Users can still access videos after long analysis sessions
29
+ - Videos remain accessible for download/playback even after page reloads
30
+
31
+ **Code Change:**
32
+ ```python
33
+ # Before
34
+ self.presign_expiration_s = int(os.getenv("R2_PRESIGN_EXPIRATION_S") or "3600")
35
+
36
+ # After (line 118-120)
37
+ self.presign_expiration_s = int(os.getenv("R2_PRESIGN_EXPIRATION_S") or "604800")
38
+ ```
39
+
40
+ ### 2. ✅ Added Backend Tests for `get_object_url()`
41
+
42
+ **File:** `backend/tests/test_r2_integration.py`
43
+
44
+ **New Tests Added (5 tests):**
45
+
46
+ 1. **`test_r2_client_initialization_with_public_url()`**
47
+ - Verifies `R2_PUBLIC_BASE_URL` is correctly loaded from environment
48
+
49
+ 2. **`test_r2_client_initialization_strips_trailing_slash_from_public_url()`**
50
+ - Ensures trailing slashes are stripped for consistent URL formatting
51
+
52
+ 3. **`test_r2_client_initialization_custom_presign_expiration()`**
53
+ - Tests custom `R2_PRESIGN_EXPIRATION_S` configuration
54
+
55
+ 4. **`test_r2_client_initialization_invalid_presign_expiration()`**
56
+ - Verifies fallback to 7 days when invalid expiration provided
57
+
58
+ 5. **`test_get_object_url_with_public_base_url()`**
59
+ - Tests public URL is returned when `R2_PUBLIC_BASE_URL` is configured
60
+
61
+ 6. **`test_get_object_url_without_public_base_url()`**
62
+ - Tests presigned URL fallback when no public URL configured
63
+
64
+ 7. **`test_get_object_url_strips_leading_slash()`**
65
+ - Verifies key normalization (strips leading slash)
66
+
67
+ 8. **`test_get_object_url_with_custom_expiration()`**
68
+ - Tests that custom expiration is respected in presigned URLs
69
+
70
+ **Updated Tests (3 tests):**
71
+ - Updated expiration assertions from 3600s to 604800s in:
72
+ - `test_r2_upload_file_success()`
73
+ - `test_r2_put_object_success()`
74
+
75
+ **Test Results:** All 28 tests pass ✅
76
+
77
+ ### 3. ✅ Documented R2 Configuration
78
+
79
+ #### Backend README (`backend/README.md`)
80
+
81
+ **Added comprehensive R2 configuration section:**
82
+
83
+ ```bash
84
+ # R2 Storage (Optional)
85
+ R2_ENDPOINT=https://abc123.r2.cloudflarestorage.com
86
+ R2_ACCESS_KEY=your_access_key
87
+ R2_SECRET_KEY=your_secret_key
88
+ R2_BUCKET_NAME=kinemotion # Default
89
+
90
+ # Optional: Public URL strategy
91
+ R2_PUBLIC_BASE_URL=https://kinemotion-public.example.com # Custom domain
92
+ # Or: https://kinemotion.abc123.r2.dev # R2.dev public URL
93
+
94
+ # Optional: Presigned URL expiration (default: 604800 = 7 days)
95
+ R2_PRESIGN_EXPIRATION_S=604800
96
+ ```
97
+
98
+ **Documented URL Strategy Trade-offs:**
99
+ - **Public URLs:** Stable, long-lived, better for production (requires public bucket or custom domain)
100
+ - **Presigned URLs:** Temporary access, expire after N seconds, no custom domain needed
101
+
102
+ #### Deployment Checklist (`docs/guides/deployment-checklist.md`)
103
+
104
+ **Added new section before deployment steps:**
105
+
106
+ ```markdown
107
+ ## Environment Configuration
108
+
109
+ ### Required Environment Variables
110
+ #### R2 Storage (for video persistence)
111
+ [Full configuration with examples]
112
+
113
+ #### Optional R2 URL Strategy
114
+ [Public URLs vs Presigned URLs with trade-offs]
115
+
116
+ #### CORS Configuration
117
+ [CORS setup for production]
118
+ ```
119
+
120
+ **Updated Cloud Run deployment command** with R2 environment variables:
121
+ ```bash
122
+ --set-env-vars "R2_ENDPOINT=..." \
123
+ --set-env-vars "R2_ACCESS_KEY=..." \
124
+ --set-env-vars "R2_SECRET_KEY=..." \
125
+ --set-env-vars "R2_BUCKET_NAME=kinemotion" \
126
+ --set-env-vars "R2_PUBLIC_BASE_URL=https://kinemotion-public.example.com"
127
+ ```
128
+
129
+ ---
130
+
131
+ ## Impact Analysis
132
+
133
+ ### Configuration Changes
134
+ - **Default expiration:** 3600s → 604800s (168x increase)
135
+ - **Backward compatible:** Can override with `R2_PRESIGN_EXPIRATION_S` env var
136
+ - **No breaking changes:** Existing deployments continue to work
137
+
138
+ ### Test Coverage
139
+ - **Before:** 23 tests in `test_r2_integration.py`
140
+ - **After:** 28 tests (+5 new tests, +3 updated)
141
+ - **Coverage improvement:** New tests cover all `get_object_url()` code paths
142
+
143
+ ### Documentation Completeness
144
+ - **Backend README:** Comprehensive R2 configuration guide
145
+ - **Deployment Checklist:** Production-ready environment variable setup
146
+ - **Developer experience:** Clear guidance on public vs presigned URL strategies
147
+
148
+ ---
149
+
150
+ ## Validation
151
+
152
+ ### ✅ All Tests Pass
153
+ ```bash
154
+ cd backend && uv run pytest tests/test_r2_integration.py -v
155
+ ===== 28 passed, 2 warnings in 0.49s =====
156
+ ```
157
+
158
+ ### ✅ No Linting Errors
159
+ ```bash
160
+ uv run pyright backend/src/kinemotion_backend/app.py
161
+ uv run ruff check backend/
162
+ # No errors
163
+ ```
164
+
165
+ ### ✅ Type Safety Maintained
166
+ - All new code follows strict type hints
167
+ - Pyright strict mode passes
168
+
169
+ ---
170
+
171
+ ## Recommendations for Next Steps
172
+
173
+ ### Immediate (Before Deploy)
174
+ 1. **Update environment variables in Cloud Run:**
175
+ ```bash
176
+ gcloud run services update kinemotion-backend \
177
+ --set-env-vars "R2_PUBLIC_BASE_URL=https://kinemotion.YOUR_ACCOUNT.r2.dev" \
178
+ --set-env-vars "R2_PRESIGN_EXPIRATION_S=604800"
179
+ ```
180
+
181
+ 2. **Configure R2 Bucket for Public Access:**
182
+ - If using public URLs, enable public read access on R2 bucket
183
+ - Or configure custom domain with R2
184
+
185
+ ### Future Enhancements
186
+ 1. **URL Refresh Mechanism:**
187
+ - Frontend polling to refresh expiring presigned URLs (for 7-day+ sessions)
188
+ - Or fully migrate to public URLs in production
189
+
190
+ 2. **Monitoring:**
191
+ - Track presigned URL expiration issues in logs
192
+ - Monitor R2 bandwidth usage and costs
193
+
194
+ 3. **Security:**
195
+ - Consider signed cookies for private video access (enterprise feature)
196
+ - Document security implications of public vs presigned URLs
197
+
198
+ ---
199
+
200
+ ## Files Changed
201
+
202
+ 1. **backend/src/kinemotion_backend/app.py** (1 change)
203
+ - Line 118-120: Default expiration 3600 → 604800
204
+
205
+ 2. **backend/tests/test_r2_integration.py** (+8 new/updated tests)
206
+ - Lines 12-28: Updated initialization test + 4 new tests
207
+ - Lines 103-145: Added 5 new `get_object_url()` tests
208
+ - Lines 286-291: Updated expiration assertion
209
+
210
+ 3. **backend/README.md** (2 additions)
211
+ - Lines 53-80: Comprehensive R2 configuration section
212
+ - Lines 396-409: Production environment variables
213
+
214
+ 4. **docs/guides/deployment-checklist.md** (2 additions)
215
+ - Lines 95-135: New "Environment Configuration" section
216
+ - Lines 121-136: Updated deployment command with R2 vars
217
+
218
+ ---
219
+
220
+ ## Conclusion
221
+
222
+ All three improvements from the commit review have been successfully implemented:
223
+
224
+ 1. ✅ **Default expiration changed to 7 days** (maximum allowed)
225
+ 2. ✅ **Backend tests added** (8 new/updated tests, 100% pass rate)
226
+ 3. ✅ **Documentation gap filled** (README + deployment checklist)
227
+
228
+ **Ready for commit:** All changes are production-ready, tested, and documented.
229
+
230
+ **Suggested commit message:**
231
+ ```
232
+ feat(backend): improve R2 storage configuration and testing
233
+
234
+ - Change default presigned URL expiration from 1 hour to 7 days (max allowed)
235
+ - Add 8 new/updated tests for R2StorageClient.get_object_url()
236
+ - Document R2_PUBLIC_BASE_URL and R2_PRESIGN_EXPIRATION_S in README
237
+ - Update deployment checklist with R2 environment variables
238
+
239
+ Closes follow-up from commit fe74d1f review
240
+ ```
@@ -0,0 +1,104 @@
1
+ ---
2
+ title: Supabase Database Integration Setup
3
+ type: note
4
+ permalink: development/supabase-database-integration-setup
5
+ ---
6
+
7
+ # Supabase Database Integration for Coach Feedback
8
+
9
+ ## Database Schema
10
+
11
+ Run this SQL in Supabase SQL Editor to create the required tables:
12
+
13
+ ```sql
14
+ -- Analysis Sessions Table
15
+ CREATE TABLE IF NOT EXISTS analysis_sessions (
16
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
17
+ user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
18
+ jump_type VARCHAR(50) NOT NULL CHECK (jump_type IN ('cmj', 'drop_jump')),
19
+ quality_preset VARCHAR(20) NOT NULL CHECK (quality_preset IN ('fast', 'balanced', 'accurate')),
20
+ original_video_url TEXT,
21
+ debug_video_url TEXT,
22
+ results_json_url TEXT,
23
+ analysis_data JSONB NOT NULL,
24
+ processing_time_s FLOAT,
25
+ upload_id VARCHAR(50),
26
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
27
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
28
+ );
29
+
30
+ -- Coach Feedback Table
31
+ CREATE TABLE IF NOT EXISTS coach_feedback (
32
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
33
+ analysis_session_id UUID NOT NULL REFERENCES analysis_sessions(id) ON DELETE CASCADE,
34
+ coach_user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
35
+ notes TEXT,
36
+ rating INTEGER CHECK (rating >= 1 AND rating <= 5),
37
+ tags TEXT[] DEFAULT '{}',
38
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
39
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
40
+ );
41
+
42
+ -- Indexes and RLS policies included in full schema
43
+ ```
44
+
45
+ ## Backend Integration
46
+
47
+ ### New Files Created:
48
+ - `backend/src/kinemotion_backend/database.py` - Async Supabase client
49
+ - `backend/src/kinemotion_backend/analysis_api.py` - Feedback API endpoints
50
+ - `backend/src/kinemotion_backend/models.py` - Pydantic models
51
+ - `backend/supabase-schema.sql` - Complete database schema
52
+
53
+ ### API Endpoints:
54
+ - `POST /api/analysis/sessions` - Create analysis sessions
55
+ - `GET /api/analysis/sessions` - List user sessions
56
+ - `GET /api/analysis/sessions/{id}` - Get session with feedback
57
+ - `POST /api/analysis/sessions/{id}/feedback` - Add coach feedback
58
+ - `GET /api/analysis/database-status` - Check database connection
59
+
60
+ ### Key Features:
61
+ - Optional authentication (works with/without user login)
62
+ - JSONB storage for flexible analysis data querying
63
+ - Row Level Security for data privacy
64
+ - Async database operations
65
+ - Graceful error handling
66
+
67
+ ## Frontend Integration
68
+
69
+ ### Components Added:
70
+ - `FeedbackForm.tsx` - Modal feedback form with rating, tags, notes
71
+ - `FeatureRequestButton.tsx` - Reusable feature request button
72
+ - `useDatabaseStatus.ts` - Hook for checking database connectivity
73
+
74
+ ### Configuration:
75
+ - `config/links.ts` - External links and UI settings
76
+ - Google Forms integration for feature requests
77
+ - Conditional UI based on database status
78
+
79
+ ### User Experience:
80
+ - Smart feedback section with multiple options
81
+ - Database connection detection
82
+ - Responsive design
83
+ - Analytics tracking ready
84
+
85
+ ## Setup Requirements:
86
+ 1. Run database schema in Supabase
87
+ 2. Configure SUPABASE_URL and SUPABASE_ANON_KEY
88
+ 3. Update Google Forms URL in frontend config
89
+ 4. Test integration with authenticated/unauthenticated users
90
+
91
+ ## Example Queries:
92
+ ```sql
93
+ -- Average jump height by user
94
+ SELECT user_id, AVG((analysis_data->'data'->>'jump_height')::float) as avg_jump_height
95
+ FROM analysis_sessions WHERE jump_type = 'cmj' GROUP BY user_id;
96
+
97
+ -- Sessions with feedback
98
+ SELECT s.*, f.rating, f.notes
99
+ FROM analysis_sessions s
100
+ LEFT JOIN coach_feedback f ON s.id = f.analysis_session_id
101
+ WHERE f.id IS NOT NULL;
102
+ ```
103
+
104
+ This system enables comprehensive coach feedback collection and athlete performance tracking.
@@ -56,6 +56,19 @@
56
56
  "-y",
57
57
  "@mettamatt/code-reasoning"
58
58
  ]
59
+ },
60
+ "sonarqube": {
61
+ "command": "direnv",
62
+ "args": [
63
+ "exec",
64
+ "/Users/feniix/src/personal/cursor/kinemotion",
65
+ "java",
66
+ "-jar",
67
+ "/tmp/sonarqube-mcp-server-1.4.0.1666.jar"
68
+ ],
69
+ "env": {
70
+ "STORAGE_PATH": "/tmp/sonarqube"
71
+ }
59
72
  }
60
73
  }
61
74
  }