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.
Files changed (138) hide show
  1. taprivo-0.1.0b4/.editorconfig +12 -0
  2. taprivo-0.1.0b4/.github/CODEOWNERS +1 -0
  3. taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/bug_report.yml +35 -0
  4. taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/config.yml +5 -0
  5. taprivo-0.1.0b4/.github/ISSUE_TEMPLATE/feature_request.yml +27 -0
  6. taprivo-0.1.0b4/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  7. taprivo-0.1.0b4/.github/dependabot.yml +11 -0
  8. taprivo-0.1.0b4/.github/workflows/ci.yml +52 -0
  9. taprivo-0.1.0b4/.github/workflows/publish.yml +50 -0
  10. taprivo-0.1.0b4/.gitignore +16 -0
  11. taprivo-0.1.0b4/.pre-commit-config.yaml +18 -0
  12. taprivo-0.1.0b4/.python-version +1 -0
  13. taprivo-0.1.0b4/CHANGELOG.md +91 -0
  14. taprivo-0.1.0b4/CODE_OF_CONDUCT.md +85 -0
  15. taprivo-0.1.0b4/CONTRIBUTING.md +52 -0
  16. taprivo-0.1.0b4/GOVERNANCE.md +10 -0
  17. taprivo-0.1.0b4/LICENSE +202 -0
  18. taprivo-0.1.0b4/PKG-INFO +303 -0
  19. taprivo-0.1.0b4/README.md +273 -0
  20. taprivo-0.1.0b4/README.tr.md +275 -0
  21. taprivo-0.1.0b4/ROADMAP.md +27 -0
  22. taprivo-0.1.0b4/SECURITY.md +40 -0
  23. taprivo-0.1.0b4/SUPPORT.md +6 -0
  24. taprivo-0.1.0b4/THIRD_PARTY_NOTICES.md +25 -0
  25. taprivo-0.1.0b4/examples/agent-instructions/taprivo.md +15 -0
  26. taprivo-0.1.0b4/examples/project-config/mcp.json +9 -0
  27. taprivo-0.1.0b4/packaging/macos/README.md +118 -0
  28. taprivo-0.1.0b4/packaging/macos/build.sh +232 -0
  29. taprivo-0.1.0b4/packaging/macos/entitlements.plist +12 -0
  30. taprivo-0.1.0b4/packaging/macos/launcher.py +17 -0
  31. taprivo-0.1.0b4/packaging/macos/taprivo.spec +204 -0
  32. taprivo-0.1.0b4/pyproject.toml +85 -0
  33. taprivo-0.1.0b4/src/taprivo/__init__.py +3 -0
  34. taprivo-0.1.0b4/src/taprivo/adapters/__init__.py +0 -0
  35. taprivo-0.1.0b4/src/taprivo/adapters/base.py +158 -0
  36. taprivo-0.1.0b4/src/taprivo/adapters/claude.py +377 -0
  37. taprivo-0.1.0b4/src/taprivo/adapters/cursor.py +345 -0
  38. taprivo-0.1.0b4/src/taprivo/cli.py +756 -0
  39. taprivo-0.1.0b4/src/taprivo/config.py +181 -0
  40. taprivo-0.1.0b4/src/taprivo/core/__init__.py +0 -0
  41. taprivo-0.1.0b4/src/taprivo/core/combo.py +47 -0
  42. taprivo-0.1.0b4/src/taprivo/core/energy.py +368 -0
  43. taprivo-0.1.0b4/src/taprivo/core/events.py +43 -0
  44. taprivo-0.1.0b4/src/taprivo/core/rhythm.py +85 -0
  45. taprivo-0.1.0b4/src/taprivo/core/session.py +69 -0
  46. taprivo-0.1.0b4/src/taprivo/core/state.py +53 -0
  47. taprivo-0.1.0b4/src/taprivo/core/stats_sink.py +53 -0
  48. taprivo-0.1.0b4/src/taprivo/core/stats_store.py +261 -0
  49. taprivo-0.1.0b4/src/taprivo/logging_setup.py +27 -0
  50. taprivo-0.1.0b4/src/taprivo/mcp/__init__.py +0 -0
  51. taprivo-0.1.0b4/src/taprivo/mcp/client.py +154 -0
  52. taprivo-0.1.0b4/src/taprivo/mcp/schemas.py +91 -0
  53. taprivo-0.1.0b4/src/taprivo/mcp/security.py +103 -0
  54. taprivo-0.1.0b4/src/taprivo/mcp/server.py +274 -0
  55. taprivo-0.1.0b4/src/taprivo/paths.py +95 -0
  56. taprivo-0.1.0b4/src/taprivo/py.typed +0 -0
  57. taprivo-0.1.0b4/src/taprivo/resources/__init__.py +0 -0
  58. taprivo-0.1.0b4/src/taprivo/resources/agent-instructions.md +15 -0
  59. taprivo-0.1.0b4/src/taprivo/resources/default.yaml +49 -0
  60. taprivo-0.1.0b4/src/taprivo/resources/models/__init__.py +0 -0
  61. taprivo-0.1.0b4/src/taprivo/resources/models/hand_landmarker.task +0 -0
  62. taprivo-0.1.0b4/src/taprivo/simulator.py +100 -0
  63. taprivo-0.1.0b4/src/taprivo/ui/__init__.py +0 -0
  64. taprivo-0.1.0b4/src/taprivo/ui/app.py +92 -0
  65. taprivo-0.1.0b4/src/taprivo/ui/bridge.py +20 -0
  66. taprivo-0.1.0b4/src/taprivo/ui/camera_window.py +527 -0
  67. taprivo-0.1.0b4/src/taprivo/ui/hud.py +315 -0
  68. taprivo-0.1.0b4/src/taprivo/ui/theme.py +168 -0
  69. taprivo-0.1.0b4/src/taprivo/ui/vision_bridge.py +38 -0
  70. taprivo-0.1.0b4/src/taprivo/ui/widgets.py +222 -0
  71. taprivo-0.1.0b4/src/taprivo/vision/__init__.py +0 -0
  72. taprivo-0.1.0b4/src/taprivo/vision/calibration.py +217 -0
  73. taprivo-0.1.0b4/src/taprivo/vision/camera.py +144 -0
  74. taprivo-0.1.0b4/src/taprivo/vision/controller.py +140 -0
  75. taprivo-0.1.0b4/src/taprivo/vision/features.py +50 -0
  76. taprivo-0.1.0b4/src/taprivo/vision/frames.py +46 -0
  77. taprivo-0.1.0b4/src/taprivo/vision/squeeze.py +191 -0
  78. taprivo-0.1.0b4/src/taprivo/vision/tracker.py +156 -0
  79. taprivo-0.1.0b4/src/taprivo/vision/worker.py +221 -0
  80. taprivo-0.1.0b4/tests/__init__.py +0 -0
  81. taprivo-0.1.0b4/tests/conftest.py +35 -0
  82. taprivo-0.1.0b4/tests/fixtures/__init__.py +0 -0
  83. taprivo-0.1.0b4/tests/fixtures/landmarks/README.md +36 -0
  84. taprivo-0.1.0b4/tests/fixtures/landmarks/spike-2026-09-08.csv +629 -0
  85. taprivo-0.1.0b4/tests/fixtures/landmarks/spike-2026-09-08.events.json +1 -0
  86. taprivo-0.1.0b4/tests/fixtures/landmarks/squeeze-2026-09-09.csv +1276 -0
  87. taprivo-0.1.0b4/tests/fixtures/landmarks/squeeze-2026-09-09.events.json +1177 -0
  88. taprivo-0.1.0b4/tests/fixtures/landmarks/typing-2026-09-09.csv +1913 -0
  89. taprivo-0.1.0b4/tests/fixtures/landmarks/typing-2026-09-09.events.json +77 -0
  90. taprivo-0.1.0b4/tests/integration/__init__.py +0 -0
  91. taprivo-0.1.0b4/tests/integration/conftest.py +60 -0
  92. taprivo-0.1.0b4/tests/integration/test_cli_doctor.py +92 -0
  93. taprivo-0.1.0b4/tests/integration/test_cli_status.py +115 -0
  94. taprivo-0.1.0b4/tests/integration/test_http_security.py +101 -0
  95. taprivo-0.1.0b4/tests/integration/test_http_tools.py +137 -0
  96. taprivo-0.1.0b4/tests/integration/test_vision_worker.py +288 -0
  97. taprivo-0.1.0b4/tests/manual/camera-matrix.md +19 -0
  98. taprivo-0.1.0b4/tests/ui/__init__.py +0 -0
  99. taprivo-0.1.0b4/tests/ui/conftest.py +48 -0
  100. taprivo-0.1.0b4/tests/ui/test_app_launch.py +122 -0
  101. taprivo-0.1.0b4/tests/ui/test_camera_window.py +363 -0
  102. taprivo-0.1.0b4/tests/ui/test_hud.py +199 -0
  103. taprivo-0.1.0b4/tests/ui/test_theme.py +34 -0
  104. taprivo-0.1.0b4/tests/ui/test_widgets.py +99 -0
  105. taprivo-0.1.0b4/tests/unit/__init__.py +0 -0
  106. taprivo-0.1.0b4/tests/unit/test_adapter_helpers.py +92 -0
  107. taprivo-0.1.0b4/tests/unit/test_calibration.py +196 -0
  108. taprivo-0.1.0b4/tests/unit/test_camera.py +154 -0
  109. taprivo-0.1.0b4/tests/unit/test_claude_adapter.py +229 -0
  110. taprivo-0.1.0b4/tests/unit/test_cli_basic.py +66 -0
  111. taprivo-0.1.0b4/tests/unit/test_cli_camera.py +229 -0
  112. taprivo-0.1.0b4/tests/unit/test_cli_setup.py +166 -0
  113. taprivo-0.1.0b4/tests/unit/test_cli_stats.py +140 -0
  114. taprivo-0.1.0b4/tests/unit/test_client_probe.py +49 -0
  115. taprivo-0.1.0b4/tests/unit/test_combo.py +77 -0
  116. taprivo-0.1.0b4/tests/unit/test_config.py +227 -0
  117. taprivo-0.1.0b4/tests/unit/test_cursor_adapter.py +229 -0
  118. taprivo-0.1.0b4/tests/unit/test_energy.py +446 -0
  119. taprivo-0.1.0b4/tests/unit/test_engine_stats.py +213 -0
  120. taprivo-0.1.0b4/tests/unit/test_events.py +38 -0
  121. taprivo-0.1.0b4/tests/unit/test_features.py +81 -0
  122. taprivo-0.1.0b4/tests/unit/test_layering.py +84 -0
  123. taprivo-0.1.0b4/tests/unit/test_logging_setup.py +16 -0
  124. taprivo-0.1.0b4/tests/unit/test_mcp_tools.py +224 -0
  125. taprivo-0.1.0b4/tests/unit/test_model_asset.py +10 -0
  126. taprivo-0.1.0b4/tests/unit/test_no_telemetry.py +32 -0
  127. taprivo-0.1.0b4/tests/unit/test_paths.py +80 -0
  128. taprivo-0.1.0b4/tests/unit/test_rhythm.py +145 -0
  129. taprivo-0.1.0b4/tests/unit/test_session.py +64 -0
  130. taprivo-0.1.0b4/tests/unit/test_simulator.py +145 -0
  131. taprivo-0.1.0b4/tests/unit/test_squeeze.py +227 -0
  132. taprivo-0.1.0b4/tests/unit/test_stats_store.py +183 -0
  133. taprivo-0.1.0b4/tests/unit/test_token_bucket.py +12 -0
  134. taprivo-0.1.0b4/tests/unit/test_tracker.py +208 -0
  135. taprivo-0.1.0b4/tests/unit/test_version.py +8 -0
  136. taprivo-0.1.0b4/tests/unit/test_vision_controller.py +94 -0
  137. taprivo-0.1.0b4/tests/vision_helpers.py +153 -0
  138. taprivo-0.1.0b4/uv.lock +1321 -0
@@ -0,0 +1,12 @@
1
+ root = true
2
+
3
+ [*]
4
+ charset = utf-8
5
+ end_of_line = lf
6
+ insert_final_newline = true
7
+ trim_trailing_whitespace = true
8
+ indent_style = space
9
+ indent_size = 4
10
+
11
+ [*.{yml,yaml,toml,json,md}]
12
+ indent_size = 2
@@ -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,5 @@
1
+ blank_issues_enabled: false
2
+ contact_links:
3
+ - name: Questions and ideas
4
+ url: https://github.com/yorulmazsinan/taprivo/discussions
5
+ about: Ask usage questions or discuss ideas in Discussions.
@@ -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,11 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "uv"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "weekly"
7
+ open-pull-requests-limit: 5
8
+ - package-ecosystem: "github-actions"
9
+ directory: "/"
10
+ schedule:
11
+ interval: "weekly"
@@ -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,16 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *.egg-info/
4
+ build/
5
+ dist/
6
+ .venv/
7
+ .mypy_cache/
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ .hypothesis/
11
+ .coverage
12
+ htmlcov/
13
+ .DS_Store
14
+ .idea/
15
+ .vscode/
16
+ .build/
@@ -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.