openadapt-desktop 0.2.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.
Files changed (61) hide show
  1. openadapt_desktop-0.2.0/.github/workflows/build.yml +106 -0
  2. openadapt_desktop-0.2.0/.github/workflows/notify-docs.yml +14 -0
  3. openadapt_desktop-0.2.0/.github/workflows/release.yml +63 -0
  4. openadapt_desktop-0.2.0/.github/workflows/test.yml +47 -0
  5. openadapt_desktop-0.2.0/.gitignore +64 -0
  6. openadapt_desktop-0.2.0/CHANGELOG.md +166 -0
  7. openadapt_desktop-0.2.0/CLAUDE.md +79 -0
  8. openadapt_desktop-0.2.0/DESIGN.md +1795 -0
  9. openadapt_desktop-0.2.0/LICENSE +21 -0
  10. openadapt_desktop-0.2.0/PKG-INFO +44 -0
  11. openadapt_desktop-0.2.0/README.md +265 -0
  12. openadapt_desktop-0.2.0/engine/__init__.py +24 -0
  13. openadapt_desktop-0.2.0/engine/__main__.py +5 -0
  14. openadapt_desktop-0.2.0/engine/audit.py +125 -0
  15. openadapt_desktop-0.2.0/engine/backends/__init__.py +12 -0
  16. openadapt_desktop-0.2.0/engine/backends/federated.py +117 -0
  17. openadapt_desktop-0.2.0/engine/backends/huggingface.py +160 -0
  18. openadapt_desktop-0.2.0/engine/backends/protocol.py +134 -0
  19. openadapt_desktop-0.2.0/engine/backends/s3.py +173 -0
  20. openadapt_desktop-0.2.0/engine/backends/wormhole.py +99 -0
  21. openadapt_desktop-0.2.0/engine/cli.py +482 -0
  22. openadapt_desktop-0.2.0/engine/config.py +127 -0
  23. openadapt_desktop-0.2.0/engine/controller.py +309 -0
  24. openadapt_desktop-0.2.0/engine/db.py +205 -0
  25. openadapt_desktop-0.2.0/engine/ipc.py +134 -0
  26. openadapt_desktop-0.2.0/engine/main.py +82 -0
  27. openadapt_desktop-0.2.0/engine/monitor.py +148 -0
  28. openadapt_desktop-0.2.0/engine/review.py +199 -0
  29. openadapt_desktop-0.2.0/engine/scrubber.py +234 -0
  30. openadapt_desktop-0.2.0/engine/storage_manager.py +277 -0
  31. openadapt_desktop-0.2.0/engine/upload_manager.py +187 -0
  32. openadapt_desktop-0.2.0/package.json +17 -0
  33. openadapt_desktop-0.2.0/pyproject.toml +84 -0
  34. openadapt_desktop-0.2.0/src/index.html +87 -0
  35. openadapt_desktop-0.2.0/src/review.html +67 -0
  36. openadapt_desktop-0.2.0/src/settings.html +51 -0
  37. openadapt_desktop-0.2.0/src-tauri/Cargo.toml +34 -0
  38. openadapt_desktop-0.2.0/src-tauri/icons/.gitkeep +0 -0
  39. openadapt_desktop-0.2.0/src-tauri/src/commands.rs +145 -0
  40. openadapt_desktop-0.2.0/src-tauri/src/main.rs +41 -0
  41. openadapt_desktop-0.2.0/src-tauri/src/sidecar.rs +62 -0
  42. openadapt_desktop-0.2.0/src-tauri/src/tray.rs +34 -0
  43. openadapt_desktop-0.2.0/src-tauri/tauri.conf.json +46 -0
  44. openadapt_desktop-0.2.0/tests/__init__.py +0 -0
  45. openadapt_desktop-0.2.0/tests/conftest.py +53 -0
  46. openadapt_desktop-0.2.0/tests/test_e2e/__init__.py +1 -0
  47. openadapt_desktop-0.2.0/tests/test_e2e/conftest.py +19 -0
  48. openadapt_desktop-0.2.0/tests/test_e2e/test_ipc.py +92 -0
  49. openadapt_desktop-0.2.0/tests/test_e2e/test_pipeline.py +172 -0
  50. openadapt_desktop-0.2.0/tests/test_engine/__init__.py +0 -0
  51. openadapt_desktop-0.2.0/tests/test_engine/test_audit.py +63 -0
  52. openadapt_desktop-0.2.0/tests/test_engine/test_backends.py +88 -0
  53. openadapt_desktop-0.2.0/tests/test_engine/test_cli.py +114 -0
  54. openadapt_desktop-0.2.0/tests/test_engine/test_controller.py +103 -0
  55. openadapt_desktop-0.2.0/tests/test_engine/test_db.py +121 -0
  56. openadapt_desktop-0.2.0/tests/test_engine/test_monitor.py +57 -0
  57. openadapt_desktop-0.2.0/tests/test_engine/test_review_state.py +158 -0
  58. openadapt_desktop-0.2.0/tests/test_engine/test_scrubber.py +113 -0
  59. openadapt_desktop-0.2.0/tests/test_engine/test_storage.py +107 -0
  60. openadapt_desktop-0.2.0/tests/test_engine/test_upload.py +121 -0
  61. openadapt_desktop-0.2.0/uv.lock +2301 -0
@@ -0,0 +1,106 @@
1
+ # CI build + sign + release pipeline
2
+ #
3
+ # This workflow builds the Tauri application with bundled Python sidecar
4
+ # for all supported platforms. On tag push, it creates a GitHub Release
5
+ # with signed installers.
6
+ #
7
+ # See design doc Section 11 for the full CI/CD design.
8
+ #
9
+ # Build matrix:
10
+ # macOS Intel (x86_64) -> DMG + .app bundle
11
+ # macOS Apple Silicon -> DMG + .app bundle
12
+ # Windows x64 -> NSIS installer (.exe)
13
+ # Linux x64 -> AppImage + .deb
14
+ #
15
+ # TODO: This is a placeholder. Actual implementation requires:
16
+ # - Apple Developer certificate for macOS code signing + notarization
17
+ # - Windows Authenticode certificate for code signing
18
+ # - Tauri signing private key (Ed25519) for update verification
19
+ # - PyInstaller build step for the Python sidecar
20
+
21
+ name: Build & Release
22
+
23
+ on:
24
+ push:
25
+ tags: ["v*"]
26
+ pull_request:
27
+ branches: [main]
28
+
29
+ jobs:
30
+ build-python-sidecar:
31
+ name: Build Python Sidecar
32
+ strategy:
33
+ matrix:
34
+ include:
35
+ - os: macos-14
36
+ target: x86_64-apple-darwin
37
+ - os: macos-14
38
+ target: aarch64-apple-darwin
39
+ - os: windows-latest
40
+ target: x86_64-pc-windows-msvc
41
+ - os: ubuntu-22.04
42
+ target: x86_64-unknown-linux-gnu
43
+ runs-on: ${{ matrix.os }}
44
+
45
+ steps:
46
+ - uses: actions/checkout@v4
47
+
48
+ - name: Install uv
49
+ uses: astral-sh/setup-uv@v4
50
+
51
+ - name: Set up Python 3.12
52
+ run: uv python install 3.12
53
+
54
+ - name: Install dependencies
55
+ run: uv sync --extra full
56
+
57
+ # TODO: Build Python sidecar with PyInstaller
58
+ # - name: Build sidecar
59
+ # run: |
60
+ # uv run pip install pyinstaller
61
+ # uv run pyinstaller --onefile --name openadapt-engine engine/main.py
62
+
63
+ # - uses: actions/upload-artifact@v4
64
+ # with:
65
+ # name: sidecar-${{ matrix.target }}
66
+ # path: dist/openadapt-engine*
67
+
68
+ # TODO: Uncomment when Tauri shell is implemented
69
+ # build-tauri:
70
+ # name: Build Tauri App
71
+ # needs: build-python-sidecar
72
+ # strategy:
73
+ # matrix:
74
+ # include:
75
+ # - os: macos-13
76
+ # target: x86_64-apple-darwin
77
+ # - os: macos-14
78
+ # target: aarch64-apple-darwin
79
+ # - os: windows-latest
80
+ # target: x86_64-pc-windows-msvc
81
+ # - os: ubuntu-22.04
82
+ # target: x86_64-unknown-linux-gnu
83
+ # runs-on: ${{ matrix.os }}
84
+ #
85
+ # steps:
86
+ # - uses: actions/checkout@v4
87
+ # - uses: actions/download-artifact@v4
88
+ # with:
89
+ # name: sidecar-${{ matrix.target }}
90
+ # path: src-tauri/binaries/
91
+ # - uses: tauri-apps/tauri-action@v0
92
+ # env:
93
+ # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
94
+ # TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_SIGNING_PRIVATE_KEY }}
95
+ # # macOS signing
96
+ # APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
97
+ # APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
98
+ # APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
99
+ # APPLE_ID: ${{ secrets.APPLE_ID }}
100
+ # APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
101
+ # APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
102
+ # with:
103
+ # tagName: v__VERSION__
104
+ # releaseName: "OpenAdapt Desktop v__VERSION__"
105
+ # releaseBody: "See the changelog for details."
106
+ # releaseDraft: true
@@ -0,0 +1,14 @@
1
+ name: Notify docs
2
+ on:
3
+ push:
4
+ branches: [main]
5
+ jobs:
6
+ notify:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: peter-evans/repository-dispatch@v3
10
+ with:
11
+ token: ${{ secrets.DOCS_DISPATCH_TOKEN }}
12
+ repository: OpenAdaptAI/openadapt-maintenance
13
+ event-type: repo-updated
14
+ client-payload: '{"repo": "${{ github.repository }}", "sha": "${{ github.sha }}"}'
@@ -0,0 +1,63 @@
1
+ name: Release and PyPI Publish
2
+
3
+ # Requires ADMIN_TOKEN secret (GitHub PAT with repo scope) to push release
4
+ # commits to protected branches. Without it, the tag gets created but the
5
+ # version bump commit is rejected by branch protection, orphaning the tag.
6
+
7
+ on:
8
+ push:
9
+ branches:
10
+ - main
11
+
12
+ jobs:
13
+ release:
14
+ runs-on: ubuntu-latest
15
+ concurrency: release
16
+ permissions:
17
+ id-token: write
18
+ contents: write
19
+
20
+ steps:
21
+ - name: Checkout repository
22
+ uses: actions/checkout@v4
23
+ with:
24
+ fetch-depth: 0
25
+ token: ${{ secrets.ADMIN_TOKEN }}
26
+
27
+ - name: Check if should skip
28
+ id: check_skip
29
+ run: |
30
+ if [ "$(git log -1 --pretty=format:'%an')" = "semantic-release" ]; then
31
+ echo "skip=true" >> $GITHUB_OUTPUT
32
+ fi
33
+
34
+ - name: Set up Python
35
+ if: steps.check_skip.outputs.skip != 'true'
36
+ uses: actions/setup-python@v5
37
+ with:
38
+ python-version: '3.12'
39
+
40
+ - name: Install uv
41
+ if: steps.check_skip.outputs.skip != 'true'
42
+ uses: astral-sh/setup-uv@v4
43
+
44
+ - name: Python Semantic Release
45
+ if: steps.check_skip.outputs.skip != 'true'
46
+ id: release
47
+ uses: python-semantic-release/python-semantic-release@v9.15.2
48
+ with:
49
+ github_token: ${{ secrets.ADMIN_TOKEN }}
50
+
51
+ - name: Build package
52
+ if: steps.check_skip.outputs.skip != 'true' && steps.release.outputs.released == 'true'
53
+ run: uv build
54
+
55
+ - name: Publish to PyPI
56
+ if: steps.check_skip.outputs.skip != 'true' && steps.release.outputs.released == 'true'
57
+ uses: pypa/gh-action-pypi-publish@release/v1
58
+
59
+ - name: Publish to GitHub Releases
60
+ if: steps.check_skip.outputs.skip != 'true' && steps.release.outputs.released == 'true'
61
+ uses: python-semantic-release/publish-action@v9.15.2
62
+ with:
63
+ github_token: ${{ secrets.ADMIN_TOKEN }}
@@ -0,0 +1,47 @@
1
+ name: Test
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+
9
+ jobs:
10
+ test-python:
11
+ name: Python Engine Tests
12
+ strategy:
13
+ matrix:
14
+ os: [macos-latest, windows-latest, ubuntu-latest]
15
+ python-version: ["3.11", "3.12"]
16
+ runs-on: ${{ matrix.os }}
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v4
23
+
24
+ - name: Set up Python ${{ matrix.python-version }}
25
+ run: uv python install ${{ matrix.python-version }}
26
+
27
+ - name: Install dependencies
28
+ run: uv sync --extra dev
29
+
30
+ - name: Lint
31
+ run: uv run ruff check engine/ tests/
32
+
33
+ - name: Run tests
34
+ run: uv run pytest tests/ -v
35
+
36
+ # TODO: Add Rust/Tauri tests when implemented
37
+ # test-tauri:
38
+ # name: Tauri Build Check
39
+ # strategy:
40
+ # matrix:
41
+ # os: [macos-latest, windows-latest, ubuntu-latest]
42
+ # runs-on: ${{ matrix.os }}
43
+ # steps:
44
+ # - uses: actions/checkout@v4
45
+ # - uses: dtolnay/rust-toolchain@stable
46
+ # - name: Check Rust compilation
47
+ # run: cd src-tauri && cargo check
@@ -0,0 +1,64 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ *.egg-info/
7
+ *.egg
8
+ dist/
9
+ build/
10
+ .eggs/
11
+ *.whl
12
+ .venv/
13
+ venv/
14
+ .uv/
15
+
16
+ # Rust / Cargo
17
+ src-tauri/target/
18
+ **/*.rs.bk
19
+
20
+ # Node.js
21
+ node_modules/
22
+ npm-debug.log*
23
+ yarn-debug.log*
24
+ yarn-error.log*
25
+
26
+ # Tauri
27
+ src-tauri/target/
28
+ src-tauri/WixTools/
29
+ src-tauri/icons/*.ico
30
+ src-tauri/icons/*.icns
31
+
32
+ # IDE
33
+ .vscode/
34
+ .idea/
35
+ *.swp
36
+ *.swo
37
+ *~
38
+ .DS_Store
39
+
40
+ # Environment
41
+ .env
42
+ .env.local
43
+ .env.*.local
44
+
45
+ # Testing
46
+ .pytest_cache/
47
+ .coverage
48
+ htmlcov/
49
+ .mypy_cache/
50
+
51
+ # PyInstaller
52
+ *.spec
53
+
54
+ # Captures (user data, never committed)
55
+ captures/
56
+ archive/
57
+ tombstones/
58
+
59
+ # Audit logs
60
+ audit.jsonl
61
+
62
+ # OS
63
+ Thumbs.db
64
+ Desktop.ini
@@ -0,0 +1,166 @@
1
+ # CHANGELOG
2
+
3
+
4
+ ## v0.2.0 (2026-03-04)
5
+
6
+ ### Features
7
+
8
+ - Add `openadapt doctor` command and fix audit/wormhole bugs
9
+ ([#8](https://github.com/OpenAdaptAI/openadapt-desktop/pull/8),
10
+ [`f5cb841`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/f5cb841acd70dbc3c57ba752e8bd3f6f8763adde))
11
+
12
+ Add diagnostic command that checks all dependencies and configuration: - Python version, data
13
+ directory writability, database connectivity - Core deps: openadapt-capture, openadapt-privacy,
14
+ psutil - Optional deps: boto3, huggingface_hub, magic-wormhole - Backend credentials (S3 keys, HF
15
+ token) when configured - Shows actionable install instructions for missing dependencies
16
+
17
+ Bug fixes: - audit.py: create parent directory before writing log entries - wormhole.py: use
18
+ subprocess.run() instead of Popen to await completion and capture exit code properly
19
+
20
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
21
+
22
+
23
+ ## v0.1.1 (2026-03-04)
24
+
25
+ ### Bug Fixes
26
+
27
+ - Replace deprecated macos-13 runner with macos-14
28
+ ([#7](https://github.com/OpenAdaptAI/openadapt-desktop/pull/7),
29
+ [`bac0856`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/bac0856958dd2c6c472253f47d0a83be5453f8ba))
30
+
31
+ * fix: replace deprecated macos-13 runner with macos-14 in build workflow
32
+
33
+ macos-13 runners have been deprecated by GitHub Actions, causing the Build Python Sidecar job to
34
+ fail on every PR. Both macOS targets now use macos-14 (Apple Silicon), which supports x86_64
35
+ builds via Rosetta.
36
+
37
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
38
+
39
+ * fix: flaky concurrent reads test and deprecated macos-13 runner
40
+
41
+ - test_concurrent_reads: use separate IndexDB connections per thread (WAL concurrent reads require
42
+ separate connections, not a shared one) - build.yml: replace macos-13 with macos-14 (deprecated
43
+ runner)
44
+
45
+ ---------
46
+
47
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
48
+
49
+ ### Continuous Integration
50
+
51
+ - Add automated release workflow with python-semantic-release
52
+ ([#6](https://github.com/OpenAdaptAI/openadapt-desktop/pull/6),
53
+ [`1a3c4b8`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/1a3c4b8c81c3a6ddad9e0f2ee1aca76c079a1c5e))
54
+
55
+ Add release.yml workflow triggered on push to main that: - Runs python-semantic-release v9.15.2 to
56
+ determine version bumps from conventional commit messages (feat=minor, fix/perf=patch) - Builds
57
+ with uv and publishes to PyPI (trusted publishing) - Creates GitHub releases with changelogs -
58
+ Uses ADMIN_TOKEN to push through branch protection - Skips semantic-release's own commits to
59
+ prevent infinite loops
60
+
61
+ Also adds semantic_release config to pyproject.toml with version_toml + version_variables for dual
62
+ version tracking (pyproject.toml + engine/__init__.py).
63
+
64
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
65
+
66
+
67
+ ## v0.1.0 (2026-03-03)
68
+
69
+ ### Bug Fixes
70
+
71
+ - Add hatch build config, fix lint errors and workflow ordering
72
+ ([#1](https://github.com/OpenAdaptAI/openadapt-desktop/pull/1),
73
+ [`e899e41`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/e899e412cdd0fa4f6999a10e077496b95bab6822))
74
+
75
+ - Add [tool.hatch.build.targets.wheel] packages = ["engine"] so hatchling can find the Python
76
+ package - Fix ruff import sorting in test_backends.py and test_scrubber.py - Remove unused
77
+ StorageBackend import from test_backends.py - Move Xvfb setup step before test run in CI workflow
78
+ - Add uv.lock for reproducible builds
79
+
80
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
81
+
82
+ - Remove premature screenshot generation and Playwright UI tests
83
+ ([#3](https://github.com/OpenAdaptAI/openadapt-desktop/pull/3),
84
+ [`2e6c874`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/2e6c874aea15ccbd96a42ba42cf547b06185b218))
85
+
86
+ Remove: - screenshots/ (fake screenshots of non-functional placeholder HTML) -
87
+ scripts/generate_screenshots.py (generates screenshots of stubs) - tests/test_e2e/test_ui.py
88
+ (Playwright tests against placeholder HTML) - tests/test_e2e/test_screenshots.py (tests for the
89
+ screenshot generator) - pytest-playwright dependency - Xvfb CI step
90
+
91
+ Keep: - tests/test_e2e/test_ipc.py (tests real IPC protocol code) - All engine tests (test real
92
+ business logic) - README (without screenshot section) - CLAUDE.md
93
+
94
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
95
+
96
+ ### Features
97
+
98
+ - Add docs sync trigger ([#4](https://github.com/OpenAdaptAI/openadapt-desktop/pull/4),
99
+ [`62d3da2`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/62d3da207e7cc2c1b16c2cf0851add5eb3532547))
100
+
101
+ - Add README, screenshots, e2e tests, and automated screenshot generation
102
+ ([#2](https://github.com/OpenAdaptAI/openadapt-desktop/pull/2),
103
+ [`fa00a22`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/fa00a22d95391dcc1f7ddaf337316e000ab28d22))
104
+
105
+ * docs: add README and CLAUDE.md
106
+
107
+ - Comprehensive README with architecture, state machine, storage backends, project structure,
108
+ configuration reference, and development guide - CLAUDE.md with project conventions and file map
109
+
110
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
111
+
112
+ * feat: add screenshots, e2e tests, and automated screenshot generation
113
+
114
+ - Add Playwright-based UI tests for all HTML pages (dashboard, review, settings) - Add IPC protocol
115
+ e2e tests (response format, error handling, event format) - Add automated screenshot generation
116
+ script with mock data injection - Generate 4 documentation screenshots (idle, recording, review,
117
+ settings) - Add screenshots to README with raw.githubusercontent.com URLs - Add pytest-playwright
118
+ to dev dependencies - Update CI to install Playwright browsers - Update ruff config to allow long
119
+ lines in scripts/ (inline HTML)
120
+
121
+ 52 tests passing (26 engine + 7 IPC + 5 screenshot + 11 UI + 3 viewport)
122
+
123
+ ---------
124
+
125
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
126
+
127
+ - Implement end-to-end engine with CLI
128
+ ([#5](https://github.com/OpenAdaptAI/openadapt-desktop/pull/5),
129
+ [`400df35`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/400df3577008edc2b0fd21afe4ed98a8d8e31155))
130
+
131
+ * feat: implement end-to-end engine with CLI
132
+
133
+ Replace all NotImplementedError stubs with working implementations across the entire Python engine.
134
+ The full pipeline now works: record -> scrub -> review -> upload.
135
+
136
+ New files: - engine/db.py: SQLite index database (WAL mode, captures + upload_jobs) - engine/cli.py:
137
+ 13-command argparse CLI entry point - engine/__main__.py: python -m engine support -
138
+ tests/test_engine/test_db.py: 11 database tests - tests/test_engine/test_upload.py: 7 upload
139
+ manager tests - tests/test_engine/test_monitor.py: 5 health monitor tests -
140
+ tests/test_engine/test_cli.py: 8 CLI tests - tests/test_e2e/test_pipeline.py: 3 end-to-end
141
+ pipeline tests
142
+
143
+ Implemented modules: - controller.py: recording lifecycle with openadapt-capture, crash recovery -
144
+ scrubber.py: regex PII scrubbing (email/CC/SSN/phone/IP), Presidio fallback - review.py:
145
+ DB-persisted egress gating with audit logging - storage_manager.py: hot/warm/cold tiers, tar.gz
146
+ archival, cleanup - upload_manager.py: persistent queue, egress checks, multi-backend dispatch -
147
+ monitor.py: memory + disk monitoring with daemon threads - backends/s3.py: boto3
148
+ upload/delete/list/verify - backends/huggingface.py: huggingface_hub upload/delete/list/verify -
149
+ backends/wormhole.py: subprocess-based wormhole send
150
+
151
+ Test results: 106 passed, 0 skipped (up from 33 passed, 17 skipped)
152
+
153
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
154
+
155
+ * fix: use uv run prefix in README Quick Start
156
+
157
+ ---------
158
+
159
+ Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
160
+
161
+ - Initial repo scaffold
162
+ ([`b14c32e`](https://github.com/OpenAdaptAI/openadapt-desktop/commit/b14c32e4fe53e8fd41fa52848236a3b646e2af74))
163
+
164
+ Tauri 2.x shell + Python sidecar architecture. See DESIGN.md for comprehensive design document.
165
+
166
+ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@@ -0,0 +1,79 @@
1
+ # Claude Code Instructions for openadapt-desktop
2
+
3
+ ## MANDATORY: Branches and Pull Requests
4
+
5
+ **NEVER push directly to main. ALWAYS use feature branches and pull requests.**
6
+
7
+ 1. Create a feature branch: `git checkout -b feat/description` or `fix/description`
8
+ 2. Make commits on the branch
9
+ 3. Push the branch: `git push -u origin branch-name`
10
+ 4. Create a PR: `gh pr create --title "..." --body "..."`
11
+ 5. Only merge via PR (never `git push origin main`)
12
+
13
+ ### PR Titles MUST Use Conventional Commit Format
14
+
15
+ ```
16
+ fix: short description -> patch bump (0.0.x)
17
+ feat: short description -> minor bump (0.x.0)
18
+ fix(scope): short description -> patch bump with scope
19
+ feat!: breaking change -> major bump (x.0.0)
20
+ ```
21
+
22
+ **Types**: feat, fix, docs, style, refactor, perf, test, chore, ci
23
+
24
+ ---
25
+
26
+ ## Overview
27
+
28
+ Cross-platform desktop app for continuous screen recording and AI training data collection. Built with Tauri 2.x (Rust shell) + Python sidecar (recording engine).
29
+
30
+ ## Quick Start
31
+
32
+ ```bash
33
+ uv sync --extra dev
34
+ uv run pytest tests/ -v
35
+ uv run ruff check engine/ tests/
36
+ ```
37
+
38
+ ## Architecture
39
+
40
+ Two-process model:
41
+ - **Tauri shell** (Rust + WebView): system tray, native window, IPC dispatch
42
+ - **Python engine** (sidecar): recording, scrubbing, storage, upload
43
+
44
+ Communication via JSON-over-stdin/stdout IPC protocol (see DESIGN.md Appendix B).
45
+
46
+ ## Key Design Decisions
47
+
48
+ 1. **Raw-then-review scrubbing**: Recordings saved raw to disk. Scrubbing is a separate user-reviewed step. `check_egress_allowed()` gates ALL outbound paths.
49
+ 2. **Build-time trust**: Tauri Cargo.toml feature flags physically exclude upload code. Enterprise binary verifiable with `strings`.
50
+ 3. **Multiple storage backends**: StorageBackend protocol in `engine/backends/protocol.py`. All backends conform to the same interface.
51
+ 4. **Network audit logging**: Every outbound request logged to `audit.jsonl` (JSONL format).
52
+
53
+ ## File Map
54
+
55
+ | File | Purpose |
56
+ |------|---------|
57
+ | `engine/controller.py` | Recording lifecycle (start/stop/pause) |
58
+ | `engine/review.py` | Upload review state machine (the egress gate) |
59
+ | `engine/scrubber.py` | PII scrubbing orchestration |
60
+ | `engine/config.py` | Settings (pydantic-settings, OPENADAPT_ prefix) |
61
+ | `engine/audit.py` | Network audit logger |
62
+ | `engine/backends/protocol.py` | StorageBackend protocol definition |
63
+ | `engine/backends/s3.py` | S3/R2/MinIO backend |
64
+ | `src-tauri/src/commands.rs` | IPC commands (13 endpoints) |
65
+ | `src-tauri/src/main.rs` | Tauri entry point |
66
+ | `DESIGN.md` | Comprehensive design document (v2.0, 1800 lines) |
67
+
68
+ ## Running Tests
69
+
70
+ ```bash
71
+ uv run pytest tests/ -v # all tests
72
+ uv run ruff check engine/ tests/ # lint
73
+ ```
74
+
75
+ ## Dependencies
76
+
77
+ - Python: `openadapt-capture` (recording), `openadapt-privacy` (scrubbing), `pydantic-settings`
78
+ - Rust: `tauri`, `tauri-plugin-shell`, `tauri-plugin-notification`, `tauri-plugin-updater`
79
+ - Optional: `boto3` (S3), `huggingface_hub`, `flwr` + `torch` (federated)