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.
- kinemotion-0.49.0/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +243 -0
- kinemotion-0.49.0/.basic-memory/development/feature-request-system-configuration.md +97 -0
- kinemotion-0.49.0/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +240 -0
- kinemotion-0.49.0/.basic-memory/development/supabase-database-integration-setup.md +104 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.cursor/mcp.json +13 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/CHANGELOG.md +45 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/PKG-INFO +1 -1
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/README.md +20 -0
- kinemotion-0.49.0/backend/src/kinemotion_backend/analysis_api.py +303 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/app.py +109 -12
- kinemotion-0.49.0/backend/src/kinemotion_backend/database.py +298 -0
- kinemotion-0.49.0/backend/src/kinemotion_backend/models.py +108 -0
- kinemotion-0.49.0/backend/src/kinemotion_backend/types.py +5 -0
- kinemotion-0.49.0/backend/supabase-schema.sql +148 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_r2_integration.py +164 -2
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/README.md +2 -0
- kinemotion-0.49.0/docs/development/feature-request-system.md +191 -0
- kinemotion-0.49.0/docs/development/feedback-system-setup.md +192 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/deployment-checklist.md +52 -1
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/package.json +1 -0
- kinemotion-0.49.0/frontend/src/components/FeatureRequestButton.tsx +103 -0
- kinemotion-0.49.0/frontend/src/components/FeedbackForm.css +308 -0
- kinemotion-0.49.0/frontend/src/components/FeedbackForm.tsx +212 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsDisplay.test.tsx +11 -1
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsDisplay.tsx +231 -6
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/UploadForm.test.tsx +17 -2
- kinemotion-0.49.0/frontend/src/config/links.ts +46 -0
- kinemotion-0.49.0/frontend/src/hooks/useDatabaseStatus.ts +62 -0
- kinemotion-0.49.0/frontend/src/test/setup.ts +21 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/types/api.ts +1 -0
- kinemotion-0.49.0/frontend/src/vite-env.d.ts +35 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/yarn.lock +363 -3
- {kinemotion-0.47.4 → kinemotion-0.49.0}/pyproject.toml +1 -1
- {kinemotion-0.47.4 → kinemotion-0.49.0}/sonar-project.properties +1 -1
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/api.py +6 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/api.py +24 -22
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/cli.py +10 -5
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/api.py +242 -110
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/cli.py +40 -8
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_api.py +122 -3
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_api.py +11 -3
- {kinemotion-0.47.4 → kinemotion-0.49.0}/uv.lock +1 -1
- kinemotion-0.47.4/frontend/src/test/setup.ts +0 -1
- kinemotion-0.47.4/frontend/src/vite-env.d.ts +0 -9
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.dockerignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.envrc +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.gitattributes +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.mcp.json +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.readthedocs.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.serena/project.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.tool-versions +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/.vercelignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/CLAUDE.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/Dockerfile +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/GEMINI.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/LICENSE +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/SECURITY.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/.dockerignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/.env.example +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/Dockerfile +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/core.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/api/overview.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/testing.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/index.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/quick-start.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/docs/validation-status.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.env.example +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/index.html +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/index.css +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/vercel.json +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/justfile +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/local_dev.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/mkdocs.yml +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/requirements-docs.txt +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/README.md +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/project.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/conftest.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.47.4 → kinemotion-0.49.0}/tests/dropjump/test_validation_integration.py +0 -0
kinemotion-0.49.0/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md
ADDED
|
@@ -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.
|
kinemotion-0.49.0/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md
ADDED
|
@@ -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
|
}
|