kinemotion 0.60.1__tar.gz → 0.61.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.60.1 → kinemotion-0.61.0}/.github/workflows/deploy-backend.yml +1 -1
- {kinemotion-0.60.1 → kinemotion-0.61.0}/CHANGELOG.md +7 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/PKG-INFO +1 -1
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/database.py +13 -2
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/routes/health.py +21 -0
- kinemotion-0.61.0/backend/supabase-schema.sql +70 -0
- kinemotion-0.61.0/frontend/src/lib/supabase.ts +23 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/pyproject.toml +1 -1
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/supabasedb/setup-supabase-database.sh +23 -15
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/supabasedb/setup_supabase_db.py +21 -13
- {kinemotion-0.60.1 → kinemotion-0.61.0}/uv.lock +1 -1
- kinemotion-0.60.1/backend/supabase-schema.sql +0 -148
- kinemotion-0.60.1/frontend/src/lib/supabase.ts +0 -20
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/api/api-reference-quick-commands.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/api/cloud-run-cpu-specifications-investigation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/api/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/auth-provider-comparison-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/auth-providers-comparison-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-authentication-quick-start.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-authentication-setup-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-authentication-technical-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-google-oauth-setup-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-production-setup-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-quick-start-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/camera-angle-empirical-validation-results-45-superior-for-media-pipe.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/camera-perspective-analysis-45deg-vs-lateral.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/cmj-landing-detection-window-validation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/cmj-physiological-bounds-for-validation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/cmj-validation-implementation-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/drop-jump-vs-cmj-key-differences.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/biomechanics/technical-implementation-45deg-perspective-correction.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/codebase-architecture-overview.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/validation-architecture-visual-hierarchy-after-refactoring.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/validation-code-duplication-evidence.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/validation-module-architecture-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/validation-refactoring-complete-architecture-improvement.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/automated-deployment-setup-git-hub-actions-with-workload-identity-federation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/backend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/backend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/cloud-run-security-least-privilege-service-account-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/cors-and-memory-issues-production-debugging-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/current-kinemotion-architecture-correct-deployment-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/frontend-repository-split-migration-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/frontend-repository-split-step-by-step-execution-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/production-deployment-guide-vercel-google-cloud-run.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/quick-deployment-commands-vercel-and-cloud-run.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/deployment/vercel-monorepo-deployment-best-practice.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/athlete-pose3d-and-cross-platform-determinism-investigation-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/athlete-pose3d-final-strategy-accuracy-and-robustness.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/athlete-pose3d-media-pipe-enhancement-plan.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/athlete-pose3d-phase-1-implementation-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-authentication-and-logging-status.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-code-coverage-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-code-duplication-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-granular-logging-implementation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-kinemotion-decoupling-strategy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/backend-sonar-cloud-integration-status.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/basic-memory-naming-hook-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/ci-caching-issue-investigation-deep-squat-test-failure.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/ci-vs-local-test-failure-investigation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/claude-code-hook-configuration.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/cmj-phase-detection-testing-gap-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/commit-review-r2-video-storage-migration-fe74d1f.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/comprehensive-timing-instrumentation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/cross-platform-determinism-analysis-final-results.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/database-setup-scripts-complete-implementation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/development-standards-quality-gates.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/drop-jump-detection-complete-fix-all-metrics-within-target.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/drop-jump-detection-failure-analysis-per-video-breakdown.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/drop-jump-fix-drop-start-successful-landing-and-takeoff-remain.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/fast-api-app.py Refactoring Plan - Modular Architecture.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/fast-api-refactoring-completion-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/feature-request-system-configuration.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/follow-up-improvements-to-r2-video-storage-migration.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/frontend-dependencies-analysis-nov-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/google-oauth-setup-script-final-review-production-ready.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/google-oauth-setup-script-review-issues-and-recommendations.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/hook-complete-audit-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/hook-configuration-audit.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/hook-quick-reference.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/i18n-implementation-plan-for-validation-messages.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/keyboard-interrupt-test-suite-failure-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/model-import-conflict-resolution-fast-api-refactoring.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/non-deterministic-analysis-root-cause-and-solution.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/optimal-timing-implementation-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/p0-p1-p2-test-suite-fixes-final-report.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/pose-detection-baseline-evaluation-results.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/pose-detection-optimization-complete-success-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/pose-detection-parameter-optimization-framework.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/structured-logging-implementation-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/structured-logging-implementation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/supabase-dashboard-navigation-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/supabase-database-integration-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/supabase-documentation-validation-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-coverage-asymmetry-analysis-cmj-vs-drop-jump.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-coverage-equivalence-achievement-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-suite-comprehensive-review-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-suite-comprehensive-review-structure-and-gaps.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-complete-report.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/test-suite-p0-p1-p2-fixes-progress-report.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/unused-and-experimental-features-strategy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/unused-code-detection-prompt-template.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/unused-code-identification-and-decorator-application-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/unused-code-verification-final-pass-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/using-multiple-mcp-reasoning-servers-simultaneously.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/velocity-threshold-empirical-validation-study.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/development/vercel-authentication-options-for-user-id-tracking.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/agent-documentation-standards-update.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/documentation-audit-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/i18n-documentation-cleanup-completed.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/issue-12-mvp-scaffolding-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/issue-12-unblocked-tasks-breakdown.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/issue-12-use-real-metrics-now.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/kinemotion-project-setup-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/kinemotion-supabase-production-configuration.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/mcp-sequential-thinking-alternatives-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/performance-optimization-pose-tracker-pool-timing-instrumentation-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/project-state-summary-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/specialized-subagents-routing-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/supabase-setup-instructions-for-kinemotion.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/project-management/version-mismatch-analysis-kinemotion-0370-vs-0300.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/research/performance-improvement-analysis-30s-18s.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/deployment-decision-analysis-for-kinemotion.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/mvp-feedback-collection-plan.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/mvp-first-strategic-direction.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/mvp-validation-checkpoints.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/pose2sim-migration-evaluation-and-strategy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/strategic-priority-tasks-current-roadmap.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/strategy/third-party-auth-providers-with-free-tiers-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/biomechanics-specialist.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/computer-vision-engineer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/devops-cicd-engineer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/frontend-developer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/ml-data-scientist.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/project-manager.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/python-backend-developer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/qa-test-engineer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/agents/technical-writer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.claude/settings.local.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.cursor/mcp.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.dockerignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.envrc +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.gitattributes +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/dependabot.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/pull_request_template.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/workflows/docs.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/workflows/release.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.github/workflows/test.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.mcp.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.pre-commit-config.yaml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.readthedocs.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/backend-cors-fastapi-middleware-order.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/camera-perspective-validation-study.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/code_style_and_conventions.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/current-project-architecture.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/deployment-checklist-and-known-issues.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/deployment-setup-complete.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/github-project-setup-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/mvp-first-strategy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/mvp-roadmap-and-priorities.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/project_overview.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/specialist-agents-routing.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/memories/suggested_commands.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.serena/project.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.tool-versions +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/.vercelignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/CLAUDE.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/CODE_OF_CONDUCT.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/CONTRIBUTING.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/Dockerfile +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/GEMINI.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/LICENSE +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/SECURITY.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/.coveragerc +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/.dockerignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/.env.example +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/Dockerfile +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/docs/fly-deployment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/docs/implementation-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/docs/setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/docs/tests.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/pyproject.toml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/analysis_api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app/config.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app/dependencies.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app/exceptions.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app/main.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/app.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/auth.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/logging_config.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/middleware.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/models/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/models/database.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/models/responses.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/models/storage.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/routes/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/routes/analysis.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/routes/database.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/routes/platform.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/services/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/services/analysis_service.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/services/storage_service.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/services/validation.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/services/video_processor.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/types.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/utils/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/src/kinemotion_backend/utils/rate_limiter.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/conftest.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/test_api_endpoints.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/test_error_handling.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/test_health.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/test_r2_integration.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/backend/tests/test_validation.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/api/cmj.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/api/core.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/api/dropjump.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/api/overview.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/I18N-README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/agents-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/errors-findings.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/feature-request-system.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/feedback-system-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/i18n-architecture-diagram.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/i18n-cheat-sheet.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/i18n-quick-start-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/i18n-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/i18n-validation-messages-specification.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/supabase-database-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/test-suite-review-december-2025.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/testing-standards.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/testing.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/type-hints.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/validation-plan.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/validation-roadmap.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/development/wallball-norep-detection.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/bulk-processing.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/camera-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/cloud-run-deployment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/cmj-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/cmj-recording-protocol-es.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/cmj-recording-protocol.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/deployment-checklist.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/local-testing.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/setup-issue-12.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/supabase-setup/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/supabase-setup/quickstart.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/supabase-setup/scripts-reference.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/guides/supabase-setup/setup-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/index.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/quick-start.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/reference/cloud-run-quick-reference.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/reference/json-output-format.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/reference/json-structure-comparison.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/reference/parameters.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/reference/pose-systems.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/HOW-TO-FIND-DOIS.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/dois.txt +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/download.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/pyproject.toml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/paper-downloader/uv.lock +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/sports-biomechanics-pose-estimation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/MANUAL-DOWNLOAD-GUIDE.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/convert_pdfs.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/athlete-monitoring/2018_Ward_Putting-i-in-Team.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2011_Harper_10-to-5-Jump-Test.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2014_Samozino_FV-Imbalance.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/jump-performance/2022_Wells_Golf-Clubhead-CMJ.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2016_Moore_Economical-Running-Technique.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/smartphone-technology/2022_Bishop_MyJumpLab-Validation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/markdown/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/online-references-for-papers.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2001_Foster_Session-RPE-Training-Monitoring.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2015_Buchheit_GPS-Accelerometers-Stride-Stiffness.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Flatt_HRV-Recovery-Swimmers.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Saw_Training-Camps-Monitoring.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/athlete-monitoring/2018_Ward_Putting-i-in-Team.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Petersen_Nordic-Hamstring-Prevention.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2011_Wilk_Shoulder-GIRD-Baseball-Pitchers.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2012_Hewit_Multidirectional-Leg-Asymmetry.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Ford_Hip-Neuromuscular-Exercise-Valgus.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Mosler_Hip-Groin-Pain-Factors.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2015_Sconce_Nordic-Hamstring-Validity.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Mendez-Villanueva_Hamstring-MRI-Regional.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2016_Read_Youth-Soccer-Injury-Risk.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mason-Mackay_Ankle-Dorsiflexion-Landing.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2017_Mendiguchia_Hamstring-Treatment-Algorithm.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Balsalobre-Fernandez_Ankle-Dorsiflexion-App.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2018_Bramah_Pathological-Gait-Running-Injuries.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/injury-prevention/2020_Fidai_Fatigue-Knee-Valgus-Youth.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2011_Harper_10-to-5-Jump-Test.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2012_Samozino_Optimal-Force-Velocity-Profile.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2014_Samozino_FV-Imbalance.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Jimenez-Reyes_Force-Velocity-Training.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2016_Morin-Samozino_Power-Force-Velocity-Profiles.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2018_Garcia-Ramos_Two-Point-Method-Optimization.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/jump-performance/2022_Wells_Golf-Clubhead-CMJ.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2005_Morin_Running-Stiffness-Measurement.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2015_Balsalobre-Fernandez_Strength-Training-Running-Economy.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Balsalobre-Fernandez_iPhone-Running-Mechanics.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2016_Moore_Economical-Running-Technique.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Filter_Curve-Sprint-Test-Soccer.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2020_Harper_Horizontal-Deceleration-Radar.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2021_vanOeveren_Running-Biomechanics-Synthesis.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/running-biomechanics/2024_Bramah_Sprint-Mechanics-Assessment-Score.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/smartphone-technology/2015_Balsalobre-Fernandez_iPhone-Vertical-Jump.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/smartphone-technology/2022_Bishop_MyJumpLab-Validation.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2011_Jidovtseff_Load-Velocity-1RM-Prediction.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Conceicao_Movement-Velocity-Lower-Limb.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2016_Pareja-Blanco_Velocity-Loss-Training.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2017_Balsalobre-Fernandez_Barbell-Velocity-1RM.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2020_Balsalobre-Fernandez_Barbell-Trajectory-Snatch.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/research/thirdparty/pdfs/velocity-based-training/2023_Balsalobre-Fernandez_AI-Barbell-Velocity.pdf +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/1-STRATEGIC_SUMMARY.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/2-STRATEGIC_ANALYSIS.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/MVP_FEEDBACK_COLLECTION.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/MVP_VALIDATION_CHECKPOINTS.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/STYLE_GUIDE.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/02-technical-assessment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/03-refactoring-roadmap.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BACKEND_ARCHITECTURE/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BIOMECHANICS/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BIOMECHANICS/02-technical-assessment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BIOMECHANICS/03-reference-guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/BIOMECHANICS/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/COMPUTER_VISION/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/COMPUTER_VISION/02-real-time-architecture.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/COMPUTER_VISION/03-implementation-checklist.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/COMPUTER_VISION/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/01-agent-consensus.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/02-critical-findings.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/03-roadmap-adjustments.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/04-decision-points.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/risk-register.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/CONSOLIDATED/timeline-roadmap.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/02-infrastructure-assessment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/03-implementation-roadmap.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/DEVOPS_CI_CD/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/02-technical-assessment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/03-parameter-specifications.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/ML_DATA_SCIENCE/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/QA_TESTING/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/QA_TESTING/02-roadmap-assessment.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/QA_TESTING/03-testing-checklists.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/QA_TESTING/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/01-executive-summary.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/02-documentation-strategy.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/03-action-plan.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/agent-assessments/TECHNICAL_WRITING/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/strategy/pose2sim-migration-evaluation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/technical/framerate.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/technical/implementation-details.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/technical/imu-metadata.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/technical/real-time-analysis.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/technical/triple-extension.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/translations/es/camera-setup.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/validation/determinism-test.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/validation/known-height-validation.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/docs/validation-status.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/examples/bulk/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/examples/bulk/bulk_processing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/examples/bulk/simple_example.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/examples/programmatic_usage.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.editorconfig +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.env.example +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.gitattributes +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.yarn/releases/yarn-4.12.0.cjs +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/.yarnrc.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/index.html +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/package.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/App.i18n.integration.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/App.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/App.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/Auth.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/Auth.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ErrorBoundary.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ErrorBoundary.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ErrorDisplay.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/FeatureRequestButton.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/FeedbackForm.css +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/FeedbackForm.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/FeedbackForm.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/LanguageSwitcher.css +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/LanguageSwitcher.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/LanguageSwitcher.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/LoadingSpinner.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/LoadingSpinner.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/RecentUploads.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/RecentUploads.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ResultsDisplay.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ResultsDisplay.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/ResultsSkeleton.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/UploadForm.test.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/components/UploadForm.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/config/links.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useAnalysis.test.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useAnalysis.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useAuth.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useBackendVersion.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useDatabaseStatus.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useLanguage.test.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useLanguage.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/hooks/useRecentUploads.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/i18n/config.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/i18n/locales/en/translation.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/i18n/locales/es/translation.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/i18n/locales/fr/translation.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/index.css +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/main.tsx +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/test/setup.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/types/api.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/src/vite-env.d.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/vercel.json +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/vite.config.ts +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/frontend/yarn.lock +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/justfile +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/local_dev.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/mkdocs.yml +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/demos/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/demos/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/demos/api_demo.ipynb +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/demos/batch_processing_demo.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/demos/sample_data/.gitkeep +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/presentation_guide.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/revealjs/.gitignore +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/revealjs/Makefile +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/revealjs/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/revealjs/slides.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/presentation/speaker_script.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/requirements-docs.txt +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/samples/cmjs/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/SCRIPTS_QUICKREF.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/analyze_determinism_variance.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/basic-memory-utils.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/debug_contact_states.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/debug_detection.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/find_unused_features.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/generate_test_data.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/optimize_detection_params.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/plot_cmj_velocities.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/plot_validation_results.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/plot_velocities.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/prepare_ground_truth.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/README.md +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/add-issue.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/batch-set-fields.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/helpers.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/list.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/set-field.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/set-status.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project/summary.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/project.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/setup-github-deploy.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/setup-google-oauth.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/setup-supabase-local.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/setup-supabase-production.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/test_acceleration_standing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/test_determinism.sh +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/test_drop_start_debug.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/scripts/validate_known_heights.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/sonar-project.properties +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cli.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/analysis.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/cli.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/debug_overlay.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/joint_angles.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/kinematics.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/metrics_validator.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/cmj/validation_bounds.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/auto_tuning.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/cli_utils.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/debug_overlay_utils.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/determinism.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/experimental.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/filtering.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/formatting.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/metadata.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/pipeline_utils.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/pose.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/quality.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/smoothing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/timing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/validation.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/core/video_io.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/analysis.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/cli.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/debug_overlay.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/kinematics.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/metrics_validator.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/dropjump/validation_bounds.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/src/kinemotion/py.typed +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cli/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cli/test_cmj.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cli/test_dropjump.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cli/test_imports.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_analysis.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_cli.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_joint_angles.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_kinematics.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/cmj/test_physiological_bounds.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/conftest.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_auto_tuning.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_cli_utils.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_filtering.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_formatting.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_metadata.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_pipeline_utils.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_pose.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_quality.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_smoothing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_timing.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_validation.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/core/test_video_io.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/__init__.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_adaptive_threshold.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_analysis.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_api.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_cli.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_contact_detection.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_kinematics.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_physiological_bounds.py +0 -0
- {kinemotion-0.60.1 → kinemotion-0.61.0}/tests/dropjump/test_validation_integration.py +0 -0
|
@@ -134,7 +134,7 @@ jobs:
|
|
|
134
134
|
--allow-unauthenticated
|
|
135
135
|
--service-account=kinemotion-backend-runtime@${{ env.GCP_PROJECT_ID }}.iam.gserviceaccount.com
|
|
136
136
|
--set-env-vars=CORS_ORIGINS=https://kinemotion.vercel.app,JSON_LOGS=true,LOG_LEVEL=INFO
|
|
137
|
-
--set-secrets=SUPABASE_URL=SUPABASE_URL:latest,
|
|
137
|
+
--set-secrets=SUPABASE_URL=SUPABASE_URL:latest,SUPABASE_PUBLISHABLE_KEY=SUPABASE_PUBLISHABLE_KEY:latest,SUPABASE_SECRET_KEY=SUPABASE_SECRET_KEY:latest,R2_ENDPOINT=R2_ENDPOINT:latest,R2_ACCESS_KEY=R2_ACCESS_KEY:latest,R2_SECRET_KEY=R2_SECRET_KEY:latest,R2_BUCKET_NAME=R2_BUCKET_NAME:latest
|
|
138
138
|
|
|
139
139
|
- name: Verify deployment health
|
|
140
140
|
run: |
|
|
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
<!-- version list -->
|
|
9
9
|
|
|
10
|
+
## kinemotion-v0.61.0 (2025-12-15)
|
|
11
|
+
|
|
12
|
+
### Feat
|
|
13
|
+
|
|
14
|
+
- update Supabase integration to use modern API keys
|
|
15
|
+
- update frontend to use modern Supabase publishable key
|
|
16
|
+
|
|
10
17
|
## kinemotion-v0.60.1 (2025-12-15)
|
|
11
18
|
|
|
12
19
|
### Fix
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kinemotion
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.61.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
|
|
@@ -15,13 +15,24 @@ class DatabaseClient:
|
|
|
15
15
|
def __init__(self) -> None:
|
|
16
16
|
"""Initialize Supabase client."""
|
|
17
17
|
self.supabase_url = os.getenv("SUPABASE_URL", "")
|
|
18
|
-
|
|
18
|
+
|
|
19
|
+
# Prefer modern keys, fall back to legacy for compatibility
|
|
20
|
+
self.supabase_key = (
|
|
21
|
+
os.getenv("SUPABASE_PUBLISHABLE_KEY")
|
|
22
|
+
or os.getenv("SUPABASE_SECRET_KEY")
|
|
23
|
+
or os.getenv("SUPABASE_ANON_KEY")
|
|
24
|
+
or os.getenv("SUPABASE_KEY")
|
|
25
|
+
)
|
|
19
26
|
|
|
20
27
|
if not self.supabase_url:
|
|
21
28
|
raise ValueError("SUPABASE_URL must be set")
|
|
22
29
|
|
|
23
30
|
if not self.supabase_key:
|
|
24
|
-
raise ValueError(
|
|
31
|
+
raise ValueError(
|
|
32
|
+
"No Supabase API key found. Set one of: "
|
|
33
|
+
"SUPABASE_PUBLISHABLE_KEY, SUPABASE_SECRET_KEY, "
|
|
34
|
+
"SUPABASE_ANON_KEY, or SUPABASE_KEY"
|
|
35
|
+
)
|
|
25
36
|
|
|
26
37
|
self.client: Client = create_client(self.supabase_url, self.supabase_key)
|
|
27
38
|
logger.info("database_client_initialized", supabase_url=self.supabase_url)
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
4
|
from datetime import datetime, timezone
|
|
5
|
+
from importlib.metadata import version
|
|
5
6
|
|
|
6
7
|
import structlog
|
|
7
8
|
from fastapi import APIRouter
|
|
@@ -22,11 +23,31 @@ async def health_check() -> dict[str, str | bool]:
|
|
|
22
23
|
os.getenv("R2_ENDPOINT") and os.getenv("R2_ACCESS_KEY") and os.getenv("R2_SECRET_KEY")
|
|
23
24
|
)
|
|
24
25
|
|
|
26
|
+
# Get kinemotion version safely
|
|
27
|
+
try:
|
|
28
|
+
kinemotion_version = version("kinemotion")
|
|
29
|
+
except Exception:
|
|
30
|
+
kinemotion_version = "unknown"
|
|
31
|
+
|
|
32
|
+
# Check database connection
|
|
33
|
+
database_connected = False
|
|
34
|
+
try:
|
|
35
|
+
from kinemotion_backend.database import get_database_client
|
|
36
|
+
|
|
37
|
+
db_client = get_database_client()
|
|
38
|
+
# Test database with a simple query
|
|
39
|
+
db_client.client.table("analysis_sessions").select("id").limit(1).execute()
|
|
40
|
+
database_connected = True
|
|
41
|
+
except Exception as db_error:
|
|
42
|
+
logger.warning("database_health_check_failed", error=str(db_error))
|
|
43
|
+
|
|
25
44
|
return {
|
|
26
45
|
"status": "healthy",
|
|
27
46
|
"service": "kinemotion-backend",
|
|
28
47
|
"version": "0.1.0",
|
|
29
48
|
"environment": os.getenv("ENVIRONMENT", "development"),
|
|
49
|
+
"kinemotion_version": kinemotion_version,
|
|
30
50
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
31
51
|
"r2_configured": r2_configured,
|
|
52
|
+
"database_connected": database_connected,
|
|
32
53
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
|
|
2
|
+
-- Enable required extensions
|
|
3
|
+
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
4
|
+
|
|
5
|
+
-- Analysis Sessions Table
|
|
6
|
+
CREATE TABLE IF NOT EXISTS analysis_sessions (
|
|
7
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
8
|
+
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
9
|
+
jump_type VARCHAR(50) NOT NULL CHECK (jump_type IN ('cmj', 'drop_jump')),
|
|
10
|
+
quality_preset VARCHAR(20) NOT NULL CHECK (quality_preset IN ('fast', 'balanced', 'accurate')),
|
|
11
|
+
original_video_url TEXT,
|
|
12
|
+
debug_video_url TEXT,
|
|
13
|
+
results_json_url TEXT,
|
|
14
|
+
analysis_data JSONB NOT NULL,
|
|
15
|
+
processing_time_s FLOAT,
|
|
16
|
+
upload_id VARCHAR(50),
|
|
17
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
18
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
-- Coach Feedback Table
|
|
22
|
+
CREATE TABLE IF NOT EXISTS coach_feedback (
|
|
23
|
+
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
24
|
+
analysis_session_id UUID NOT NULL REFERENCES analysis_sessions(id) ON DELETE CASCADE,
|
|
25
|
+
coach_user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
26
|
+
notes TEXT,
|
|
27
|
+
rating INTEGER CHECK (rating >= 1 AND rating <= 5),
|
|
28
|
+
tags TEXT[] DEFAULT '{}',
|
|
29
|
+
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
30
|
+
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
-- Create indexes for performance
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_user_id ON analysis_sessions(user_id);
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_created_at ON analysis_sessions(created_at DESC);
|
|
36
|
+
CREATE INDEX IF NOT EXISTS idx_coach_feedback_analysis_session_id ON coach_feedback(analysis_session_id);
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_coach_feedback_coach_user_id ON coach_feedback(coach_user_id);
|
|
38
|
+
|
|
39
|
+
-- Enable Row Level Security
|
|
40
|
+
ALTER TABLE analysis_sessions ENABLE ROW LEVEL SECURITY;
|
|
41
|
+
ALTER TABLE coach_feedback ENABLE ROW LEVEL SECURITY;
|
|
42
|
+
|
|
43
|
+
-- RLS Policy: Users can only see their own analysis sessions
|
|
44
|
+
CREATE POLICY "users_can_read_own_sessions" ON analysis_sessions
|
|
45
|
+
FOR SELECT
|
|
46
|
+
USING (auth.uid() = user_id);
|
|
47
|
+
|
|
48
|
+
CREATE POLICY "users_can_create_own_sessions" ON analysis_sessions
|
|
49
|
+
FOR INSERT
|
|
50
|
+
WITH CHECK (auth.uid() = user_id);
|
|
51
|
+
|
|
52
|
+
-- RLS Policy: Coaches can read feedback for their own analyses or sessions they're coaching
|
|
53
|
+
CREATE POLICY "coaches_can_read_feedback" ON coach_feedback
|
|
54
|
+
FOR SELECT
|
|
55
|
+
USING (
|
|
56
|
+
auth.uid() = coach_user_id OR
|
|
57
|
+
auth.uid() IN (
|
|
58
|
+
SELECT user_id FROM analysis_sessions
|
|
59
|
+
WHERE id = coach_feedback.analysis_session_id
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
CREATE POLICY "coaches_can_create_feedback" ON coach_feedback
|
|
64
|
+
FOR INSERT
|
|
65
|
+
WITH CHECK (auth.uid() = coach_user_id);
|
|
66
|
+
|
|
67
|
+
CREATE POLICY "coaches_can_update_own_feedback" ON coach_feedback
|
|
68
|
+
FOR UPDATE
|
|
69
|
+
USING (auth.uid() = coach_user_id)
|
|
70
|
+
WITH CHECK (auth.uid() = coach_user_id);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Supabase client configuration for Kinemotion frontend
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { createClient } from '@supabase/supabase-js'
|
|
6
|
+
|
|
7
|
+
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
|
|
8
|
+
// Prefer modern VITE_SUPABASE_PUBLISHABLE_KEY, fall back to legacy VITE_SUPABASE_ANON_KEY
|
|
9
|
+
const supabaseKey =
|
|
10
|
+
import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY ||
|
|
11
|
+
import.meta.env.VITE_SUPABASE_ANON_KEY
|
|
12
|
+
|
|
13
|
+
const isConfigured = supabaseUrl && supabaseKey
|
|
14
|
+
|
|
15
|
+
if (!isConfigured) {
|
|
16
|
+
console.warn(
|
|
17
|
+
'Missing Supabase environment variables (VITE_SUPABASE_URL, VITE_SUPABASE_PUBLISHABLE_KEY). Authentication will be mocked.'
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const supabase = isConfigured
|
|
22
|
+
? createClient(supabaseUrl, supabaseKey)
|
|
23
|
+
: null
|
|
@@ -20,17 +20,25 @@ if [ -z "$SUPABASE_URL" ]; then
|
|
|
20
20
|
echo -e "${RED}❌ Error: SUPABASE_URL is not set${NC}"
|
|
21
21
|
echo "Please run setup-supabase-local.sh first or set environment variables:"
|
|
22
22
|
echo " export SUPABASE_URL='https://your-project.supabase.co'"
|
|
23
|
-
echo " export
|
|
23
|
+
echo " export SUPABASE_PUBLISHABLE_KEY='sb_publishable_...'"
|
|
24
24
|
exit 1
|
|
25
25
|
fi
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
27
|
+
# Prefer modern keys, fall back to legacy for compatibility
|
|
28
|
+
if [ -z "$SUPABASE_PUBLISHABLE_KEY" ] && [ -z "$SUPABASE_SECRET_KEY" ] && \
|
|
29
|
+
[ -z "$SUPABASE_KEY" ] && [ -z "$SUPABASE_ANON_KEY" ]; then
|
|
30
|
+
echo -e "${RED}❌ Error: No Supabase API key found${NC}"
|
|
31
|
+
echo ""
|
|
32
|
+
echo "Recommended (modern): export SUPABASE_PUBLISHABLE_KEY='sb_publishable_...'"
|
|
33
|
+
echo "Or for admin operations: export SUPABASE_SECRET_KEY='sb_secret_...'"
|
|
34
|
+
echo ""
|
|
35
|
+
echo "Legacy (not recommended):"
|
|
36
|
+
echo " export SUPABASE_KEY='...' or SUPABASE_ANON_KEY='...'"
|
|
29
37
|
exit 1
|
|
30
38
|
fi
|
|
31
39
|
|
|
32
|
-
# Use
|
|
33
|
-
API_KEY="${SUPABASE_KEY:-$SUPABASE_ANON_KEY}"
|
|
40
|
+
# Use SUPABASE_PUBLISHABLE_KEY if set, otherwise fall back to legacy keys
|
|
41
|
+
API_KEY="${SUPABASE_PUBLISHABLE_KEY:-${SUPABASE_SECRET_KEY:-${SUPABASE_KEY:-$SUPABASE_ANON_KEY}}}"
|
|
34
42
|
|
|
35
43
|
echo -e "${BLUE}Project URL:${NC} $SUPABASE_URL"
|
|
36
44
|
echo ""
|
|
@@ -98,16 +106,16 @@ ALTER TABLE analysis_sessions ENABLE ROW LEVEL SECURITY;
|
|
|
98
106
|
ALTER TABLE coach_feedback ENABLE ROW LEVEL SECURITY;
|
|
99
107
|
|
|
100
108
|
-- RLS Policy: Users can only see their own analysis sessions
|
|
101
|
-
CREATE POLICY
|
|
109
|
+
CREATE POLICY "users_can_read_own_sessions" ON analysis_sessions
|
|
102
110
|
FOR SELECT
|
|
103
111
|
USING (auth.uid() = user_id);
|
|
104
112
|
|
|
105
|
-
CREATE POLICY
|
|
113
|
+
CREATE POLICY "users_can_create_own_sessions" ON analysis_sessions
|
|
106
114
|
FOR INSERT
|
|
107
115
|
WITH CHECK (auth.uid() = user_id);
|
|
108
116
|
|
|
109
117
|
-- RLS Policy: Coaches can read feedback for their own analyses or sessions they'"'"'re coaching
|
|
110
|
-
CREATE POLICY
|
|
118
|
+
CREATE POLICY "coaches_can_read_feedback" ON coach_feedback
|
|
111
119
|
FOR SELECT
|
|
112
120
|
USING (
|
|
113
121
|
auth.uid() = coach_user_id OR
|
|
@@ -117,11 +125,11 @@ CREATE POLICY IF NOT EXISTS "coaches_can_read_feedback" ON coach_feedback
|
|
|
117
125
|
)
|
|
118
126
|
);
|
|
119
127
|
|
|
120
|
-
CREATE POLICY
|
|
128
|
+
CREATE POLICY "coaches_can_create_feedback" ON coach_feedback
|
|
121
129
|
FOR INSERT
|
|
122
130
|
WITH CHECK (auth.uid() = coach_user_id);
|
|
123
131
|
|
|
124
|
-
CREATE POLICY
|
|
132
|
+
CREATE POLICY "coaches_can_update_own_feedback" ON coach_feedback
|
|
125
133
|
FOR UPDATE
|
|
126
134
|
USING (auth.uid() = coach_user_id)
|
|
127
135
|
WITH CHECK (auth.uid() = coach_user_id);
|
|
@@ -181,7 +189,7 @@ echo -e "${YELLOW}⚠️ Environment Variables${NC}"
|
|
|
181
189
|
echo ""
|
|
182
190
|
echo "Your current setup:"
|
|
183
191
|
echo " SUPABASE_URL: $SUPABASE_URL"
|
|
184
|
-
echo "
|
|
192
|
+
echo " API_KEY: ${API_KEY:0:20}... (hidden)"
|
|
185
193
|
echo ""
|
|
186
194
|
|
|
187
195
|
echo -e "${BLUE}═══════════════════════════════════════════════════════${NC}"
|
|
@@ -200,11 +208,11 @@ if [ -f "backend/.env" ]; then
|
|
|
200
208
|
echo "Please add it manually or run setup-supabase-local.sh"
|
|
201
209
|
fi
|
|
202
210
|
|
|
203
|
-
if grep -q "SUPABASE_KEY=" backend/.env || grep -q "SUPABASE_ANON_KEY=" backend/.env; then
|
|
204
|
-
echo "✅
|
|
211
|
+
if grep -q "SUPABASE_PUBLISHABLE_KEY=" backend/.env || grep -q "SUPABASE_SECRET_KEY=" backend/.env || grep -q "SUPABASE_KEY=" backend/.env || grep -q "SUPABASE_ANON_KEY=" backend/.env; then
|
|
212
|
+
echo "✅ Supabase API key configured in backend/.env"
|
|
205
213
|
else
|
|
206
|
-
echo -e "${YELLOW}⚠️
|
|
207
|
-
echo "Please add
|
|
214
|
+
echo -e "${YELLOW}⚠️ No Supabase API key found in backend/.env${NC}"
|
|
215
|
+
echo "Please add SUPABASE_PUBLISHABLE_KEY or SUPABASE_SECRET_KEY manually or run setup-supabase-local.sh"
|
|
208
216
|
fi
|
|
209
217
|
else
|
|
210
218
|
echo -e "${YELLOW}⚠️ backend/.env not found${NC}"
|
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
Supabase database schema setup script for Kinemotion.
|
|
4
4
|
|
|
5
5
|
This script automates the creation of database tables and Row Level Security (RLS) policies.
|
|
6
|
-
It requires SUPABASE_URL and
|
|
6
|
+
It requires SUPABASE_URL and SUPABASE_PUBLISHABLE_KEY to be set.
|
|
7
7
|
|
|
8
8
|
Usage:
|
|
9
9
|
python scripts/setup_supabase_db.py
|
|
10
10
|
|
|
11
11
|
Environment variables:
|
|
12
12
|
SUPABASE_URL: Your Supabase project URL (e.g., https://project.supabase.co)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
SUPABASE_PUBLISHABLE_KEY: Your Supabase publishable key (format: sb_publishable_...)
|
|
14
|
+
SUPABASE_SECRET_KEY: Your Supabase secret key for admin operations (format: sb_secret_...)
|
|
15
|
+
|
|
16
|
+
Note: Modern API keys (publishable/secret) are recommended over legacy anon/service_role keys.
|
|
16
17
|
"""
|
|
17
18
|
|
|
18
19
|
import os
|
|
@@ -80,11 +81,18 @@ def validate_credentials() -> tuple[str, str]:
|
|
|
80
81
|
print("Set it with: export SUPABASE_URL='https://your-project.supabase.co'")
|
|
81
82
|
sys.exit(1)
|
|
82
83
|
|
|
83
|
-
#
|
|
84
|
-
key = os.getenv("
|
|
84
|
+
# Prefer SUPABASE_PUBLISHABLE_KEY, fall back to legacy keys for compatibility
|
|
85
|
+
key = (os.getenv("SUPABASE_PUBLISHABLE_KEY") or
|
|
86
|
+
os.getenv("SUPABASE_SECRET_KEY") or
|
|
87
|
+
os.getenv("SUPABASE_KEY") or
|
|
88
|
+
os.getenv("SUPABASE_ANON_KEY"))
|
|
89
|
+
|
|
85
90
|
if not key:
|
|
86
|
-
print_error("
|
|
87
|
-
print("
|
|
91
|
+
print_error("No Supabase API key found")
|
|
92
|
+
print("\nRecommended (modern): export SUPABASE_PUBLISHABLE_KEY='sb_publishable_...'")
|
|
93
|
+
print("Or for admin operations: export SUPABASE_SECRET_KEY='sb_secret_...'")
|
|
94
|
+
print("\nLegacy (not recommended):")
|
|
95
|
+
print(" export SUPABASE_KEY='...' or SUPABASE_ANON_KEY='...'")
|
|
88
96
|
sys.exit(1)
|
|
89
97
|
|
|
90
98
|
return url, key
|
|
@@ -159,16 +167,16 @@ ALTER TABLE analysis_sessions ENABLE ROW LEVEL SECURITY;
|
|
|
159
167
|
ALTER TABLE coach_feedback ENABLE ROW LEVEL SECURITY;
|
|
160
168
|
|
|
161
169
|
-- RLS Policy: Users can only see their own analysis sessions
|
|
162
|
-
CREATE POLICY
|
|
170
|
+
CREATE POLICY "users_can_read_own_sessions" ON analysis_sessions
|
|
163
171
|
FOR SELECT
|
|
164
172
|
USING (auth.uid() = user_id);
|
|
165
173
|
|
|
166
|
-
CREATE POLICY
|
|
174
|
+
CREATE POLICY "users_can_create_own_sessions" ON analysis_sessions
|
|
167
175
|
FOR INSERT
|
|
168
176
|
WITH CHECK (auth.uid() = user_id);
|
|
169
177
|
|
|
170
178
|
-- RLS Policy: Coaches can read feedback for their own analyses or sessions they're coaching
|
|
171
|
-
CREATE POLICY
|
|
179
|
+
CREATE POLICY "coaches_can_read_feedback" ON coach_feedback
|
|
172
180
|
FOR SELECT
|
|
173
181
|
USING (
|
|
174
182
|
auth.uid() = coach_user_id OR
|
|
@@ -178,11 +186,11 @@ CREATE POLICY IF NOT EXISTS "coaches_can_read_feedback" ON coach_feedback
|
|
|
178
186
|
)
|
|
179
187
|
);
|
|
180
188
|
|
|
181
|
-
CREATE POLICY
|
|
189
|
+
CREATE POLICY "coaches_can_create_feedback" ON coach_feedback
|
|
182
190
|
FOR INSERT
|
|
183
191
|
WITH CHECK (auth.uid() = coach_user_id);
|
|
184
192
|
|
|
185
|
-
CREATE POLICY
|
|
193
|
+
CREATE POLICY "coaches_can_update_own_feedback" ON coach_feedback
|
|
186
194
|
FOR UPDATE
|
|
187
195
|
USING (auth.uid() = coach_user_id)
|
|
188
196
|
WITH CHECK (auth.uid() = coach_user_id);
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
-- Supabase Database Schema for Kinemotion Analysis Sessions
|
|
2
|
-
--
|
|
3
|
-
-- Run this SQL in your Supabase SQL Editor to create the required tables
|
|
4
|
-
|
|
5
|
-
-- Enable UUID extension if not already enabled
|
|
6
|
-
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
7
|
-
|
|
8
|
-
-- Analysis Sessions Table
|
|
9
|
-
CREATE TABLE IF NOT EXISTS analysis_sessions (
|
|
10
|
-
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
11
|
-
user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
12
|
-
jump_type VARCHAR(50) NOT NULL CHECK (jump_type IN ('cmj', 'drop_jump')),
|
|
13
|
-
quality_preset VARCHAR(20) NOT NULL CHECK (quality_preset IN ('fast', 'balanced', 'accurate')),
|
|
14
|
-
|
|
15
|
-
-- R2 Storage references
|
|
16
|
-
original_video_url TEXT,
|
|
17
|
-
debug_video_url TEXT,
|
|
18
|
-
results_json_url TEXT,
|
|
19
|
-
|
|
20
|
-
-- Analysis results stored as JSONB for flexible querying
|
|
21
|
-
analysis_data JSONB NOT NULL,
|
|
22
|
-
|
|
23
|
-
-- Processing metadata
|
|
24
|
-
processing_time_s FLOAT,
|
|
25
|
-
upload_id VARCHAR(50),
|
|
26
|
-
|
|
27
|
-
-- Timestamps
|
|
28
|
-
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
29
|
-
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
-- Coach Feedback Table
|
|
33
|
-
CREATE TABLE IF NOT EXISTS coach_feedback (
|
|
34
|
-
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
35
|
-
analysis_session_id UUID NOT NULL REFERENCES analysis_sessions(id) ON DELETE CASCADE,
|
|
36
|
-
coach_user_id UUID NOT NULL REFERENCES auth.users(id) ON DELETE CASCADE,
|
|
37
|
-
|
|
38
|
-
-- Feedback content
|
|
39
|
-
notes TEXT,
|
|
40
|
-
rating INTEGER CHECK (rating >= 1 AND rating <= 5),
|
|
41
|
-
tags TEXT[] DEFAULT '{}',
|
|
42
|
-
|
|
43
|
-
-- Timestamps
|
|
44
|
-
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
|
|
45
|
-
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
|
46
|
-
);
|
|
47
|
-
|
|
48
|
-
-- Create updated_at trigger function
|
|
49
|
-
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
50
|
-
RETURNS TRIGGER AS $$
|
|
51
|
-
BEGIN
|
|
52
|
-
NEW.updated_at = NOW();
|
|
53
|
-
RETURN NEW;
|
|
54
|
-
END;
|
|
55
|
-
$$ language 'plpgsql';
|
|
56
|
-
|
|
57
|
-
-- Create triggers for updated_at
|
|
58
|
-
CREATE TRIGGER update_analysis_sessions_updated_at
|
|
59
|
-
BEFORE UPDATE ON analysis_sessions
|
|
60
|
-
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
61
|
-
|
|
62
|
-
CREATE TRIGGER update_coach_feedback_updated_at
|
|
63
|
-
BEFORE UPDATE ON coach_feedback
|
|
64
|
-
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
|
|
65
|
-
|
|
66
|
-
-- Indexes for performance
|
|
67
|
-
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_user_id ON analysis_sessions(user_id);
|
|
68
|
-
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_jump_type ON analysis_sessions(jump_type);
|
|
69
|
-
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_created_at ON analysis_sessions(created_at DESC);
|
|
70
|
-
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_upload_id ON analysis_sessions(upload_id);
|
|
71
|
-
|
|
72
|
-
-- JSONB GIN index for flexible querying of analysis data
|
|
73
|
-
CREATE INDEX IF NOT EXISTS idx_analysis_sessions_analysis_data ON analysis_sessions USING GIN(analysis_data);
|
|
74
|
-
|
|
75
|
-
-- Indexes for coach feedback
|
|
76
|
-
CREATE INDEX IF NOT EXISTS idx_coach_feedback_session_id ON coach_feedback(analysis_session_id);
|
|
77
|
-
CREATE INDEX IF NOT EXISTS idx_coach_feedback_coach_id ON coach_feedback(coach_user_id);
|
|
78
|
-
CREATE INDEX IF NOT EXISTS idx_coach_feedback_created_at ON coach_feedback(created_at DESC);
|
|
79
|
-
|
|
80
|
-
-- Row Level Security (RLS)
|
|
81
|
-
|
|
82
|
-
-- Enable RLS on both tables
|
|
83
|
-
ALTER TABLE analysis_sessions ENABLE ROW LEVEL SECURITY;
|
|
84
|
-
ALTER TABLE coach_feedback ENABLE ROW LEVEL SECURITY;
|
|
85
|
-
|
|
86
|
-
-- RLS Policies for analysis_sessions
|
|
87
|
-
-- Users can read their own analysis sessions
|
|
88
|
-
CREATE POLICY "Users can view own analysis sessions" ON analysis_sessions
|
|
89
|
-
FOR SELECT USING (auth.uid() = user_id);
|
|
90
|
-
|
|
91
|
-
-- Users can insert their own analysis sessions
|
|
92
|
-
CREATE POLICY "Users can insert own analysis sessions" ON analysis_sessions
|
|
93
|
-
FOR INSERT WITH CHECK (auth.uid() = user_id);
|
|
94
|
-
|
|
95
|
-
-- Users can update their own analysis sessions
|
|
96
|
-
CREATE POLICY "Users can update own analysis sessions" ON analysis_sessions
|
|
97
|
-
FOR UPDATE USING (auth.uid() = user_id);
|
|
98
|
-
|
|
99
|
-
-- Users can delete their own analysis sessions
|
|
100
|
-
CREATE POLICY "Users can delete own analysis sessions" ON analysis_sessions
|
|
101
|
-
FOR DELETE USING (auth.uid() = user_id);
|
|
102
|
-
|
|
103
|
-
-- RLS Policies for coach_feedback
|
|
104
|
-
-- All authenticated users can view feedback (for collaboration)
|
|
105
|
-
CREATE POLICY "Authenticated users can view feedback" ON coach_feedback
|
|
106
|
-
FOR SELECT USING (auth.role() = 'authenticated');
|
|
107
|
-
|
|
108
|
-
-- All authenticated users can insert feedback
|
|
109
|
-
CREATE POLICY "Authenticated users can create feedback" ON coach_feedback
|
|
110
|
-
FOR INSERT WITH CHECK (auth.role() = 'authenticated');
|
|
111
|
-
|
|
112
|
-
-- Users can update their own feedback
|
|
113
|
-
CREATE POLICY "Users can update own feedback" ON coach_feedback
|
|
114
|
-
FOR UPDATE USING (auth.uid() = coach_user_id);
|
|
115
|
-
|
|
116
|
-
-- Users can delete their own feedback
|
|
117
|
-
CREATE POLICY "Users can delete own feedback" ON coach_feedback
|
|
118
|
-
FOR DELETE USING (auth.uid() = coach_user_id);
|
|
119
|
-
|
|
120
|
-
-- Grant permissions
|
|
121
|
-
GRANT ALL ON analysis_sessions TO authenticated;
|
|
122
|
-
GRANT ALL ON coach_feedback TO authenticated;
|
|
123
|
-
GRANT ALL ON analysis_sessions TO service_role;
|
|
124
|
-
GRANT ALL ON coach_feedback TO service_role;
|
|
125
|
-
|
|
126
|
-
-- Optional: Create a view for common queries
|
|
127
|
-
CREATE OR REPLACE VIEW analysis_sessions_with_feedback AS
|
|
128
|
-
SELECT
|
|
129
|
-
a.*,
|
|
130
|
-
COALESCE(
|
|
131
|
-
json_agg(
|
|
132
|
-
json_build_object(
|
|
133
|
-
'id', f.id,
|
|
134
|
-
'coach_user_id', f.coach_user_id,
|
|
135
|
-
'notes', f.notes,
|
|
136
|
-
'rating', f.rating,
|
|
137
|
-
'tags', f.tags,
|
|
138
|
-
'created_at', f.created_at
|
|
139
|
-
) ORDER BY f.created_at DESC
|
|
140
|
-
) FILTER (WHERE f.id IS NOT NULL),
|
|
141
|
-
'[]'::json
|
|
142
|
-
) as feedback
|
|
143
|
-
FROM analysis_sessions a
|
|
144
|
-
LEFT JOIN coach_feedback f ON a.id = f.analysis_session_id
|
|
145
|
-
GROUP BY a.id, a.user_id, a.jump_type, a.quality_preset,
|
|
146
|
-
a.original_video_url, a.debug_video_url, a.results_json_url,
|
|
147
|
-
a.analysis_data, a.processing_time_s, a.upload_id,
|
|
148
|
-
a.created_at, a.updated_at;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Supabase client configuration for Kinemotion frontend
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { createClient } from '@supabase/supabase-js'
|
|
6
|
-
|
|
7
|
-
const supabaseUrl = import.meta.env.VITE_SUPABASE_URL
|
|
8
|
-
const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY
|
|
9
|
-
|
|
10
|
-
const isConfigured = supabaseUrl && supabaseAnonKey
|
|
11
|
-
|
|
12
|
-
if (!isConfigured) {
|
|
13
|
-
console.warn(
|
|
14
|
-
'Missing Supabase environment variables (VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY). Authentication will be mocked.'
|
|
15
|
-
)
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const supabase = isConfigured
|
|
19
|
-
? createClient(supabaseUrl, supabaseAnonKey)
|
|
20
|
-
: null
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/api/supabase-authentication-setup-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/authentication/supabase-quick-start-guide.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kinemotion-0.60.1 → kinemotion-0.61.0}/.basic-memory/codebase/codebase-architecture-overview.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|