kinemotion 0.43.0__tar.gz → 0.45.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.
- {kinemotion-0.43.0 → kinemotion-0.45.0}/CHANGELOG.md +32 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/PKG-INFO +1 -1
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/src/kinemotion_backend/logging_config.py +0 -1
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/package.json +10 -2
- kinemotion-0.45.0/frontend/src/App.test.tsx +206 -0
- kinemotion-0.45.0/frontend/src/components/ResultsDisplay.test.tsx +195 -0
- kinemotion-0.45.0/frontend/src/components/ResultsDisplay.tsx +332 -0
- kinemotion-0.45.0/frontend/src/components/UploadForm.test.tsx +244 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/UploadForm.tsx +68 -70
- kinemotion-0.45.0/frontend/src/hooks/useAnalysis.test.ts +241 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/index.css +419 -178
- kinemotion-0.45.0/frontend/src/test/setup.ts +1 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/types/api.ts +5 -1
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/vite.config.ts +6 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/yarn.lock +906 -9
- {kinemotion-0.43.0 → kinemotion-0.45.0}/pyproject.toml +1 -1
- {kinemotion-0.43.0 → kinemotion-0.45.0}/sonar-project.properties +1 -1
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/api.py +113 -604
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/cli.py +12 -37
- kinemotion-0.45.0/src/kinemotion/core/cli_utils.py +60 -0
- kinemotion-0.45.0/src/kinemotion/core/pipeline_utils.py +429 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/cli.py +11 -22
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/test_api.py +12 -10
- kinemotion-0.45.0/tests/cmj/test_cli.py +13 -0
- kinemotion-0.45.0/tests/core/test_cli_utils.py +88 -0
- kinemotion-0.45.0/tests/core/test_pipeline_utils.py +250 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_api.py +12 -10
- kinemotion-0.45.0/tests/dropjump/test_cli.py +13 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/uv.lock +1 -1
- kinemotion-0.43.0/frontend/src/components/ResultsDisplay.tsx +0 -237
- kinemotion-0.43.0/src/kinemotion/core/cli_utils.py +0 -240
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.dockerignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.envrc +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.gitattributes +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/workflows/deploy-backend.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.mcp.json +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.readthedocs.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.serena/project.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.tool-versions +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/.vercelignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/CLAUDE.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/Dockerfile +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/GEMINI.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/LICENSE +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/SECURITY.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/.dockerignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/.env.example +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/Dockerfile +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/src/kinemotion_backend/app.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/api/core.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/api/overview.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/testing.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/index.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/quick-start.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/docs/validation-status.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.env.example +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/index.html +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/lib/supabase.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/frontend/vercel.json +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/justfile +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/local_dev.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/mkdocs.yml +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/requirements-docs.txt +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/README.md +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/project.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/conftest.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.43.0 → kinemotion-0.45.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## v0.45.0 (2025-12-11)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- **frontend**: Align Quality Check with Key Performance Indicators
|
|
15
|
+
([`b071025`](https://github.com/feniix/kinemotion/commit/b0710259c25f501473b9bda3d5f22258a4bb2bb8))
|
|
16
|
+
|
|
17
|
+
- **frontend**: Exclude test files from tsconfig.json
|
|
18
|
+
([`493a2ef`](https://github.com/feniix/kinemotion/commit/493a2efb36113717ef1c1e94e7f10e53a5be1366))
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
- **frontend**: Implement comprehensive testing suite and UI refactoring
|
|
23
|
+
([`6dce4c6`](https://github.com/feniix/kinemotion/commit/6dce4c619a73c6594944d713e493e94a1abcb965))
|
|
24
|
+
|
|
25
|
+
- **frontend**: Improve validation banner display and fix type error
|
|
26
|
+
([`d9be44d`](https://github.com/feniix/kinemotion/commit/d9be44d0c7100c9de055311556f1bf58f0733fa5))
|
|
27
|
+
|
|
28
|
+
### Testing
|
|
29
|
+
|
|
30
|
+
- Update sonar project version
|
|
31
|
+
([`7f132ea`](https://github.com/feniix/kinemotion/commit/7f132ea20935e9d74303a7e8ad348577cd6c40a0))
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## v0.44.0 (2025-12-11)
|
|
35
|
+
|
|
36
|
+
### Features
|
|
37
|
+
|
|
38
|
+
- Optimize debug video generation and fix logging warning
|
|
39
|
+
([`619ccd5`](https://github.com/feniix/kinemotion/commit/619ccd53a4013457033749481cf6792f44529d93))
|
|
40
|
+
|
|
41
|
+
|
|
10
42
|
## v0.43.0 (2025-12-11)
|
|
11
43
|
|
|
12
44
|
### Continuous Integration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.45.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
|
|
@@ -64,7 +64,6 @@ def setup_logging(*, json_logs: bool = False, log_level: str = "INFO") -> None:
|
|
|
64
64
|
structlog.configure(
|
|
65
65
|
processors=shared_processors
|
|
66
66
|
+ [
|
|
67
|
-
structlog.processors.ExceptionRenderer(),
|
|
68
67
|
structlog.dev.ConsoleRenderer(colors=True),
|
|
69
68
|
],
|
|
70
69
|
wrapper_class=structlog.stdlib.BoundLogger,
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
"dev": "vite",
|
|
9
9
|
"build": "tsc && vite build",
|
|
10
10
|
"preview": "vite preview",
|
|
11
|
-
"type-check": "tsc --noEmit"
|
|
11
|
+
"type-check": "tsc --noEmit",
|
|
12
|
+
"test": "vitest",
|
|
13
|
+
"test:ci": "vitest run"
|
|
12
14
|
},
|
|
13
15
|
"dependencies": {
|
|
14
16
|
"@supabase/supabase-js": "^2.86.0",
|
|
@@ -16,12 +18,18 @@
|
|
|
16
18
|
"react-dom": "^19.2.0"
|
|
17
19
|
},
|
|
18
20
|
"devDependencies": {
|
|
21
|
+
"@testing-library/dom": "^10.4.1",
|
|
22
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
23
|
+
"@testing-library/react": "^16.3.0",
|
|
24
|
+
"@types/jsdom": "^27",
|
|
19
25
|
"@types/node": "^20.12.0",
|
|
20
26
|
"@types/react": "^19.0.1",
|
|
21
27
|
"@types/react-dom": "^19.0.1",
|
|
22
28
|
"@vitejs/plugin-react": "^5.0.2",
|
|
29
|
+
"jsdom": "^27.3.0",
|
|
23
30
|
"terser": "^5.31.0",
|
|
24
31
|
"typescript": "^5.9.3",
|
|
25
|
-
"vite": "^7.2.4"
|
|
32
|
+
"vite": "^7.2.4",
|
|
33
|
+
"vitest": "^4.0.15"
|
|
26
34
|
}
|
|
27
35
|
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { render, screen, fireEvent, waitFor } from '@testing-library/react';
|
|
2
|
+
import '@testing-library/jest-dom';
|
|
3
|
+
import App from './App';
|
|
4
|
+
import { useAuth } from './hooks/useAuth';
|
|
5
|
+
import { useAnalysis } from './hooks/useAnalysis';
|
|
6
|
+
import { useRecentUploads } from './hooks/useRecentUploads';
|
|
7
|
+
import { useBackendVersion } from './hooks/useBackendVersion';
|
|
8
|
+
|
|
9
|
+
// Mock the custom hooks
|
|
10
|
+
vi.mock('./hooks/useAuth');
|
|
11
|
+
vi.mock('./hooks/useAnalysis');
|
|
12
|
+
vi.mock('./hooks/useRecentUploads');
|
|
13
|
+
vi.mock('./hooks/useBackendVersion');
|
|
14
|
+
|
|
15
|
+
describe('App Integration', () => {
|
|
16
|
+
// Setup default mock return values
|
|
17
|
+
const mockAnalyze = vi.fn();
|
|
18
|
+
const mockRetry = vi.fn();
|
|
19
|
+
const mockSignOut = vi.fn();
|
|
20
|
+
const mockAddRecentUpload = vi.fn();
|
|
21
|
+
const mockClearRecentUploads = vi.fn();
|
|
22
|
+
const mockSetFile = vi.fn();
|
|
23
|
+
const mockSetJumpType = vi.fn();
|
|
24
|
+
const mockSetEnableDebug = vi.fn();
|
|
25
|
+
|
|
26
|
+
beforeEach(() => {
|
|
27
|
+
vi.clearAllMocks();
|
|
28
|
+
|
|
29
|
+
// Default: Authenticated, no file, no analysis
|
|
30
|
+
(useAuth as any).mockReturnValue({
|
|
31
|
+
user: { email: 'test@example.com' },
|
|
32
|
+
loading: false,
|
|
33
|
+
signOut: mockSignOut,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
(useAnalysis as any).mockReturnValue({
|
|
37
|
+
file: null,
|
|
38
|
+
jumpType: 'cmj',
|
|
39
|
+
loading: false,
|
|
40
|
+
uploadProgress: 0,
|
|
41
|
+
metrics: null,
|
|
42
|
+
error: null,
|
|
43
|
+
enableDebug: false,
|
|
44
|
+
setFile: mockSetFile,
|
|
45
|
+
setJumpType: mockSetJumpType,
|
|
46
|
+
setEnableDebug: mockSetEnableDebug,
|
|
47
|
+
analyze: mockAnalyze,
|
|
48
|
+
retry: mockRetry,
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
(useRecentUploads as any).mockReturnValue({
|
|
52
|
+
recentUploads: [],
|
|
53
|
+
addRecentUpload: mockAddRecentUpload,
|
|
54
|
+
clearRecentUploads: mockClearRecentUploads,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
(useBackendVersion as any).mockReturnValue({
|
|
58
|
+
backendVersion: '1.0.0',
|
|
59
|
+
kinemotionVersion: '1.0.0',
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it('renders loading spinner when checking auth', () => {
|
|
64
|
+
(useAuth as any).mockReturnValue({
|
|
65
|
+
user: null,
|
|
66
|
+
loading: true,
|
|
67
|
+
signOut: mockSignOut,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
render(<App />);
|
|
71
|
+
// LoadingSpinner component usually has "Loading..." or we can find by class if needed
|
|
72
|
+
// In App.tsx: <LoadingSpinner uploadProgress={0} />
|
|
73
|
+
// Assuming LoadingSpinner renders text or we can just check if App structure is not fully there
|
|
74
|
+
// For now, let's assume LoadingSpinner renders something identifiable or check absence of header
|
|
75
|
+
expect(screen.queryByText('Kinemotion')).not.toBeInTheDocument();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('renders Auth component when not logged in', () => {
|
|
79
|
+
(useAuth as any).mockReturnValue({
|
|
80
|
+
user: null,
|
|
81
|
+
loading: false,
|
|
82
|
+
signOut: mockSignOut,
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
render(<App />);
|
|
86
|
+
// Auth component likely has "Sign In" or similar
|
|
87
|
+
// Since we didn't mock Auth component explicitly, it renders the real one.
|
|
88
|
+
// Let's assume Auth component has a distinctive text.
|
|
89
|
+
// If Auth is complex, we might mock it, but integration tests usually like real components.
|
|
90
|
+
// However, for this high-level test, let's just check that main App content is missing.
|
|
91
|
+
expect(screen.queryByText('Sign Out')).not.toBeInTheDocument();
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
it('renders UploadForm when logged in and no results', () => {
|
|
95
|
+
render(<App />);
|
|
96
|
+
|
|
97
|
+
// Header should be present
|
|
98
|
+
expect(screen.getByText('Kinemotion')).toBeInTheDocument();
|
|
99
|
+
expect(screen.getByText('test@example.com')).toBeInTheDocument();
|
|
100
|
+
|
|
101
|
+
// UploadForm content should be present
|
|
102
|
+
expect(screen.getByText(/Drag analysis video here/i)).toBeInTheDocument();
|
|
103
|
+
|
|
104
|
+
// Footer should be present
|
|
105
|
+
expect(screen.getByText(/Backend v1.0.0/i)).toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('renders LoadingSpinner and Skeleton when analyzing', () => {
|
|
109
|
+
(useAnalysis as any).mockReturnValue({
|
|
110
|
+
...useAnalysis(), // Get default mock values
|
|
111
|
+
loading: true,
|
|
112
|
+
uploadProgress: 50,
|
|
113
|
+
file: new File([''], 'video.mp4'),
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
render(<App />);
|
|
117
|
+
|
|
118
|
+
// LoadingSpinner should be present (UploadForm is also present in App.tsx structure)
|
|
119
|
+
// We need to check for LoadingSpinner specifically.
|
|
120
|
+
// Assuming LoadingSpinner displays progress
|
|
121
|
+
expect(screen.getByText(/50%/)).toBeInTheDocument();
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it('renders ResultsSkeleton when processing (upload > 100%)', () => {
|
|
125
|
+
(useAnalysis as any).mockReturnValue({
|
|
126
|
+
...useAnalysis(),
|
|
127
|
+
loading: true,
|
|
128
|
+
uploadProgress: 100,
|
|
129
|
+
file: new File([''], 'video.mp4'),
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
render(<App />);
|
|
133
|
+
// ResultsSkeleton should be present. It usually has "Processing Video..." text or similar.
|
|
134
|
+
// If not, we can rely on implementation details or mock the component.
|
|
135
|
+
// Let's assume ResultsSkeleton renders a specific class or ID, or we can check logic coverage.
|
|
136
|
+
// In App.tsx: {loading && uploadProgress >= 100 && <ResultsSkeleton />}
|
|
137
|
+
// Let's just check if it renders without crashing for now, or assume it has distinctive text.
|
|
138
|
+
// A safe bet for integration if we don't know the exact child text is checking if ResultsDisplay is NOT there.
|
|
139
|
+
expect(screen.queryByText('Analysis Results')).not.toBeInTheDocument();
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('renders ResultsDisplay when analysis is complete', () => {
|
|
143
|
+
(useAnalysis as any).mockReturnValue({
|
|
144
|
+
...useAnalysis(),
|
|
145
|
+
metrics: {
|
|
146
|
+
status: 200,
|
|
147
|
+
message: 'Success',
|
|
148
|
+
metrics: { data: { jump_height_m: 0.5 } }
|
|
149
|
+
},
|
|
150
|
+
loading: false,
|
|
151
|
+
file: new File([''], 'video.mp4'),
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
render(<App />);
|
|
155
|
+
|
|
156
|
+
// ResultsDisplay header
|
|
157
|
+
expect(screen.getByText('Analysis Results')).toBeInTheDocument();
|
|
158
|
+
// Specific metric from our mock
|
|
159
|
+
expect(screen.getByText('Jump Height')).toBeInTheDocument();
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('renders ErrorDisplay when there is an error', () => {
|
|
163
|
+
const errorMessage = 'Failed to analyze video';
|
|
164
|
+
(useAnalysis as any).mockReturnValue({
|
|
165
|
+
...useAnalysis(),
|
|
166
|
+
error: errorMessage,
|
|
167
|
+
loading: false,
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
render(<App />);
|
|
171
|
+
|
|
172
|
+
// Check that the error message is displayed (might appear multiple times)
|
|
173
|
+
const errorMessages = screen.getAllByText(errorMessage);
|
|
174
|
+
expect(errorMessages.length).toBeGreaterThan(0);
|
|
175
|
+
expect(errorMessages[0]).toBeInTheDocument();
|
|
176
|
+
|
|
177
|
+
// Test retry button
|
|
178
|
+
const retryBtn = screen.getByRole('button', { name: /Try Again/i });
|
|
179
|
+
fireEvent.click(retryBtn);
|
|
180
|
+
expect(mockRetry).toHaveBeenCalled();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('triggers analyze and adds to recent uploads on form submit', async () => {
|
|
184
|
+
const file = new File([''], 'jump.mp4');
|
|
185
|
+
(useAnalysis as any).mockReturnValue({
|
|
186
|
+
...useAnalysis(),
|
|
187
|
+
file: file,
|
|
188
|
+
jumpType: 'dropjump',
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
render(<App />);
|
|
192
|
+
|
|
193
|
+
// Find the Analyze button in UploadForm
|
|
194
|
+
const analyzeBtn = screen.getByRole('button', { name: /Run Analysis/i });
|
|
195
|
+
fireEvent.click(analyzeBtn);
|
|
196
|
+
|
|
197
|
+
await waitFor(() => {
|
|
198
|
+
expect(mockAnalyze).toHaveBeenCalled();
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
// In App.tsx, handleAnalyze calls addRecentUpload IF file exists
|
|
202
|
+
// Note: Since analyze is async and mocked, we need to ensure the promise resolves.
|
|
203
|
+
// But since it's a simple mock function, it returns undefined (sync) or we can make it return Promise.resolve()
|
|
204
|
+
expect(mockAddRecentUpload).toHaveBeenCalledWith('jump.mp4', 'dropjump');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { render, screen, within } from '@testing-library/react';
|
|
2
|
+
import '@testing-library/jest-dom';
|
|
3
|
+
import ResultsDisplay from './ResultsDisplay';
|
|
4
|
+
import { AnalysisResponse, ValidationResults } from '../types/api';
|
|
5
|
+
|
|
6
|
+
describe('ResultsDisplay', () => {
|
|
7
|
+
const commonMetrics = {
|
|
8
|
+
status: 200,
|
|
9
|
+
message: 'Analysis successful',
|
|
10
|
+
metrics: {
|
|
11
|
+
data: {
|
|
12
|
+
tracking_method: 'MediaPipe',
|
|
13
|
+
processing_time_s: 15.5,
|
|
14
|
+
},
|
|
15
|
+
validation: {
|
|
16
|
+
status: 'PASS' as ValidationResults['status'],
|
|
17
|
+
issues: [],
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
it('renders CMJ scoreboard with correct metrics and units', () => {
|
|
23
|
+
const cmjMetrics: AnalysisResponse = {
|
|
24
|
+
...commonMetrics,
|
|
25
|
+
metrics: {
|
|
26
|
+
...commonMetrics.metrics,
|
|
27
|
+
data: {
|
|
28
|
+
...commonMetrics.metrics?.data,
|
|
29
|
+
jump_height_m: 0.50,
|
|
30
|
+
peak_concentric_velocity_m_s: 3.25,
|
|
31
|
+
peak_power_w: 2500,
|
|
32
|
+
countermovement_depth_m: 0.30,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
render(<ResultsDisplay metrics={cmjMetrics} />);
|
|
38
|
+
|
|
39
|
+
// Check for Jump Height in scoreboard (highlighted, large, in cm)
|
|
40
|
+
const kpiGrid = screen.getByRole('heading', { name: /key performance indicators/i }).nextElementSibling as HTMLElement;
|
|
41
|
+
const jumpHeightCard = within(kpiGrid).getByText('Jump Height').closest('.metric-card') as HTMLElement;
|
|
42
|
+
const jumpHeightValue = within(jumpHeightCard).getByText('50.00');
|
|
43
|
+
expect(jumpHeightValue).toBeInTheDocument();
|
|
44
|
+
expect(within(jumpHeightCard).getByText('cm')).toBeInTheDocument();
|
|
45
|
+
expect(jumpHeightValue.classList.contains('large')).toBe(true);
|
|
46
|
+
|
|
47
|
+
// Check for Peak Velocity in scoreboard
|
|
48
|
+
const peakVelocityCard = within(kpiGrid).getByText('Peak Velocity').closest('.metric-card') as HTMLElement;
|
|
49
|
+
expect(peakVelocityCard).toBeInTheDocument();
|
|
50
|
+
expect(within(peakVelocityCard).getByText('3.25')).toBeInTheDocument();
|
|
51
|
+
expect(within(peakVelocityCard).getByText('m/s')).toBeInTheDocument();
|
|
52
|
+
|
|
53
|
+
// Check for Peak Power in scoreboard
|
|
54
|
+
const peakPowerCard = within(kpiGrid).getByText('Peak Power').closest('.metric-card') as HTMLElement;
|
|
55
|
+
expect(peakPowerCard).toBeInTheDocument();
|
|
56
|
+
expect(within(peakPowerCard).getByText('2500.00')).toBeInTheDocument();
|
|
57
|
+
expect(within(peakPowerCard).getByText('W')).toBeInTheDocument();
|
|
58
|
+
|
|
59
|
+
// Check for Loading (Eccentric) phase metrics in timeline
|
|
60
|
+
const jumpTimeline = screen.getByRole('heading', { name: /jump phase analysis/i }).nextElementSibling as HTMLElement;
|
|
61
|
+
const loadingPhaseCard = within(jumpTimeline).getByText('Loading (Eccentric)').closest('.phase-card') as HTMLElement;
|
|
62
|
+
expect(loadingPhaseCard).toBeInTheDocument();
|
|
63
|
+
expect(within(loadingPhaseCard).getByText('Depth')).toBeInTheDocument();
|
|
64
|
+
expect(within(loadingPhaseCard).getByText('30.00')).toBeInTheDocument(); // Converted to cm
|
|
65
|
+
|
|
66
|
+
// Check for other details (not in scoreboard/timeline, but in additional metrics)
|
|
67
|
+
expect(screen.queryByText('Countermovement Depth')).not.toBeInTheDocument();
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('renders Drop Jump scoreboard with correct metrics and units', () => {
|
|
71
|
+
const dropJumpMetrics: AnalysisResponse = {
|
|
72
|
+
...commonMetrics,
|
|
73
|
+
metrics: {
|
|
74
|
+
...commonMetrics.metrics,
|
|
75
|
+
data: {
|
|
76
|
+
...commonMetrics.metrics?.data,
|
|
77
|
+
reactive_strength_index: 2.15,
|
|
78
|
+
jump_height_m: 0.45,
|
|
79
|
+
ground_contact_time_ms: 250,
|
|
80
|
+
flight_time_ms: 300,
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
render(<ResultsDisplay metrics={dropJumpMetrics} />);
|
|
86
|
+
|
|
87
|
+
// Check for RSI in scoreboard (highlighted, large)
|
|
88
|
+
const kpiGrid = screen.getByRole('heading', { name: /key performance indicators/i }).nextElementSibling as HTMLElement;
|
|
89
|
+
const rsiCard = within(kpiGrid).getByText('RSI').closest('.metric-card') as HTMLElement;
|
|
90
|
+
const rsiValue = within(rsiCard).getByText('2.15');
|
|
91
|
+
expect(rsiValue).toBeInTheDocument();
|
|
92
|
+
expect(within(rsiCard).getByText('m/s')).toBeInTheDocument();
|
|
93
|
+
expect(rsiValue.classList.contains('large')).toBe(true);
|
|
94
|
+
|
|
95
|
+
// Check for Jump Height in scoreboard
|
|
96
|
+
const heightCard = within(kpiGrid).getByText('Height').closest('.metric-card') as HTMLElement;
|
|
97
|
+
expect(heightCard).toBeInTheDocument();
|
|
98
|
+
expect(within(heightCard).getByText('45.00')).toBeInTheDocument();
|
|
99
|
+
expect(within(heightCard).getByText('cm')).toBeInTheDocument();
|
|
100
|
+
|
|
101
|
+
// Check for Ground Contact Time in scoreboard
|
|
102
|
+
const gctCard = within(kpiGrid).getByText('Contact Time').closest('.metric-card') as HTMLElement;
|
|
103
|
+
expect(gctCard).toBeInTheDocument();
|
|
104
|
+
expect(within(gctCard).getByText('250.00')).toBeInTheDocument();
|
|
105
|
+
expect(within(gctCard).getByText('ms')).toBeInTheDocument();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('renders validation banner when validation status is present', () => {
|
|
109
|
+
const failedMetrics: AnalysisResponse = {
|
|
110
|
+
...commonMetrics,
|
|
111
|
+
metrics: {
|
|
112
|
+
...commonMetrics.metrics,
|
|
113
|
+
validation: {
|
|
114
|
+
status: 'FAIL' as ValidationResults['status'],
|
|
115
|
+
issues: [{ metric: 'jump_height', severity: 'ERROR', message: 'Jump height too low' }],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
render(<ResultsDisplay metrics={failedMetrics} />);
|
|
121
|
+
expect(screen.getByText('Quality Check: FAIL')).toBeInTheDocument();
|
|
122
|
+
expect(screen.getByText('Jump height too low')).toBeInTheDocument();
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
it('renders informational validation banner for PASS_WITH_WARNINGS with correct icon and text', () => {
|
|
126
|
+
const warningMetrics: AnalysisResponse = {
|
|
127
|
+
...commonMetrics,
|
|
128
|
+
metrics: {
|
|
129
|
+
...commonMetrics.metrics,
|
|
130
|
+
validation: {
|
|
131
|
+
status: 'PASS_WITH_WARNINGS' as ValidationResults['status'],
|
|
132
|
+
issues: [{ metric: 'form_detection', severity: 'INFO', message: 'Minor form inconsistencies detected.' }],
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
render(<ResultsDisplay metrics={warningMetrics} />);
|
|
138
|
+
expect(screen.getByText('Quality Check: PASS WITH WARNINGS')).toBeInTheDocument();
|
|
139
|
+
expect(screen.getByText('Minor form inconsistencies detected.')).toBeInTheDocument();
|
|
140
|
+
// Check for the info icon. Vitest/JSDOM might not render actual emojis, so we check content
|
|
141
|
+
const statusIcon = screen.getByText('ℹ');
|
|
142
|
+
expect(statusIcon).toBeInTheDocument();
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
it('renders video previews when debug_video_url or videoFile are provided', () => {
|
|
147
|
+
const metricsWithVideos: AnalysisResponse = {
|
|
148
|
+
...commonMetrics,
|
|
149
|
+
debug_video_url: 'http://example.com/debug.mp4',
|
|
150
|
+
metrics: {
|
|
151
|
+
...commonMetrics.metrics,
|
|
152
|
+
validation: {
|
|
153
|
+
status: 'PASS' as ValidationResults['status'],
|
|
154
|
+
issues: [],
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
const mockFile = new File([''], 'test.mp4', { type: 'video/mp4' });
|
|
159
|
+
|
|
160
|
+
const { rerender } = render(<ResultsDisplay metrics={metricsWithVideos} videoFile={mockFile} />);
|
|
161
|
+
|
|
162
|
+
expect(screen.getByTitle('Original Video')).toBeInTheDocument();
|
|
163
|
+
expect(screen.getByTitle('Analysis Overlay')).toBeInTheDocument();
|
|
164
|
+
expect(screen.getByText('Download Analysis Video')).toBeInTheDocument();
|
|
165
|
+
|
|
166
|
+
// Test with only original video
|
|
167
|
+
rerender(<ResultsDisplay metrics={{...commonMetrics, metrics: {...commonMetrics.metrics, validation: {status: 'PASS' as ValidationResults['status'], issues: []}}}} videoFile={mockFile} />);
|
|
168
|
+
expect(screen.getByTitle('Original Video')).toBeInTheDocument();
|
|
169
|
+
expect(screen.queryByTitle('Analysis Overlay')).not.toBeInTheDocument();
|
|
170
|
+
expect(screen.queryByText('Download Analysis Video')).not.toBeInTheDocument();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('formats small numeric values to fixed 2 decimal places when not exponential', () => {
|
|
174
|
+
const smallValueMetrics: AnalysisResponse = {
|
|
175
|
+
...commonMetrics,
|
|
176
|
+
metrics: {
|
|
177
|
+
...commonMetrics.metrics,
|
|
178
|
+
data: {
|
|
179
|
+
reactive_strength_index: 0.005,
|
|
180
|
+
jump_height_m: 0.0001,
|
|
181
|
+
},
|
|
182
|
+
validation: {
|
|
183
|
+
status: 'PASS' as ValidationResults['status'],
|
|
184
|
+
issues: [],
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
render(<ResultsDisplay metrics={smallValueMetrics} />);
|
|
190
|
+
const kpiGrid = screen.getByRole('heading', { name: /key performance indicators/i }).nextElementSibling as HTMLElement;
|
|
191
|
+
const jumpHeightCard = within(kpiGrid).getByText('Height').closest('.metric-card') as HTMLElement;
|
|
192
|
+
expect(within(kpiGrid).getByText('5.00e-3')).toBeInTheDocument(); // RSI - this value is < 0.01, so it will be exponential
|
|
193
|
+
expect(within(jumpHeightCard).getByText('0.01')).toBeInTheDocument(); // Jump Height (0.0001m * 100 = 0.01cm, not exponential)
|
|
194
|
+
});
|
|
195
|
+
});
|