kinemotion 0.50.1__tar.gz → 0.51.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.50.1 → kinemotion-0.51.0}/.github/workflows/deploy-backend.yml +69 -8
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/workflows/release.yml +14 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.pre-commit-config.yaml +1 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/CHANGELOG.md +53 -5
- {kinemotion-0.50.1 → kinemotion-0.51.0}/PKG-INFO +1 -1
- kinemotion-0.51.0/backend/CHANGELOG.md +58 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/pyproject.toml +31 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/analysis_api.py +19 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app.py +16 -4
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/models/responses.py +1 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/routes/analysis.py +14 -13
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/services/analysis_service.py +22 -28
- kinemotion-0.51.0/backend/src/kinemotion_backend/services/video_processor.py +82 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/test_api_endpoints.py +3 -3
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/test_error_handling.py +3 -3
- {kinemotion-0.50.1 → kinemotion-0.51.0}/pyproject.toml +7 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/api.py +17 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/smoothing.py +18 -1
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/validation.py +6 -13
- {kinemotion-0.50.1 → kinemotion-0.51.0}/uv.lock +4 -2
- kinemotion-0.50.1/.basic-memory/development/backend-granular-logging-implementation.md +0 -153
- kinemotion-0.50.1/backend/src/kinemotion_backend/services/video_processor.py +0 -53
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/feature-request-system-configuration.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.dockerignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.envrc +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.gitattributes +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.mcp.json +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.readthedocs.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.serena/project.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.tool-versions +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/.vercelignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/CLAUDE.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/Dockerfile +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/GEMINI.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/LICENSE +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/SECURITY.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/.coveragerc +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/.dockerignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/.env.example +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/Dockerfile +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app/config.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/app/main.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/database.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/models/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/models/database.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/models/storage.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/routes/database.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/routes/health.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/routes/platform.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/services/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/services/validation.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/types.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/supabase-schema.sql +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/api/core.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/api/overview.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/feature-request-system.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/feedback-system-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/testing.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/index.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/quick-start.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/docs/validation-status.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.env.example +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/index.html +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/package.json +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/FeatureRequestButton.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/FeedbackForm.css +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/FeedbackForm.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/config/links.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/index.css +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/vercel.json +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/justfile +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/local_dev.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/mkdocs.yml +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/requirements-docs.txt +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/README.md +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/project.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/sonar-project.properties +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/api.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/api.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/conftest.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.50.1 → kinemotion-0.51.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -7,12 +7,20 @@ on:
|
|
|
7
7
|
- 'backend/**'
|
|
8
8
|
- 'src/kinemotion/**'
|
|
9
9
|
- '.github/workflows/deploy-backend.yml'
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
- '!frontend/**'
|
|
11
|
+
- '!docs/**'
|
|
12
|
+
- '!*.md' # ignore markdown files
|
|
13
|
+
- '!scripts/**'
|
|
14
|
+
- '!tests/**'
|
|
15
|
+
- '!.serena/**'
|
|
16
|
+
- '!.basic-memory/**'
|
|
17
|
+
- '!.cursor/**'
|
|
18
|
+
- '!.vscode/**'
|
|
19
|
+
- '!.gitignore'
|
|
20
|
+
|
|
21
|
+
concurrency:
|
|
22
|
+
group: release-all
|
|
23
|
+
cancel-in-progress: false
|
|
16
24
|
|
|
17
25
|
env:
|
|
18
26
|
GCP_PROJECT_ID: kinemotion-backend
|
|
@@ -68,9 +76,62 @@ jobs:
|
|
|
68
76
|
cd backend
|
|
69
77
|
uv run ruff check .
|
|
70
78
|
|
|
79
|
+
release:
|
|
80
|
+
name: Create Release
|
|
81
|
+
needs: test
|
|
82
|
+
runs-on: ubuntu-latest
|
|
83
|
+
permissions:
|
|
84
|
+
contents: write
|
|
85
|
+
outputs:
|
|
86
|
+
version: ${{ steps.get_version.outputs.version }}
|
|
87
|
+
released: ${{ steps.get_version.outputs.released }}
|
|
88
|
+
steps:
|
|
89
|
+
- uses: actions/checkout@v6
|
|
90
|
+
|
|
91
|
+
- name: Set up Python
|
|
92
|
+
uses: actions/setup-python@v6
|
|
93
|
+
with:
|
|
94
|
+
python-version: '3.12'
|
|
95
|
+
|
|
96
|
+
- name: Install uv
|
|
97
|
+
run: pip install uv
|
|
98
|
+
|
|
99
|
+
- name: Install backend dependencies
|
|
100
|
+
run: |
|
|
101
|
+
cd backend
|
|
102
|
+
uv sync
|
|
103
|
+
|
|
104
|
+
- name: Create Release
|
|
105
|
+
env:
|
|
106
|
+
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
107
|
+
run: |
|
|
108
|
+
git config user.name "github-actions"
|
|
109
|
+
git config user.email "github-actions@github.com"
|
|
110
|
+
cd backend
|
|
111
|
+
uv run semantic-release version
|
|
112
|
+
|
|
113
|
+
- name: Determine version and release status
|
|
114
|
+
id: get_version
|
|
115
|
+
run: |
|
|
116
|
+
# Check if semantic-release created a new release (tagged commit)
|
|
117
|
+
if git describe --exact-match --tags HEAD 2>/dev/null; then
|
|
118
|
+
# Semantic release was created - use version from pyproject.toml
|
|
119
|
+
VERSION=$(grep '^version = ' backend/pyproject.toml | cut -d'"' -f2)
|
|
120
|
+
RELEASED="true"
|
|
121
|
+
else
|
|
122
|
+
# No semantic release - use fallback version (dev-{short_sha})
|
|
123
|
+
SHORT_SHA=$(git rev-parse --short HEAD)
|
|
124
|
+
VERSION="dev-${SHORT_SHA}"
|
|
125
|
+
RELEASED="false"
|
|
126
|
+
fi
|
|
127
|
+
|
|
128
|
+
echo "version=${VERSION}" >> $GITHUB_OUTPUT
|
|
129
|
+
echo "released=${RELEASED}" >> $GITHUB_OUTPUT
|
|
130
|
+
echo "Version: ${VERSION} (released: ${RELEASED})"
|
|
131
|
+
|
|
71
132
|
build:
|
|
72
133
|
name: Build and Push Docker Image to GCR
|
|
73
|
-
needs:
|
|
134
|
+
needs: release
|
|
74
135
|
runs-on: ubuntu-latest
|
|
75
136
|
permissions:
|
|
76
137
|
contents: read
|
|
@@ -99,7 +160,7 @@ jobs:
|
|
|
99
160
|
context: .
|
|
100
161
|
file: ./backend/Dockerfile
|
|
101
162
|
push: true
|
|
102
|
-
tags: ${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }},${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:latest
|
|
163
|
+
tags: ${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ needs.release.outputs.version }},${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:${{ github.sha }},${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:latest
|
|
103
164
|
cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:buildcache
|
|
104
165
|
cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.GCP_PROJECT_ID }}/${{ env.SERVICE_NAME }}:buildcache,mode=max
|
|
105
166
|
|
|
@@ -8,6 +8,20 @@ on:
|
|
|
8
8
|
- '.github/workflows/deploy-backend.yml'
|
|
9
9
|
- 'backend/**'
|
|
10
10
|
- 'frontend/**'
|
|
11
|
+
- '*.md' # ignore markdown files
|
|
12
|
+
- 'scripts/**'
|
|
13
|
+
- '.serena/**'
|
|
14
|
+
- '.basic-memory/**'
|
|
15
|
+
- '.cursor/**'
|
|
16
|
+
- '.vscode/**'
|
|
17
|
+
- '.gitignore'
|
|
18
|
+
- '.claude/**'
|
|
19
|
+
- '.gemini/**'
|
|
20
|
+
- '.mcp/**'
|
|
21
|
+
|
|
22
|
+
concurrency:
|
|
23
|
+
group: release-all
|
|
24
|
+
cancel-in-progress: false
|
|
11
25
|
|
|
12
26
|
jobs:
|
|
13
27
|
test:
|
|
@@ -38,7 +38,7 @@ repos:
|
|
|
38
38
|
additional_dependencies:
|
|
39
39
|
- mdformat-gfm>=0.3.5 # GitHub Flavored Markdown
|
|
40
40
|
- mdformat-tables # Table formatting
|
|
41
|
-
exclude: (^CLAUDE\.md$|^CHANGELOG\.md$|^presentation/revealjs/slides\.md$|\.claude/agents/.*\.md$|\.basic-memory/.*\.md$|\.serena/.*\.md$)
|
|
41
|
+
exclude: (^CLAUDE\.md$|^CHANGELOG\.md$|^backend/CHANGELOG\.md$|^presentation/revealjs/slides\.md$|\.claude/agents/.*\.md$|\.basic-memory/.*\.md$|\.serena/.*\.md$)
|
|
42
42
|
|
|
43
43
|
- repo: https://github.com/compilerla/conventional-pre-commit
|
|
44
44
|
rev: v4.3.0
|
|
@@ -7,15 +7,63 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
-
## v0.
|
|
10
|
+
## v0.51.0 (2025-12-13)
|
|
11
11
|
|
|
12
12
|
### Bug Fixes
|
|
13
13
|
|
|
14
|
-
-
|
|
15
|
-
([`
|
|
14
|
+
- Correct MetricsData instantiation and metrics_count calculation
|
|
15
|
+
([`e2ebca1`](https://github.com/feniix/kinemotion/commit/e2ebca1d5614faa86cdb3c4e23ef9fa034cd8d2a))
|
|
16
16
|
|
|
17
|
-
-
|
|
18
|
-
([`
|
|
17
|
+
- Correct uv.lock path in backend semantic-release build command
|
|
18
|
+
([`650c3bc`](https://github.com/feniix/kinemotion/commit/650c3bc7b1a18814f179e7f1e4835000186ee45c))
|
|
19
|
+
|
|
20
|
+
- Remove invalid search_tag_format and fix tag_format syntax
|
|
21
|
+
([`46c2a2a`](https://github.com/feniix/kinemotion/commit/46c2a2af5fa97a833256896253b300c307d3a528))
|
|
22
|
+
|
|
23
|
+
- Update error handling tests to use 'status' field instead of 'status_code'
|
|
24
|
+
([`890e54b`](https://github.com/feniix/kinemotion/commit/890e54b6ac7bead9dceb0f34fdaeb4789e3b3dbd))
|
|
25
|
+
|
|
26
|
+
- **docs**: Enhance api module docstring with examples and analysis types
|
|
27
|
+
([`94e32f1`](https://github.com/feniix/kinemotion/commit/94e32f1061505747c0345e8683a61bcf8dc60ee3))
|
|
28
|
+
|
|
29
|
+
- **docs**: Improve app.py module docstring with comprehensive feature overview
|
|
30
|
+
([`eab977c`](https://github.com/feniix/kinemotion/commit/eab977c237f2318f5dc0b94a32f4b736053bfc00))
|
|
31
|
+
|
|
32
|
+
- **docs**: Improve module docstrings in src/kinemotion and backend/src/
|
|
33
|
+
([`f59d649`](https://github.com/feniix/kinemotion/commit/f59d6494c8735fa3e83f8bdbedefce0b6c405cf5))
|
|
34
|
+
|
|
35
|
+
### Continuous Integration
|
|
36
|
+
|
|
37
|
+
- Add semantic-release configuration to backend
|
|
38
|
+
([`f8e447c`](https://github.com/feniix/kinemotion/commit/f8e447c86b03d7ad6cf9e40d67217371f642f254))
|
|
39
|
+
|
|
40
|
+
- Improve workflow configuration and add backend versioning
|
|
41
|
+
([`8d86933`](https://github.com/feniix/kinemotion/commit/8d8693398b6aec20c847ae0616488dd3b90c35af))
|
|
42
|
+
|
|
43
|
+
- Use shared concurrency group to prevent race conditions between CLI and backend release workflows
|
|
44
|
+
([`038e744`](https://github.com/feniix/kinemotion/commit/038e744ed13aa52c78557df8257995861de5308e))
|
|
45
|
+
|
|
46
|
+
### Features
|
|
47
|
+
|
|
48
|
+
- Add comprehensive granular logging for pipeline stage timing
|
|
49
|
+
([`0489222`](https://github.com/feniix/kinemotion/commit/04892221faf2cb39f355867475242b8baafa34cd))
|
|
50
|
+
|
|
51
|
+
- Implement continuous deployment with optional semantic releases
|
|
52
|
+
([`3596e47`](https://github.com/feniix/kinemotion/commit/3596e47e055dd54dda130bba9d7e78c14c4b2819))
|
|
53
|
+
|
|
54
|
+
### Refactoring
|
|
55
|
+
|
|
56
|
+
- Decouple semantic-release configs with directory-specific filtering
|
|
57
|
+
([`b7d4fef`](https://github.com/feniix/kinemotion/commit/b7d4fefcff2972d2d347dfef69a830b1f2473cfc))
|
|
58
|
+
|
|
59
|
+
- Namespace semantic-release tags and reset backend to 0.1.0
|
|
60
|
+
([`76d9c5b`](https://github.com/feniix/kinemotion/commit/76d9c5b4cedebfd56c5e5ec5272e260620520cd3))
|
|
61
|
+
|
|
62
|
+
- Restore search_tag_format for decoupled version detection
|
|
63
|
+
([`e9f163d`](https://github.com/feniix/kinemotion/commit/e9f163dd85aa81b0dce52d26339bcc858e9b6ef5))
|
|
64
|
+
|
|
65
|
+
- Separate release job in backend deployment workflow
|
|
66
|
+
([`521f03f`](https://github.com/feniix/kinemotion/commit/521f03f4d32c6bcf0b048c2fba3d54d74c7c0677))
|
|
19
67
|
|
|
20
68
|
|
|
21
69
|
## v0.50.0 (2025-12-13)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.51.0
|
|
4
4
|
Summary: Video-based kinematic analysis for athletic performance
|
|
5
5
|
Project-URL: Homepage, https://github.com/feniix/kinemotion
|
|
6
6
|
Project-URL: Repository, https://github.com/feniix/kinemotion
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
<!-- version list -->
|
|
4
|
+
|
|
5
|
+
## v0.1.1 (2025-12-13)
|
|
6
|
+
|
|
7
|
+
### Bug Fixes
|
|
8
|
+
|
|
9
|
+
- **docs**: Enhance api module docstring with examples and analysis types
|
|
10
|
+
([`94e32f1`](https://github.com/feniix/kinemotion/commit/94e32f1061505747c0345e8683a61bcf8dc60ee3))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
## v0.1.0 (2025-12-13)
|
|
14
|
+
|
|
15
|
+
- Initial Release
|
|
16
|
+
|
|
17
|
+
## v0.1.0 (2025-12-13)
|
|
18
|
+
|
|
19
|
+
- Initial Release
|
|
20
|
+
|
|
21
|
+
## v0.52.0 (2025-12-13)
|
|
22
|
+
|
|
23
|
+
### Features
|
|
24
|
+
|
|
25
|
+
- Implement continuous deployment with optional semantic releases
|
|
26
|
+
([`3596e47`](https://github.com/feniix/kinemotion/commit/3596e47e055dd54dda130bba9d7e78c14c4b2819))
|
|
27
|
+
|
|
28
|
+
### Refactoring
|
|
29
|
+
|
|
30
|
+
- Decouple semantic-release configs with directory-specific filtering
|
|
31
|
+
([`b7d4fef`](https://github.com/feniix/kinemotion/commit/b7d4fefcff2972d2d347dfef69a830b1f2473cfc))
|
|
32
|
+
|
|
33
|
+
- Separate release job in backend deployment workflow
|
|
34
|
+
([`521f03f`](https://github.com/feniix/kinemotion/commit/521f03f4d32c6bcf0b048c2fba3d54d74c7c0677))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
## v0.51.0 (2025-12-13)
|
|
38
|
+
|
|
39
|
+
### Bug Fixes
|
|
40
|
+
|
|
41
|
+
- Correct MetricsData instantiation and metrics_count calculation
|
|
42
|
+
([`e2ebca1`](https://github.com/feniix/kinemotion/commit/e2ebca1d5614faa86cdb3c4e23ef9fa034cd8d2a))
|
|
43
|
+
|
|
44
|
+
- Update error handling tests to use status field instead of status_code
|
|
45
|
+
([`890e54b`](https://github.com/feniix/kinemotion/commit/890e54b6ac7bead9dceb0f34fdaeb4789e3b3dbd))
|
|
46
|
+
|
|
47
|
+
### Continuous Integration
|
|
48
|
+
|
|
49
|
+
- Add semantic-release configuration to backend
|
|
50
|
+
([`f8e447c`](https://github.com/feniix/kinemotion/commit/f8e447c86b03d7ad6cf9e40d67217371f642f254))
|
|
51
|
+
|
|
52
|
+
- Improve workflow configuration and add backend versioning
|
|
53
|
+
([`8d86933`](https://github.com/feniix/kinemotion/commit/8d8693398b6aec20c847ae0616488dd3b90c35af))
|
|
54
|
+
|
|
55
|
+
### Features
|
|
56
|
+
|
|
57
|
+
- Add comprehensive granular logging for pipeline stage timing
|
|
58
|
+
([`0489222`](https://github.com/feniix/kinemotion/commit/04892221faf2cb39f355867475242b8baafa34cd))
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "kinemotion-backend"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.1"
|
|
4
4
|
description = "FastAPI backend for Kinemotion video analysis"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.10,<3.13"
|
|
@@ -59,6 +59,7 @@ dev = [
|
|
|
59
59
|
"httpx>=0.26.0",
|
|
60
60
|
"ruff>=0.1.8",
|
|
61
61
|
"pyright>=1.1.380",
|
|
62
|
+
"python-semantic-release>=9.8.2",
|
|
62
63
|
]
|
|
63
64
|
|
|
64
65
|
[tool.pytest.ini_options]
|
|
@@ -153,3 +154,32 @@ reportUnusedClass = "warning"
|
|
|
153
154
|
reportUnusedFunction = "warning"
|
|
154
155
|
reportUnusedVariable = "warning"
|
|
155
156
|
reportDuplicateImport = "warning"
|
|
157
|
+
|
|
158
|
+
[tool.semantic_release]
|
|
159
|
+
version_toml = ["pyproject.toml:project.version"]
|
|
160
|
+
branch = "main"
|
|
161
|
+
changelog_file = "CHANGELOG.md"
|
|
162
|
+
tag_format = "kinemotion-backend-v{version}"
|
|
163
|
+
build_command = """\
|
|
164
|
+
uv lock --upgrade-package "$PACKAGE_NAME"
|
|
165
|
+
git add ../uv.lock
|
|
166
|
+
uv build
|
|
167
|
+
"""
|
|
168
|
+
dist_path = "dist/"
|
|
169
|
+
upload_to_vcs_release = true
|
|
170
|
+
remove_dist = false
|
|
171
|
+
patch_without_tag = false
|
|
172
|
+
major_on_zero = false
|
|
173
|
+
allow_zero_version = true
|
|
174
|
+
commit_message = "chore(release): {version} [skip ci]"
|
|
175
|
+
|
|
176
|
+
[tool.semantic_release.commit_parser_options]
|
|
177
|
+
allowed_tags = ["feat", "fix", "docs", "style", "refactor", "perf", "test", "chore", "build", "ci"]
|
|
178
|
+
minor_tags = ["feat"]
|
|
179
|
+
patch_tags = ["fix", "perf"]
|
|
180
|
+
|
|
181
|
+
[tool.semantic_release.publish]
|
|
182
|
+
# Only process commits affecting backend/src/kinemotion_backend/ for backend releases
|
|
183
|
+
# Tests (backend/tests/) are excluded since they are not part of the public API
|
|
184
|
+
# This decouples backend versioning from root CLI versioning
|
|
185
|
+
directories = ["backend/src/kinemotion_backend"]
|
|
@@ -1,4 +1,22 @@
|
|
|
1
|
-
"""API endpoints for analysis sessions and coach feedback.
|
|
1
|
+
"""API endpoints for analysis sessions and coach feedback.
|
|
2
|
+
|
|
3
|
+
This module provides FastAPI endpoints for managing video analysis sessions and
|
|
4
|
+
coach feedback. Key responsibilities:
|
|
5
|
+
|
|
6
|
+
- Create and retrieve analysis sessions for uploaded videos
|
|
7
|
+
- Process video analysis requests through the kinemotion engine
|
|
8
|
+
- Store and retrieve coach feedback linked to analysis sessions
|
|
9
|
+
- Handle authentication via Supabase JWT tokens
|
|
10
|
+
- Manage session state and error handling
|
|
11
|
+
|
|
12
|
+
Endpoints:
|
|
13
|
+
POST /api/analysis/sessions - Create a new analysis session
|
|
14
|
+
GET /api/analysis/sessions/{session_id} - Retrieve session details
|
|
15
|
+
POST /api/analysis/sessions/{session_id}/feedback - Add coach feedback
|
|
16
|
+
GET /api/analysis/sessions/{session_id}/feedback - Retrieve feedback
|
|
17
|
+
|
|
18
|
+
All endpoints require JWT authentication via Authorization header.
|
|
19
|
+
"""
|
|
2
20
|
|
|
3
21
|
from typing import Any
|
|
4
22
|
|
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
"""FastAPI application for Kinemotion video analysis backend.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This module provides a REST API for analyzing jump mechanics from video files.
|
|
4
|
+
It handles video uploads, processes them through the kinemotion analysis engine
|
|
5
|
+
(drop jump and counter-movement jump analysis), stores results in Supabase, and
|
|
6
|
+
manages video/result artifacts in Cloudflare R2 storage.
|
|
7
|
+
|
|
8
|
+
Key features:
|
|
9
|
+
- Video upload and processing for multiple jump types
|
|
10
|
+
- Integration with MediaPipe pose tracking
|
|
11
|
+
- Metrics calculation (RSI, flight time, jump height, etc.)
|
|
12
|
+
- Result persistence in Supabase database
|
|
13
|
+
- Artifact management in Cloudflare R2 storage
|
|
14
|
+
- Rate limiting and request logging middleware
|
|
15
|
+
- CORS support for frontend integration
|
|
4
16
|
"""
|
|
5
17
|
|
|
6
18
|
import os
|
|
@@ -78,7 +90,7 @@ class AnalysisResponse:
|
|
|
78
90
|
def to_dict(self) -> dict[str, Any]:
|
|
79
91
|
"""Convert response to JSON-serializable dictionary."""
|
|
80
92
|
result: dict[str, Any] = {
|
|
81
|
-
"
|
|
93
|
+
"status": self.status_code,
|
|
82
94
|
"message": self.message,
|
|
83
95
|
"processing_time_s": self.processing_time_s,
|
|
84
96
|
}
|
|
@@ -1145,7 +1157,7 @@ async def http_exception_handler(request: Any, exc: HTTPException) -> JSONRespon
|
|
|
1145
1157
|
return JSONResponse(
|
|
1146
1158
|
status_code=exc.status_code,
|
|
1147
1159
|
content={
|
|
1148
|
-
"
|
|
1160
|
+
"status": exc.status_code,
|
|
1149
1161
|
"message": "HTTP Error",
|
|
1150
1162
|
"error": exc.detail,
|
|
1151
1163
|
},
|
|
@@ -1165,7 +1177,7 @@ async def general_exception_handler(request: Any, exc: Exception) -> JSONRespons
|
|
|
1165
1177
|
return JSONResponse(
|
|
1166
1178
|
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
|
|
1167
1179
|
content={
|
|
1168
|
-
"
|
|
1180
|
+
"status": 500,
|
|
1169
1181
|
"message": "Internal server error",
|
|
1170
1182
|
"error": error_detail,
|
|
1171
1183
|
},
|
|
@@ -37,7 +37,7 @@ class MetricsData(BaseModel):
|
|
|
37
37
|
class AnalysisResponse(BaseModel):
|
|
38
38
|
"""Response structure for video analysis results."""
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
status: int = Field(..., description="HTTP status code")
|
|
41
41
|
message: str = Field(..., description="Response message")
|
|
42
42
|
metrics: MetricsData | None = Field(None, description="Analysis metrics")
|
|
43
43
|
results_url: str | None = Field(None, description="URL to analysis results")
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"""Video analysis routes for kinemotion backend."""
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
|
|
3
|
+
import structlog
|
|
5
4
|
from fastapi import APIRouter, File, Form, Header, Request, UploadFile
|
|
6
5
|
from fastapi.responses import JSONResponse
|
|
7
6
|
|
|
@@ -13,12 +12,11 @@ except ImportError:
|
|
|
13
12
|
fastapi_limiter_available = False
|
|
14
13
|
RateLimiter = None # type: ignore[assignment]
|
|
15
14
|
|
|
16
|
-
from ..logging_config import get_logger
|
|
17
15
|
from ..models.responses import AnalysisResponse
|
|
18
16
|
from ..services import AnalysisService, validate_referer
|
|
19
17
|
from ..utils import NoOpLimiter
|
|
20
18
|
|
|
21
|
-
logger = get_logger(
|
|
19
|
+
logger = structlog.get_logger()
|
|
22
20
|
router = APIRouter(prefix="/api", tags=["Analysis"])
|
|
23
21
|
|
|
24
22
|
# Rate limiting (use NoOpLimiter for testing or when fastapi_limiter unavailable)
|
|
@@ -58,6 +56,8 @@ async def analyze_video(
|
|
|
58
56
|
Raises:
|
|
59
57
|
HTTPException: If validation or processing fails
|
|
60
58
|
"""
|
|
59
|
+
import time
|
|
60
|
+
|
|
61
61
|
start_time = time.time()
|
|
62
62
|
|
|
63
63
|
# Validate referer (prevent direct API access)
|
|
@@ -70,12 +70,12 @@ async def analyze_video(
|
|
|
70
70
|
# Convert debug string to boolean
|
|
71
71
|
enable_debug = debug.lower() == "true"
|
|
72
72
|
|
|
73
|
-
# Log analysis start
|
|
74
73
|
logger.info(
|
|
75
|
-
"
|
|
74
|
+
"analyze_endpoint_processing",
|
|
76
75
|
jump_type=jump_type,
|
|
77
76
|
quality=quality,
|
|
78
77
|
debug=enable_debug,
|
|
78
|
+
filename=file.filename,
|
|
79
79
|
)
|
|
80
80
|
|
|
81
81
|
# Perform analysis using service layer
|
|
@@ -87,12 +87,13 @@ async def analyze_video(
|
|
|
87
87
|
user_id=None, # TODO: Extract from auth when available
|
|
88
88
|
)
|
|
89
89
|
|
|
90
|
-
# Log
|
|
91
|
-
|
|
90
|
+
# Log successful response
|
|
91
|
+
elapsed = time.time() - start_time
|
|
92
92
|
logger.info(
|
|
93
|
-
"
|
|
94
|
-
|
|
95
|
-
|
|
93
|
+
"analyze_endpoint_success",
|
|
94
|
+
status_code=result.status,
|
|
95
|
+
processing_time_s=round(elapsed, 2),
|
|
96
|
+
has_metrics=result.metrics is not None,
|
|
96
97
|
)
|
|
97
98
|
|
|
98
99
|
# Return JSON response
|
|
@@ -109,7 +110,7 @@ async def analyze_video(
|
|
|
109
110
|
|
|
110
111
|
# Return validation error
|
|
111
112
|
error_result = AnalysisResponse(
|
|
112
|
-
|
|
113
|
+
status=422,
|
|
113
114
|
message=str(e),
|
|
114
115
|
error="validation_error",
|
|
115
116
|
metrics=None,
|
|
@@ -137,7 +138,7 @@ async def analyze_video(
|
|
|
137
138
|
|
|
138
139
|
# Return generic server error
|
|
139
140
|
error_result = AnalysisResponse(
|
|
140
|
-
|
|
141
|
+
status=500,
|
|
141
142
|
message="Internal server error during analysis",
|
|
142
143
|
error=str(e),
|
|
143
144
|
metrics=None,
|
{kinemotion-0.50.1 → kinemotion-0.51.0}/backend/src/kinemotion_backend/services/analysis_service.py
RENAMED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import time
|
|
2
2
|
from pathlib import Path
|
|
3
3
|
|
|
4
|
+
import structlog
|
|
4
5
|
from fastapi import UploadFile
|
|
5
6
|
|
|
6
|
-
from ..logging_config import get_logger
|
|
7
7
|
from ..models.responses import AnalysisResponse, MetricsData
|
|
8
8
|
from .storage_service import StorageService
|
|
9
9
|
from .validation import validate_jump_type, validate_video_file
|
|
10
10
|
from .video_processor import VideoProcessorService
|
|
11
11
|
|
|
12
|
-
logger = get_logger(__name__)
|
|
12
|
+
logger = structlog.get_logger(__name__)
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class AnalysisService:
|
|
@@ -49,43 +49,37 @@ class AnalysisService:
|
|
|
49
49
|
temp_path: str | None = None
|
|
50
50
|
temp_debug_video_path: str | None = None
|
|
51
51
|
|
|
52
|
-
#
|
|
53
|
-
logger.info("validating_video_file")
|
|
54
|
-
validation_start = time.time()
|
|
55
|
-
validate_video_file(file)
|
|
56
|
-
validation_duration_ms = (time.time() - validation_start) * 1000
|
|
52
|
+
# Log analysis start
|
|
57
53
|
logger.info(
|
|
58
|
-
"
|
|
59
|
-
|
|
54
|
+
"video_analysis_started",
|
|
55
|
+
jump_type=jump_type,
|
|
56
|
+
quality=quality,
|
|
57
|
+
debug_overlay=debug,
|
|
58
|
+
file_name=file.filename,
|
|
60
59
|
)
|
|
61
60
|
|
|
61
|
+
# Validate inputs (let ValueError propagate to route handler)
|
|
62
|
+
logger.info("validating_video_file", filename=file.filename)
|
|
63
|
+
validate_video_file(file)
|
|
64
|
+
|
|
62
65
|
logger.info("validating_jump_type", jump_type=jump_type)
|
|
63
|
-
jump_type_start = time.time()
|
|
64
66
|
normalized_jump_type = validate_jump_type(jump_type)
|
|
65
|
-
|
|
67
|
+
|
|
66
68
|
logger.info(
|
|
67
|
-
"
|
|
69
|
+
"validation_complete",
|
|
68
70
|
normalized_jump_type=normalized_jump_type,
|
|
69
|
-
duration_ms=round(jump_type_duration_ms, 1),
|
|
70
71
|
)
|
|
71
72
|
|
|
72
73
|
try:
|
|
73
74
|
# Generate unique storage key
|
|
74
|
-
logger.info("generating_storage_key",
|
|
75
|
-
key_start = time.time()
|
|
75
|
+
logger.info("generating_storage_key", original_filename=file.filename)
|
|
76
76
|
storage_key = await self.storage_service.generate_unique_key(
|
|
77
77
|
file.filename or "video.mp4", user_id
|
|
78
78
|
)
|
|
79
|
-
|
|
80
|
-
logger.info(
|
|
81
|
-
"generating_storage_key_completed",
|
|
82
|
-
storage_key=storage_key,
|
|
83
|
-
duration_ms=round(key_duration_ms, 1),
|
|
84
|
-
)
|
|
79
|
+
logger.info("storage_key_generated", storage_key=storage_key)
|
|
85
80
|
|
|
86
81
|
# Save uploaded file to temporary location
|
|
87
|
-
logger.info("saving_uploaded_file",
|
|
88
|
-
save_start = time.time()
|
|
82
|
+
logger.info("saving_uploaded_file", storage_key=storage_key)
|
|
89
83
|
temp_path = self.storage_service.get_temp_file_path(Path(storage_key).name)
|
|
90
84
|
assert temp_path is not None
|
|
91
85
|
|
|
@@ -95,12 +89,12 @@ class AnalysisService:
|
|
|
95
89
|
if len(content) > 500 * 1024 * 1024:
|
|
96
90
|
raise ValueError("File size exceeds maximum of 500MB")
|
|
97
91
|
temp_file.write(content)
|
|
98
|
-
|
|
92
|
+
|
|
99
93
|
file_size_mb = len(content) / (1024 * 1024)
|
|
100
94
|
logger.info(
|
|
101
|
-
"
|
|
95
|
+
"uploaded_file_saved",
|
|
96
|
+
temp_path=temp_path,
|
|
102
97
|
file_size_mb=round(file_size_mb, 2),
|
|
103
|
-
duration_ms=round(save_duration_ms, 1),
|
|
104
98
|
)
|
|
105
99
|
|
|
106
100
|
# Create temporary debug video path if debug is enabled
|
|
@@ -191,7 +185,7 @@ class AnalysisService:
|
|
|
191
185
|
# Log response serialization timing
|
|
192
186
|
serialization_start = time.time()
|
|
193
187
|
response_data = AnalysisResponse(
|
|
194
|
-
|
|
188
|
+
status=200,
|
|
195
189
|
message="Analysis completed successfully",
|
|
196
190
|
metrics=MetricsData(**metrics),
|
|
197
191
|
results_url=results_url,
|
|
@@ -256,7 +250,7 @@ class AnalysisService:
|
|
|
256
250
|
Path(temp_debug_video_path).unlink(missing_ok=True)
|
|
257
251
|
|
|
258
252
|
return AnalysisResponse(
|
|
259
|
-
|
|
253
|
+
status=500,
|
|
260
254
|
message=f"Analysis failed: {str(e)}",
|
|
261
255
|
error=str(e),
|
|
262
256
|
metrics=None,
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
from typing import Any, cast
|
|
2
|
+
|
|
3
|
+
import structlog
|
|
4
|
+
from kinemotion import process_cmj_video, process_dropjump_video
|
|
5
|
+
from kinemotion.core.pose import PoseTracker
|
|
6
|
+
from kinemotion.core.timing import Timer
|
|
7
|
+
|
|
8
|
+
logger = structlog.get_logger(__name__)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class VideoProcessorService:
|
|
12
|
+
"""Service for processing video files and extracting kinematic metrics."""
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
async def process_video_async(
|
|
16
|
+
video_path: str,
|
|
17
|
+
jump_type: str,
|
|
18
|
+
quality: str = "balanced",
|
|
19
|
+
output_video: str | None = None,
|
|
20
|
+
timer: Timer | None = None,
|
|
21
|
+
pose_tracker: PoseTracker | None = None,
|
|
22
|
+
) -> dict[str, Any]:
|
|
23
|
+
"""Process video and return metrics.
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
video_path: Path to video file
|
|
27
|
+
jump_type: Type of jump analysis
|
|
28
|
+
quality: Analysis quality preset
|
|
29
|
+
output_video: Optional path for debug video output
|
|
30
|
+
timer: Optional Timer for measuring operations
|
|
31
|
+
pose_tracker: Optional shared PoseTracker instance
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Dictionary with metrics
|
|
35
|
+
|
|
36
|
+
Raises:
|
|
37
|
+
ValueError: If video processing fails
|
|
38
|
+
"""
|
|
39
|
+
logger.info(
|
|
40
|
+
"video_processor_starting",
|
|
41
|
+
jump_type=jump_type,
|
|
42
|
+
quality=quality,
|
|
43
|
+
video_path=video_path,
|
|
44
|
+
has_debug_output=output_video is not None,
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
if jump_type == "drop_jump":
|
|
49
|
+
logger.info("processing_drop_jump_video")
|
|
50
|
+
metrics = process_dropjump_video(
|
|
51
|
+
video_path,
|
|
52
|
+
quality=quality,
|
|
53
|
+
output_video=output_video,
|
|
54
|
+
timer=timer,
|
|
55
|
+
pose_tracker=pose_tracker,
|
|
56
|
+
)
|
|
57
|
+
else: # cmj
|
|
58
|
+
logger.info("processing_cmj_video")
|
|
59
|
+
metrics = process_cmj_video(
|
|
60
|
+
video_path,
|
|
61
|
+
quality=quality,
|
|
62
|
+
output_video=output_video,
|
|
63
|
+
timer=timer,
|
|
64
|
+
pose_tracker=pose_tracker,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
logger.info(
|
|
68
|
+
"video_processor_completed",
|
|
69
|
+
jump_type=jump_type,
|
|
70
|
+
metrics_extracted=True,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return cast(dict[str, Any], metrics.to_dict())
|
|
74
|
+
except Exception as e:
|
|
75
|
+
logger.error(
|
|
76
|
+
"video_processor_failed",
|
|
77
|
+
jump_type=jump_type,
|
|
78
|
+
error=str(e),
|
|
79
|
+
error_type=type(e).__name__,
|
|
80
|
+
exc_info=True,
|
|
81
|
+
)
|
|
82
|
+
raise
|