taprivo 0.1.0b4__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.
- taprivo-0.1.0b4/.editorconfig +12 -0
- taprivo-0.1.0b4/.github/CODEOWNERS +1 -0
- taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/bug_report.yml +35 -0
- taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/config.yml +5 -0
- taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/feature_request.yml +27 -0
- taprivo-0.1.0b4/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- taprivo-0.1.0b4/.github/dependabot.yml +11 -0
- taprivo-0.1.0b4/.github/workflows/ci.yml +52 -0
- taprivo-0.1.0b4/.github/workflows/publish.yml +50 -0
- taprivo-0.1.0b4/.gitignore +16 -0
- taprivo-0.1.0b4/.pre-commit-config.yaml +18 -0
- taprivo-0.1.0b4/.python-version +1 -0
- taprivo-0.1.0b4/CHANGELOG.md +91 -0
- taprivo-0.1.0b4/CODE_OF_CONDUCT.md +85 -0
- taprivo-0.1.0b4/CONTRIBUTING.md +52 -0
- taprivo-0.1.0b4/GOVERNANCE.md +10 -0
- taprivo-0.1.0b4/LICENSE +202 -0
- taprivo-0.1.0b4/PKG-INFO +303 -0
- taprivo-0.1.0b4/README.md +273 -0
- taprivo-0.1.0b4/README.tr.md +275 -0
- taprivo-0.1.0b4/ROADMAP.md +27 -0
- taprivo-0.1.0b4/SECURITY.md +40 -0
- taprivo-0.1.0b4/SUPPORT.md +6 -0
- taprivo-0.1.0b4/THIRD_PARTY_NOTICES.md +25 -0
- taprivo-0.1.0b4/examples/agent-instructions/taprivo.md +15 -0
- taprivo-0.1.0b4/examples/project-config/mcp.json +9 -0
- taprivo-0.1.0b4/packaging/macos/README.md +118 -0
- taprivo-0.1.0b4/packaging/macos/build.sh +232 -0
- taprivo-0.1.0b4/packaging/macos/entitlements.plist +12 -0
- taprivo-0.1.0b4/packaging/macos/launcher.py +17 -0
- taprivo-0.1.0b4/packaging/macos/taprivo.spec +204 -0
- taprivo-0.1.0b4/pyproject.toml +85 -0
- taprivo-0.1.0b4/src/taprivo/__init__.py +3 -0
- taprivo-0.1.0b4/src/taprivo/adapters/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/adapters/base.py +158 -0
- taprivo-0.1.0b4/src/taprivo/adapters/claude.py +377 -0
- taprivo-0.1.0b4/src/taprivo/adapters/cursor.py +345 -0
- taprivo-0.1.0b4/src/taprivo/cli.py +756 -0
- taprivo-0.1.0b4/src/taprivo/config.py +181 -0
- taprivo-0.1.0b4/src/taprivo/core/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/core/combo.py +47 -0
- taprivo-0.1.0b4/src/taprivo/core/energy.py +368 -0
- taprivo-0.1.0b4/src/taprivo/core/events.py +43 -0
- taprivo-0.1.0b4/src/taprivo/core/rhythm.py +85 -0
- taprivo-0.1.0b4/src/taprivo/core/session.py +69 -0
- taprivo-0.1.0b4/src/taprivo/core/state.py +53 -0
- taprivo-0.1.0b4/src/taprivo/core/stats_sink.py +53 -0
- taprivo-0.1.0b4/src/taprivo/core/stats_store.py +261 -0
- taprivo-0.1.0b4/src/taprivo/logging_setup.py +27 -0
- taprivo-0.1.0b4/src/taprivo/mcp/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/mcp/client.py +154 -0
- taprivo-0.1.0b4/src/taprivo/mcp/schemas.py +91 -0
- taprivo-0.1.0b4/src/taprivo/mcp/security.py +103 -0
- taprivo-0.1.0b4/src/taprivo/mcp/server.py +274 -0
- taprivo-0.1.0b4/src/taprivo/paths.py +95 -0
- taprivo-0.1.0b4/src/taprivo/py.typed +0 -0
- taprivo-0.1.0b4/src/taprivo/resources/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/resources/agent-instructions.md +15 -0
- taprivo-0.1.0b4/src/taprivo/resources/default.yaml +49 -0
- taprivo-0.1.0b4/src/taprivo/resources/models/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/resources/models/hand_landmarker.task +0 -0
- taprivo-0.1.0b4/src/taprivo/simulator.py +100 -0
- taprivo-0.1.0b4/src/taprivo/ui/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/ui/app.py +92 -0
- taprivo-0.1.0b4/src/taprivo/ui/bridge.py +20 -0
- taprivo-0.1.0b4/src/taprivo/ui/camera_window.py +527 -0
- taprivo-0.1.0b4/src/taprivo/ui/hud.py +315 -0
- taprivo-0.1.0b4/src/taprivo/ui/theme.py +168 -0
- taprivo-0.1.0b4/src/taprivo/ui/vision_bridge.py +38 -0
- taprivo-0.1.0b4/src/taprivo/ui/widgets.py +222 -0
- taprivo-0.1.0b4/src/taprivo/vision/__init__.py +0 -0
- taprivo-0.1.0b4/src/taprivo/vision/calibration.py +217 -0
- taprivo-0.1.0b4/src/taprivo/vision/camera.py +144 -0
- taprivo-0.1.0b4/src/taprivo/vision/controller.py +140 -0
- taprivo-0.1.0b4/src/taprivo/vision/features.py +50 -0
- taprivo-0.1.0b4/src/taprivo/vision/frames.py +46 -0
- taprivo-0.1.0b4/src/taprivo/vision/squeeze.py +191 -0
- taprivo-0.1.0b4/src/taprivo/vision/tracker.py +156 -0
- taprivo-0.1.0b4/src/taprivo/vision/worker.py +221 -0
- taprivo-0.1.0b4/tests/__init__.py +0 -0
- taprivo-0.1.0b4/tests/conftest.py +35 -0
- taprivo-0.1.0b4/tests/fixtures/__init__.py +0 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/README.md +36 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/spike-2026-09-08.csv +629 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/spike-2026-09-08.events.json +1 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/squeeze-2026-09-09.csv +1276 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/squeeze-2026-09-09.events.json +1177 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/typing-2026-09-09.csv +1913 -0
- taprivo-0.1.0b4/tests/fixtures/landmarks/typing-2026-09-09.events.json +77 -0
- taprivo-0.1.0b4/tests/integration/__init__.py +0 -0
- taprivo-0.1.0b4/tests/integration/conftest.py +60 -0
- taprivo-0.1.0b4/tests/integration/test_cli_doctor.py +92 -0
- taprivo-0.1.0b4/tests/integration/test_cli_status.py +115 -0
- taprivo-0.1.0b4/tests/integration/test_http_security.py +101 -0
- taprivo-0.1.0b4/tests/integration/test_http_tools.py +137 -0
- taprivo-0.1.0b4/tests/integration/test_vision_worker.py +288 -0
- taprivo-0.1.0b4/tests/manual/camera-matrix.md +19 -0
- taprivo-0.1.0b4/tests/ui/__init__.py +0 -0
- taprivo-0.1.0b4/tests/ui/conftest.py +48 -0
- taprivo-0.1.0b4/tests/ui/test_app_launch.py +122 -0
- taprivo-0.1.0b4/tests/ui/test_camera_window.py +363 -0
- taprivo-0.1.0b4/tests/ui/test_hud.py +199 -0
- taprivo-0.1.0b4/tests/ui/test_theme.py +34 -0
- taprivo-0.1.0b4/tests/ui/test_widgets.py +99 -0
- taprivo-0.1.0b4/tests/unit/__init__.py +0 -0
- taprivo-0.1.0b4/tests/unit/test_adapter_helpers.py +92 -0
- taprivo-0.1.0b4/tests/unit/test_calibration.py +196 -0
- taprivo-0.1.0b4/tests/unit/test_camera.py +154 -0
- taprivo-0.1.0b4/tests/unit/test_claude_adapter.py +229 -0
- taprivo-0.1.0b4/tests/unit/test_cli_basic.py +66 -0
- taprivo-0.1.0b4/tests/unit/test_cli_camera.py +229 -0
- taprivo-0.1.0b4/tests/unit/test_cli_setup.py +166 -0
- taprivo-0.1.0b4/tests/unit/test_cli_stats.py +140 -0
- taprivo-0.1.0b4/tests/unit/test_client_probe.py +49 -0
- taprivo-0.1.0b4/tests/unit/test_combo.py +77 -0
- taprivo-0.1.0b4/tests/unit/test_config.py +227 -0
- taprivo-0.1.0b4/tests/unit/test_cursor_adapter.py +229 -0
- taprivo-0.1.0b4/tests/unit/test_energy.py +446 -0
- taprivo-0.1.0b4/tests/unit/test_engine_stats.py +213 -0
- taprivo-0.1.0b4/tests/unit/test_events.py +38 -0
- taprivo-0.1.0b4/tests/unit/test_features.py +81 -0
- taprivo-0.1.0b4/tests/unit/test_layering.py +84 -0
- taprivo-0.1.0b4/tests/unit/test_logging_setup.py +16 -0
- taprivo-0.1.0b4/tests/unit/test_mcp_tools.py +224 -0
- taprivo-0.1.0b4/tests/unit/test_model_asset.py +10 -0
- taprivo-0.1.0b4/tests/unit/test_no_telemetry.py +32 -0
- taprivo-0.1.0b4/tests/unit/test_paths.py +80 -0
- taprivo-0.1.0b4/tests/unit/test_rhythm.py +145 -0
- taprivo-0.1.0b4/tests/unit/test_session.py +64 -0
- taprivo-0.1.0b4/tests/unit/test_simulator.py +145 -0
- taprivo-0.1.0b4/tests/unit/test_squeeze.py +227 -0
- taprivo-0.1.0b4/tests/unit/test_stats_store.py +183 -0
- taprivo-0.1.0b4/tests/unit/test_token_bucket.py +12 -0
- taprivo-0.1.0b4/tests/unit/test_tracker.py +208 -0
- taprivo-0.1.0b4/tests/unit/test_version.py +8 -0
- taprivo-0.1.0b4/tests/unit/test_vision_controller.py +94 -0
- taprivo-0.1.0b4/tests/vision_helpers.py +153 -0
- taprivo-0.1.0b4/uv.lock +1321 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
* @yorulmazsinan
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
name: Bug report
|
|
2
|
+
description: Report a reproducible Taprivo problem
|
|
3
|
+
title: "[Bug]: "
|
|
4
|
+
labels: [bug, needs-triage]
|
|
5
|
+
body:
|
|
6
|
+
- type: input
|
|
7
|
+
id: version
|
|
8
|
+
attributes:
|
|
9
|
+
label: Taprivo version and installation method
|
|
10
|
+
validations:
|
|
11
|
+
required: true
|
|
12
|
+
- type: input
|
|
13
|
+
id: environment
|
|
14
|
+
attributes:
|
|
15
|
+
label: macOS version, Mac chip, camera and agent version
|
|
16
|
+
validations:
|
|
17
|
+
required: true
|
|
18
|
+
- type: textarea
|
|
19
|
+
id: reproduce
|
|
20
|
+
attributes:
|
|
21
|
+
label: Steps to reproduce
|
|
22
|
+
description: Include a simulator reproduction if possible. Do not upload camera footage or secrets.
|
|
23
|
+
validations:
|
|
24
|
+
required: true
|
|
25
|
+
- type: textarea
|
|
26
|
+
id: result
|
|
27
|
+
attributes:
|
|
28
|
+
label: Expected and actual behavior
|
|
29
|
+
validations:
|
|
30
|
+
required: true
|
|
31
|
+
- type: textarea
|
|
32
|
+
id: diagnostics
|
|
33
|
+
attributes:
|
|
34
|
+
label: Redacted diagnostics
|
|
35
|
+
description: Output of `taprivo doctor --json`. Review it before sharing; remove tokens and private paths.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: Feature request
|
|
2
|
+
description: Suggest a change or addition
|
|
3
|
+
title: "[Feature]: "
|
|
4
|
+
labels: [enhancement, needs-triage]
|
|
5
|
+
body:
|
|
6
|
+
- type: textarea
|
|
7
|
+
id: problem
|
|
8
|
+
attributes:
|
|
9
|
+
label: Problem
|
|
10
|
+
description: What is hard or missing today?
|
|
11
|
+
validations:
|
|
12
|
+
required: true
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: proposal
|
|
15
|
+
attributes:
|
|
16
|
+
label: Proposed behavior
|
|
17
|
+
validations:
|
|
18
|
+
required: true
|
|
19
|
+
- type: textarea
|
|
20
|
+
id: alternatives
|
|
21
|
+
attributes:
|
|
22
|
+
label: Alternatives considered
|
|
23
|
+
- type: dropdown
|
|
24
|
+
id: phase
|
|
25
|
+
attributes:
|
|
26
|
+
label: Related roadmap phase
|
|
27
|
+
options: ["0.1 MVP", "0.2 Game engine", "0.3 Stats", "0.4 Calibration / adapters", "Not sure"]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
## What changes for the user?
|
|
2
|
+
|
|
3
|
+
Describe the problem and the resulting behavior. Link the issue if relevant.
|
|
4
|
+
|
|
5
|
+
## Validation
|
|
6
|
+
|
|
7
|
+
List the tests or manual checks you ran and their results.
|
|
8
|
+
For detector or energy changes, include false-positive and missed-tap observations.
|
|
9
|
+
For HUD changes, attach a screenshot.
|
|
10
|
+
|
|
11
|
+
## Compatibility and data
|
|
12
|
+
|
|
13
|
+
Note any MCP schema, config, dependency, privacy or migration impact.
|
|
14
|
+
Write "none" if there is no impact.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
|
|
11
|
+
concurrency:
|
|
12
|
+
group: ci-${{ github.ref }}
|
|
13
|
+
cancel-in-progress: true
|
|
14
|
+
|
|
15
|
+
jobs:
|
|
16
|
+
test:
|
|
17
|
+
name: ${{ matrix.os }} / py${{ matrix.python }}
|
|
18
|
+
runs-on: ${{ matrix.os }}
|
|
19
|
+
strategy:
|
|
20
|
+
fail-fast: false
|
|
21
|
+
matrix:
|
|
22
|
+
os: [ubuntu-latest, macos-latest]
|
|
23
|
+
python: ["3.12", "3.13"]
|
|
24
|
+
steps:
|
|
25
|
+
- name: Check out
|
|
26
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
29
|
+
with:
|
|
30
|
+
python-version: ${{ matrix.python }}
|
|
31
|
+
enable-cache: true
|
|
32
|
+
- name: Install Qt and MediaPipe runtime libraries (Linux)
|
|
33
|
+
if: runner.os == 'Linux'
|
|
34
|
+
run: |
|
|
35
|
+
sudo apt-get update
|
|
36
|
+
sudo apt-get install -y --no-install-recommends libegl1 libgl1 libxkbcommon0 libdbus-1-3 libfontconfig1 libglib2.0-0 libgles2
|
|
37
|
+
- name: Report runner architecture
|
|
38
|
+
run: uname -m
|
|
39
|
+
- name: Sync
|
|
40
|
+
run: uv sync --dev --locked
|
|
41
|
+
- name: Lint
|
|
42
|
+
run: uv run ruff check .
|
|
43
|
+
- name: Format
|
|
44
|
+
run: uv run ruff format --check .
|
|
45
|
+
- name: Type check
|
|
46
|
+
run: uv run mypy
|
|
47
|
+
- name: Test
|
|
48
|
+
env:
|
|
49
|
+
QT_QPA_PLATFORM: offscreen
|
|
50
|
+
run: uv run pytest -q
|
|
51
|
+
- name: Build wheel
|
|
52
|
+
run: uv build
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
permissions:
|
|
8
|
+
contents: read
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
build:
|
|
12
|
+
name: Build distributions
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
steps:
|
|
15
|
+
- name: Check out
|
|
16
|
+
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
17
|
+
- name: Install uv
|
|
18
|
+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
- name: Build sdist and wheel
|
|
22
|
+
run: uv build
|
|
23
|
+
- name: Check that the tag matches the package version
|
|
24
|
+
run: |
|
|
25
|
+
version=$(uv run --no-sync python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
26
|
+
test "v$version" = "${GITHUB_REF_NAME}" || { echo "tag ${GITHUB_REF_NAME} does not match version $version"; exit 1; }
|
|
27
|
+
- name: Upload distributions
|
|
28
|
+
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
|
29
|
+
with:
|
|
30
|
+
name: dist
|
|
31
|
+
path: dist/
|
|
32
|
+
if-no-files-found: error
|
|
33
|
+
|
|
34
|
+
publish:
|
|
35
|
+
name: Publish to PyPI
|
|
36
|
+
needs: build
|
|
37
|
+
runs-on: ubuntu-latest
|
|
38
|
+
environment:
|
|
39
|
+
name: pypi
|
|
40
|
+
url: https://pypi.org/project/taprivo/
|
|
41
|
+
permissions:
|
|
42
|
+
id-token: write
|
|
43
|
+
steps:
|
|
44
|
+
- name: Download distributions
|
|
45
|
+
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
|
46
|
+
with:
|
|
47
|
+
name: dist
|
|
48
|
+
path: dist/
|
|
49
|
+
- name: Publish
|
|
50
|
+
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: local
|
|
3
|
+
hooks:
|
|
4
|
+
- id: ruff-check
|
|
5
|
+
name: ruff check
|
|
6
|
+
entry: uv run ruff check --fix
|
|
7
|
+
language: system
|
|
8
|
+
types: [python]
|
|
9
|
+
- id: ruff-format
|
|
10
|
+
name: ruff format
|
|
11
|
+
entry: uv run ruff format
|
|
12
|
+
language: system
|
|
13
|
+
types: [python]
|
|
14
|
+
- id: mypy
|
|
15
|
+
name: mypy
|
|
16
|
+
entry: uv run mypy
|
|
17
|
+
language: system
|
|
18
|
+
pass_filenames: false
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.12
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format follows
|
|
4
|
+
Keep a Changelog and the project uses Semantic Versioning.
|
|
5
|
+
|
|
6
|
+
## [Unreleased]
|
|
7
|
+
|
|
8
|
+
## [0.1.0b4] - 2026-09-09
|
|
9
|
+
|
|
10
|
+
Beta preview with a signed macOS app and a PyPI package.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- Signed and notarized macOS app bundle (DMG, Apple Silicon) built with `packaging/macos/build.sh`; Gatekeeper assessment now runs after stapling and dangling symlinks left by trimmed Qt frameworks are pruned before signing.
|
|
14
|
+
- Releases publish to PyPI automatically through trusted publishing; install with `uv tool install taprivo`.
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- macOS packaging script: `packaging/macos/build.sh` builds a standalone `Taprivo.app` with PyInstaller and can sign it with a Developer ID, notarize it and wrap it in a DMG (`build`, `sign`, `notarize`, `dmg`, `all`). Apple Silicon only; see `packaging/macos/README.md`.
|
|
18
|
+
|
|
19
|
+
## [0.1.0b3] - 2026-09-09
|
|
20
|
+
|
|
21
|
+
Beta preview with a Cursor adapter, persistent statistics and a rhythm bonus.
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
- Steady-beat bonus: taps that hold an even tempo between 60 and 240 BPM are worth 1.25× more energy (`rhythm.steady_multiplier`), stacked on the combo multiplier. The HUD rate line shows the tempo and highlights it while the beat holds, `taprivo stats` prints a `Rhythm:` line, and `get_stats` reports `bpm`, `rhythm_steady` and `rhythm_multiplier`.
|
|
25
|
+
- Cursor adapter: `taprivo setup cursor` registers the MCP endpoint in `~/.cursor/mcp.json` (mode 0600, backup first), `--install-instructions` writes `~/.cursor/taprivo.md` and, with `--project`, a `.cursor/rules/taprivo.mdc` rule; `taprivo remove cursor` undoes it and `taprivo doctor` reports the Cursor registration and instruction checks.
|
|
26
|
+
- Project `.cursor/mcp.json` entries reference `${env:TAPRIVO_TOKEN}` instead of the literal token.
|
|
27
|
+
- `--json` output for the `setup` and `remove` commands of both agents, which now share one code path.
|
|
28
|
+
- Global install instructions: `uv tool install` (or pipx) from the tagged repository, with upgrade and uninstall commands.
|
|
29
|
+
- Persistent statistics: each session and its daily totals are stored in `~/.config/taprivo/stats.sqlite` (counters and timestamps only, no spend reasons and no camera data), with a new `stats` config section (`enabled`, `path`).
|
|
30
|
+
- `taprivo stats --today` and `taprivo stats --history [--days N]` read that file directly, so they work while Taprivo is not running; both support `--json`.
|
|
31
|
+
- Plain `taprivo stats` shows a `Today:` line with the day's sessions, taps and energy.
|
|
32
|
+
- MCP `get_stats` gained an additive `today` object (`sessions`, `taps_total`, `generated`, `spent`, `active_seconds`), null when statistics are disabled or the day is empty.
|
|
33
|
+
|
|
34
|
+
## [0.1.0b2] - 2026-09-09
|
|
35
|
+
|
|
36
|
+
Beta preview with two-hand keyboard drumming.
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
- Keyboard drumming with two hands: the left hand taps `1` `2` `3` `4` (pinky to index) and the right hand `7` `8` `9` `0` (index to pinky), with a chip per key in the HUD and per-hand counts in `get_stats` and `taprivo stats`.
|
|
40
|
+
- A sliding one-second tap cap shared by both hands (`simulator.max_taps_per_second`, default 12); taps above it are ignored, and key auto-repeat never counts.
|
|
41
|
+
- Combo multiplier tiers (`combo.tiers`, by default 1.5× from 10 consecutive taps and 2× from 25), shown on the HUD combo line and reported as `combo_multiplier` by `get_stats`.
|
|
42
|
+
|
|
43
|
+
### Changed
|
|
44
|
+
- The combo energy multiplier is on by default (`combo.energy_multiplier_enabled: true`); each tap is worth `energy_per_tap` times the multiplier the combo has reached.
|
|
45
|
+
- Keys `1`–`5` no longer tap thumb…pinky of a single hand; the two-hand mapping replaces them, and keys `5` and `6` do nothing.
|
|
46
|
+
- The HUD window is wider so that four key chips fit a row per hand.
|
|
47
|
+
|
|
48
|
+
## [0.1.0b1] - 2026-09-09
|
|
49
|
+
|
|
50
|
+
Beta preview. Install from source with `uv sync`; there is no signed
|
|
51
|
+
macOS package yet.
|
|
52
|
+
|
|
53
|
+
### Added
|
|
54
|
+
- Camera-based squeeze detection (open → fist → open) with MediaPipe hand landmarks; two hands tracked independently; one squeeze counts as five taps (50 energy).
|
|
55
|
+
- Camera window: device probing with no-signal detection, live preview, per-hand openness meters, guided calibration with session levels and feature-only CSV export.
|
|
56
|
+
- Redesigned HUD and Camera window with a dark/light theme; new `hud.theme` config key (`system`, `dark`, `light`).
|
|
57
|
+
- CLI: `taprivo camera list`, `taprivo calibrate`; `status` shows camera fps and hand detection ratio; `doctor` checks the bundled model, mediapipe and camera devices, and `doctor --camera-probe` opens the camera to check permission and measure processed fps.
|
|
58
|
+
- MCP `get_session` fields `camera_fps` and `detection_ratio`.
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
- Pin mediapipe to 0.10.33; a test fails if the installed wheel contains telemetry code.
|
|
62
|
+
- Product framing: the camera counts whole-hand squeezes rather than per-finger taps; finger tapping stays with the keyboard simulator.
|
|
63
|
+
- The squeeze detector ignores hands that are partly outside the camera frame (extrapolated fingers caused false cycles when a hand slid out of view).
|
|
64
|
+
|
|
65
|
+
### Known limitations
|
|
66
|
+
- Good lighting and a fully visible hand are needed; typing with hands in view can occasionally register a squeeze.
|
|
67
|
+
|
|
68
|
+
## [0.1.0a1] - 2026-09-08
|
|
69
|
+
|
|
70
|
+
Developer preview. Install from source with `uv sync`; there is no signed
|
|
71
|
+
macOS package yet.
|
|
72
|
+
|
|
73
|
+
### Added
|
|
74
|
+
- Keyboard simulator producing tap events for thumb to pinky.
|
|
75
|
+
- Energy engine with a 10,000 cap, overflow accounting, atomic spending and
|
|
76
|
+
per-session idempotency.
|
|
77
|
+
- PySide6 HUD with energy bar, per-finger counts, combo, rate, MCP status.
|
|
78
|
+
- Loopback MCP server (Streamable HTTP) with `get_energy`, `spend_energy`,
|
|
79
|
+
`get_stats`, `get_session`; bearer token, Host/Origin checks, rate limit.
|
|
80
|
+
- CLI: `simulate`, `status`, `stats`, `setup claude`, `remove claude`, `doctor`.
|
|
81
|
+
|
|
82
|
+
### Known limitations
|
|
83
|
+
- No camera support yet; the balance resets when the app quits.
|
|
84
|
+
- Only Claude Code is tested as an MCP client.
|
|
85
|
+
|
|
86
|
+
[Unreleased]: https://github.com/yorulmazsinan/taprivo/compare/v0.1.0b4...HEAD
|
|
87
|
+
[0.1.0b4]: https://github.com/yorulmazsinan/taprivo/releases/tag/v0.1.0b4
|
|
88
|
+
[0.1.0b3]: https://github.com/yorulmazsinan/taprivo/releases/tag/v0.1.0b3
|
|
89
|
+
[0.1.0b2]: https://github.com/yorulmazsinan/taprivo/releases/tag/v0.1.0b2
|
|
90
|
+
[0.1.0b1]: https://github.com/yorulmazsinan/taprivo/releases/tag/v0.1.0b1
|
|
91
|
+
[0.1.0a1]: https://github.com/yorulmazsinan/taprivo/releases/tag/v0.1.0a1
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
|
|
2
|
+
# Contributor Covenant Code of Conduct
|
|
3
|
+
|
|
4
|
+
## Our Pledge
|
|
5
|
+
|
|
6
|
+
We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation.
|
|
7
|
+
|
|
8
|
+
We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community.
|
|
9
|
+
|
|
10
|
+
## Our Standards
|
|
11
|
+
|
|
12
|
+
Examples of behavior that contributes to a positive environment for our community include:
|
|
13
|
+
|
|
14
|
+
* Demonstrating empathy and kindness toward other people
|
|
15
|
+
* Being respectful of differing opinions, viewpoints, and experiences
|
|
16
|
+
* Giving and gracefully accepting constructive feedback
|
|
17
|
+
* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience
|
|
18
|
+
* Focusing on what is best not just for us as individuals, but for the overall community
|
|
19
|
+
|
|
20
|
+
Examples of unacceptable behavior include:
|
|
21
|
+
|
|
22
|
+
* The use of sexualized language or imagery, and sexual attention or advances of any kind
|
|
23
|
+
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
24
|
+
* Public or private harassment
|
|
25
|
+
* Publishing others' private information, such as a physical or email address, without their explicit permission
|
|
26
|
+
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
|
27
|
+
|
|
28
|
+
## Enforcement Responsibilities
|
|
29
|
+
|
|
30
|
+
Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful.
|
|
31
|
+
|
|
32
|
+
Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate.
|
|
33
|
+
|
|
34
|
+
## Scope
|
|
35
|
+
|
|
36
|
+
This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event.
|
|
37
|
+
|
|
38
|
+
## Enforcement
|
|
39
|
+
|
|
40
|
+
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at info@sinanyorulmaz.com. All complaints will be reviewed and investigated promptly and fairly.
|
|
41
|
+
|
|
42
|
+
All community leaders are obligated to respect the privacy and security of the reporter of any incident.
|
|
43
|
+
|
|
44
|
+
## Enforcement Guidelines
|
|
45
|
+
|
|
46
|
+
Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct:
|
|
47
|
+
|
|
48
|
+
### 1. Correction
|
|
49
|
+
|
|
50
|
+
**Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community.
|
|
51
|
+
|
|
52
|
+
**Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested.
|
|
53
|
+
|
|
54
|
+
### 2. Warning
|
|
55
|
+
|
|
56
|
+
**Community Impact**: A violation through a single incident or series of actions.
|
|
57
|
+
|
|
58
|
+
**Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban.
|
|
59
|
+
|
|
60
|
+
### 3. Temporary Ban
|
|
61
|
+
|
|
62
|
+
**Community Impact**: A serious violation of community standards, including sustained inappropriate behavior.
|
|
63
|
+
|
|
64
|
+
**Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban.
|
|
65
|
+
|
|
66
|
+
### 4. Permanent Ban
|
|
67
|
+
|
|
68
|
+
**Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals.
|
|
69
|
+
|
|
70
|
+
**Consequence**: A permanent ban from any sort of public interaction within the community.
|
|
71
|
+
|
|
72
|
+
## Attribution
|
|
73
|
+
|
|
74
|
+
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
|
75
|
+
|
|
76
|
+
Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
|
77
|
+
|
|
78
|
+
For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations].
|
|
79
|
+
|
|
80
|
+
[homepage]: https://www.contributor-covenant.org
|
|
81
|
+
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
|
82
|
+
[Mozilla CoC]: https://github.com/mozilla/diversity
|
|
83
|
+
[FAQ]: https://www.contributor-covenant.org/faq
|
|
84
|
+
[translations]: https://www.contributor-covenant.org/translations
|
|
85
|
+
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Contributing to Taprivo
|
|
2
|
+
|
|
3
|
+
Thanks for helping. You do not need a camera to contribute: the keyboard
|
|
4
|
+
simulator drives the full tap → energy → HUD → MCP path.
|
|
5
|
+
|
|
6
|
+
## Set up
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
uv sync --dev
|
|
10
|
+
uv run taprivo simulate
|
|
11
|
+
uv run pytest
|
|
12
|
+
uv run ruff check .
|
|
13
|
+
uv run ruff format --check .
|
|
14
|
+
uv run mypy
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Workflow
|
|
18
|
+
|
|
19
|
+
1. Start with the simulator and read `README.md`.
|
|
20
|
+
2. Pick a small issue. For larger changes, open an issue first to discuss the design.
|
|
21
|
+
3. Create a branch, change the behaviour, and run the related tests.
|
|
22
|
+
4. HUD changes: attach a screenshot. Detector or energy changes: add a
|
|
23
|
+
synthetic fixture or a unit test that shows the before/after behaviour.
|
|
24
|
+
5. Detector or calibration changes: run the manual protocol in
|
|
25
|
+
`tests/manual/camera-matrix.md` and paste the numbers into the PR.
|
|
26
|
+
6. In the PR, describe the user-visible effect and how you verified it.
|
|
27
|
+
|
|
28
|
+
## Ground rules
|
|
29
|
+
|
|
30
|
+
- Keep camera frames, landmarks, tokens and private paths out of logs, tests
|
|
31
|
+
and issues. Raw camera recordings are never required for a contribution.
|
|
32
|
+
- `core/` stays free of Qt and MCP imports.
|
|
33
|
+
- `vision/` never imports Qt or `mcp/`; mediapipe is imported lazily inside
|
|
34
|
+
`vision/tracker.py` only. Detector or calibration changes must keep the
|
|
35
|
+
pinned fixtures in `tests/fixtures/landmarks/` (`*.csv` + `*.events.json`)
|
|
36
|
+
deliberately regenerated and reviewed.
|
|
37
|
+
- `src/taprivo/ui/app.py` is the composition root and the only `ui/` module
|
|
38
|
+
allowed to import from `mcp/`; `mcp/` never imports `ui/`.
|
|
39
|
+
- Public contract changes (CLI JSON, MCP schemas, config keys) need a note in
|
|
40
|
+
`CHANGELOG.md` and, for anything non-additive, an issue labelled `rfc`.
|
|
41
|
+
- Contributions are accepted under the project's Apache-2.0 license. Tool-assisted
|
|
42
|
+
contributions are welcome; the contributor is responsible for verifying them.
|
|
43
|
+
|
|
44
|
+
## Labels
|
|
45
|
+
|
|
46
|
+
`bug`, `enhancement`, `documentation`, `good first issue`, `help wanted`,
|
|
47
|
+
`needs-triage`, `area:vision`, `area:mcp`, `area:hud`, `area:cli`,
|
|
48
|
+
`platform:macos`, `phase:1`, `phase:2`.
|
|
49
|
+
|
|
50
|
+
## Releases
|
|
51
|
+
|
|
52
|
+
A maintainer bumps the version, tags `vX.Y.Z` and publishes a GitHub release; the `Publish` workflow then builds the sdist and wheel and uploads them to PyPI through trusted publishing (no API tokens are stored in the repository).
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# Governance
|
|
2
|
+
|
|
3
|
+
Taprivo is maintained by its founding maintainer, who has the final say on
|
|
4
|
+
design and releases. Small changes go through pull requests; changes to the
|
|
5
|
+
MCP contract, transports or privacy behaviour go through an issue labelled
|
|
6
|
+
`rfc` before implementation.
|
|
7
|
+
|
|
8
|
+
Additional maintainers are added based on sustained contribution and review
|
|
9
|
+
history. Release permissions stay with a small group. There is no CLA;
|
|
10
|
+
contributions are accepted under the project license.
|