cursor-agent-beacon 0.3.1__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 (57) hide show
  1. cursor_agent_beacon-0.3.1/.gitignore +51 -0
  2. cursor_agent_beacon-0.3.1/LICENSE +21 -0
  3. cursor_agent_beacon-0.3.1/PKG-INFO +179 -0
  4. cursor_agent_beacon-0.3.1/README.md +146 -0
  5. cursor_agent_beacon-0.3.1/firmware/viewe/README.md +90 -0
  6. cursor_agent_beacon-0.3.1/gnome-extension/extension.js +683 -0
  7. cursor_agent_beacon-0.3.1/gnome-extension/icons/error-symbolic.svg +5 -0
  8. cursor_agent_beacon-0.3.1/gnome-extension/icons/idle-symbolic.svg +4 -0
  9. cursor_agent_beacon-0.3.1/gnome-extension/icons/mcp-symbolic.svg +6 -0
  10. cursor_agent_beacon-0.3.1/gnome-extension/icons/terminal-symbolic.svg +5 -0
  11. cursor_agent_beacon-0.3.1/gnome-extension/icons/thinking-symbolic.svg +4 -0
  12. cursor_agent_beacon-0.3.1/gnome-extension/metadata.json +9 -0
  13. cursor_agent_beacon-0.3.1/gnome-extension/schemas/org.gnome.shell.extensions.cursor-status-panel.gschema.xml +20 -0
  14. cursor_agent_beacon-0.3.1/gnome-extension/stylesheet.css +133 -0
  15. cursor_agent_beacon-0.3.1/preview/README.md +42 -0
  16. cursor_agent_beacon-0.3.1/pyproject.toml +73 -0
  17. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/__init__.py +3 -0
  18. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/bridge/__init__.py +7 -0
  19. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/bridge/config.py +54 -0
  20. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/bridge/serial_writer.py +88 -0
  21. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/bridge/server.py +137 -0
  22. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/bridge/service.py +88 -0
  23. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/cli.py +289 -0
  24. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/compat.py +13 -0
  25. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/config.py +60 -0
  26. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/doctor.py +353 -0
  27. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/handler.py +71 -0
  28. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/hooks.py +29 -0
  29. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/install.py +258 -0
  30. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/mapper.py +307 -0
  31. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/models.py +91 -0
  32. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/paths.py +60 -0
  33. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/protocol.py +57 -0
  34. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/response.py +31 -0
  35. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/session_registry.py +401 -0
  36. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/setup.py +107 -0
  37. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/sinks/__init__.py +60 -0
  38. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/sinks/base.py +14 -0
  39. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/sinks/file.py +29 -0
  40. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/sinks/http.py +74 -0
  41. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/sinks/log.py +27 -0
  42. cursor_agent_beacon-0.3.1/src/cursor_agent_beacon/theme.py +90 -0
  43. cursor_agent_beacon-0.3.1/themes/README.md +60 -0
  44. cursor_agent_beacon-0.3.1/themes/custom/README.md +58 -0
  45. cursor_agent_beacon-0.3.1/themes/custom/example/manifest.json +55 -0
  46. cursor_agent_beacon-0.3.1/themes/standard/ASSETS.md +84 -0
  47. cursor_agent_beacon-0.3.1/themes/standard/ATTRIBUTION.md +10 -0
  48. cursor_agent_beacon-0.3.1/themes/standard/assets/error.gif +0 -0
  49. cursor_agent_beacon-0.3.1/themes/standard/assets/running_mcp.gif +0 -0
  50. cursor_agent_beacon-0.3.1/themes/standard/assets/running_shell.gif +0 -0
  51. cursor_agent_beacon-0.3.1/themes/standard/assets/sleeping.gif +0 -0
  52. cursor_agent_beacon-0.3.1/themes/standard/assets/stop.gif +0 -0
  53. cursor_agent_beacon-0.3.1/themes/standard/assets/success.gif +0 -0
  54. cursor_agent_beacon-0.3.1/themes/standard/assets/thinking.gif +0 -0
  55. cursor_agent_beacon-0.3.1/themes/standard/assets/waiting.gif +0 -0
  56. cursor_agent_beacon-0.3.1/themes/standard/manifest.json +58 -0
  57. cursor_agent_beacon-0.3.1/themes/standard/pixel-faces.json +118 -0
@@ -0,0 +1,51 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+ MANIFEST
23
+ .venv/
24
+ venv/
25
+ ENV/
26
+
27
+ # Testing
28
+ .pytest_cache/
29
+ .coverage
30
+ htmlcov/
31
+ .tox/
32
+
33
+ # IDE
34
+ .idea/
35
+ .vscode/
36
+ *.swp
37
+ *.swo
38
+
39
+ # Local status / runtime
40
+ .cursor-agent-beacon/
41
+ themes/custom/*
42
+ !themes/custom/README.md
43
+ !themes/custom/example/
44
+ !themes/custom/example/**
45
+ firmware/viewe/data/**/*.png
46
+ config/hardware.env
47
+ *.log
48
+
49
+ # OS
50
+ .DS_Store
51
+ Thumbs.db
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 cursor-agent-beacon contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,179 @@
1
+ Metadata-Version: 2.4
2
+ Name: cursor-agent-beacon
3
+ Version: 0.3.1
4
+ Summary: Deterministic Cursor agent status monitoring via native hooks
5
+ Project-URL: Homepage, https://github.com/suribe06/cursor-agent-beacon
6
+ Project-URL: Documentation, https://github.com/suribe06/cursor-agent-beacon#readme
7
+ Project-URL: Issues, https://github.com/suribe06/cursor-agent-beacon/issues
8
+ Project-URL: Repository, https://github.com/suribe06/cursor-agent-beacon
9
+ Author: cursor-agent-beacon contributors
10
+ License-File: LICENSE
11
+ Keywords: agent,cursor,hooks,monitoring,observability
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Requires-Python: >=3.10
22
+ Provides-Extra: bridge
23
+ Requires-Dist: pyserial>=3.5; extra == 'bridge'
24
+ Provides-Extra: dev
25
+ Requires-Dist: pillow>=10.0; extra == 'dev'
26
+ Requires-Dist: pyright>=1.1; extra == 'dev'
27
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
28
+ Requires-Dist: pytest>=8.0; extra == 'dev'
29
+ Requires-Dist: ruff>=0.9; extra == 'dev'
30
+ Provides-Extra: export
31
+ Requires-Dist: pillow>=10.0; extra == 'export'
32
+ Description-Content-Type: text/markdown
33
+
34
+ # Cursor Agent Beacon
35
+
36
+ [![CI](https://github.com/suribe06/cursor-agent-beacon/actions/workflows/ci.yml/badge.svg)](https://github.com/suribe06/cursor-agent-beacon/actions/workflows/ci.yml)
37
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
38
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
39
+
40
+ Deterministic monitoring of Cursor agent activity using native [Cursor Hooks](https://cursor.com/docs/hooks).
41
+
42
+ **Repository:** https://github.com/suribe06/cursor-agent-beacon
43
+
44
+ Cursor fires hook events automatically during the agent lifecycle. Cursor Agent Beacon listens to those events, maps them to a small set of high-level states, and publishes status updates through pluggable sinks.
45
+
46
+ This is the software foundation for a physical status panel (ESP32 + color TFT). **v0.3** ships Python hooks, **bundled standard GIF themes**, a **local bridge service**, and **one-shot setup**.
47
+
48
+ ## Features
49
+
50
+ - **One-shot setup**: `./setup.sh` or `pip install` + `cursor-agent-beacon setup`
51
+ - **`doctor` / `status` / `uninstall`** CLI for install verification and teardown
52
+ - Normalized status model (`idle`, `thinking`, `running_shell`, `running_mcp`, `success`, `error`, ...)
53
+ - **Standard theme**: 8 animated pixel-robot GIFs (480ร—480) in `themes/standard/assets/`
54
+ - **Custom themes**: drop your own GIFs in `themes/custom/<name>/`
55
+ - Fail-open behavior โ€” hooks never block Cursor
56
+ - JSON log sink (stderr) for the Hooks output channel
57
+ - File sink with latest status snapshot
58
+ - HTTP sink for the local bridge service
59
+ - **Bridge service** (`cursor-agent-beacon bridge`): `POST /status` โ†’ theme GIF resolution โ†’ serial commands
60
+ - **GNOME status panel** (v0.10, pre-release): Ubuntu top-bar indicator โ€” [`gnome-extension/`](gnome-extension/) + [`docs/gnome-panel.md`](docs/gnome-panel.md)
61
+ - **Multi-session registry**: per-chat status under `~/.local/share/cursor-agent-beacon/`
62
+
63
+ ## Quick start
64
+
65
+ ### From git (recommended for development)
66
+
67
+ ```bash
68
+ git clone https://github.com/suribe06/cursor-agent-beacon.git
69
+ cd cursor-agent-beacon
70
+ ./setup.sh
71
+ ```
72
+
73
+ ### From PyPI
74
+
75
+ ```bash
76
+ python3 -m venv .venv
77
+ source .venv/bin/activate
78
+ pip install "cursor-agent-beacon[bridge]"
79
+ cursor-agent-beacon setup
80
+ ```
81
+
82
+ Restart Cursor when setup finishes. On Ubuntu, reload GNOME Shell if the top-bar panel does not appear.
83
+
84
+ Verify installation:
85
+
86
+ ```bash
87
+ .venv/bin/cursor-agent-beacon doctor
88
+ ```
89
+
90
+ After using the agent:
91
+
92
+ ```bash
93
+ .venv/bin/cursor-agent-beacon status
94
+ ```
95
+
96
+ Check status (any project):
97
+
98
+ ```bash
99
+ cat ~/.local/share/cursor-agent-beacon/status.json
100
+ ```
101
+
102
+ See [Getting Started](docs/getting-started.md) for bridge, themes, and development setup.
103
+
104
+ ## Architecture
105
+
106
+ ```text
107
+ Cursor โ†’ hooks.json โ†’ hook-handler.py โ†’ cursor_agent_beacon โ†’ sinks
108
+ ```
109
+
110
+ Read more in [`docs/architecture.md`](docs/architecture.md).
111
+
112
+ ## Configuration
113
+
114
+ | Variable | Default | Description |
115
+ | --- | --- | --- |
116
+ | `CURSOR_AGENT_BEACON_LOG` | `true` | Emit JSON lines to stderr |
117
+ | `CURSOR_AGENT_BEACON_FILE` | `true` | Write latest status file |
118
+ | `CURSOR_AGENT_BEACON_STATUS_FILE` | `.cursor-agent-beacon/status.json` (project) or `~/.local/share/cursor-agent-beacon/status.json` (user install) | Status snapshot path |
119
+ | `CURSOR_AGENT_BEACON_HTTP_URL` | unset | Bridge `POST /status` endpoint |
120
+ | `CURSOR_AGENT_BEACON_BRIDGE_HOST` | `127.0.0.1` | Bridge bind address |
121
+ | `CURSOR_AGENT_BEACON_BRIDGE_PORT` | `8765` | Bridge HTTP port |
122
+ | `CURSOR_AGENT_BEACON_SERIAL_PORT` | unset | ESP32 serial device (dry-run if unset) |
123
+ | `CURSOR_AGENT_BEACON_SERIAL_BAUD` | `115200` | Serial baud rate |
124
+ | `CURSOR_AGENT_BEACON_THEME` | `standard` | Theme id (`standard` or custom theme name) |
125
+ | `CURSOR_AGENT_BEACON_THEMES_DIR` | packaged `themes/` or repo `themes/` | Root folder for theme packs |
126
+ | `CURSOR_AGENT_BEACON_REDACT_CONTENT` | `false` | Hide prompt/response text in status |
127
+
128
+ ## Project status
129
+
130
+ | Component | Status |
131
+ | --- | --- |
132
+ | Python hook handler | โœ… v0.3 |
133
+ | Multi-session file sink | โœ… v0.3 |
134
+ | One-shot setup + doctor CLI | โœ… v0.3 |
135
+ | GNOME status panel | ๐Ÿงช v0.10 pre-release |
136
+ | Standard GIF theme | โœ… bundled |
137
+ | Custom GIF themes | โœ… `themes/custom/` |
138
+ | Local bridge service | โœ… v0.2 |
139
+ | VIEWE display firmware | ๐Ÿ”œ planned |
140
+
141
+ See [`docs/roadmap.md`](docs/roadmap.md).
142
+
143
+ ## Documentation
144
+
145
+ - [Getting Started](docs/getting-started.md)
146
+ - [Hooks Reference](docs/hooks.md)
147
+ - [GNOME Status Panel](docs/gnome-panel.md)
148
+ - [Architecture](docs/architecture.md)
149
+ - [Hardware โ€” VIEWE](docs/hardware-viewe.md)
150
+ - [Roadmap](docs/roadmap.md)
151
+ - [Changelog](CHANGELOG.md)
152
+
153
+ ## Contributing
154
+
155
+ See [CONTRIBUTING.md](CONTRIBUTING.md). Please read the [Code of Conduct](CODE_OF_CONDUCT.md) before participating.
156
+
157
+ Report security issues privately โ€” see [SECURITY.md](SECURITY.md).
158
+
159
+ ## Development
160
+
161
+ ```bash
162
+ ./setup.sh
163
+ source .venv/bin/activate
164
+ pip install -e ".[dev,bridge]"
165
+ pytest
166
+ ruff check src tests
167
+ ruff format --check src tests
168
+ pyright
169
+ python -m build
170
+ cursor-agent-beacon bridge
171
+ cursor-agent-beacon install-hooks
172
+ PYTHONPATH=src python3 -m cursor_agent_beacon.cli map examples/sample-events/stop_completed.json
173
+ ```
174
+
175
+ Systemd user service template: [`packaging/cursor-agent-beacon-bridge.service`](packaging/cursor-agent-beacon-bridge.service)
176
+
177
+ ## License
178
+
179
+ MIT โ€” see [LICENSE](LICENSE).
@@ -0,0 +1,146 @@
1
+ # Cursor Agent Beacon
2
+
3
+ [![CI](https://github.com/suribe06/cursor-agent-beacon/actions/workflows/ci.yml/badge.svg)](https://github.com/suribe06/cursor-agent-beacon/actions/workflows/ci.yml)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
+ [![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
6
+
7
+ Deterministic monitoring of Cursor agent activity using native [Cursor Hooks](https://cursor.com/docs/hooks).
8
+
9
+ **Repository:** https://github.com/suribe06/cursor-agent-beacon
10
+
11
+ Cursor fires hook events automatically during the agent lifecycle. Cursor Agent Beacon listens to those events, maps them to a small set of high-level states, and publishes status updates through pluggable sinks.
12
+
13
+ This is the software foundation for a physical status panel (ESP32 + color TFT). **v0.3** ships Python hooks, **bundled standard GIF themes**, a **local bridge service**, and **one-shot setup**.
14
+
15
+ ## Features
16
+
17
+ - **One-shot setup**: `./setup.sh` or `pip install` + `cursor-agent-beacon setup`
18
+ - **`doctor` / `status` / `uninstall`** CLI for install verification and teardown
19
+ - Normalized status model (`idle`, `thinking`, `running_shell`, `running_mcp`, `success`, `error`, ...)
20
+ - **Standard theme**: 8 animated pixel-robot GIFs (480ร—480) in `themes/standard/assets/`
21
+ - **Custom themes**: drop your own GIFs in `themes/custom/<name>/`
22
+ - Fail-open behavior โ€” hooks never block Cursor
23
+ - JSON log sink (stderr) for the Hooks output channel
24
+ - File sink with latest status snapshot
25
+ - HTTP sink for the local bridge service
26
+ - **Bridge service** (`cursor-agent-beacon bridge`): `POST /status` โ†’ theme GIF resolution โ†’ serial commands
27
+ - **GNOME status panel** (v0.10, pre-release): Ubuntu top-bar indicator โ€” [`gnome-extension/`](gnome-extension/) + [`docs/gnome-panel.md`](docs/gnome-panel.md)
28
+ - **Multi-session registry**: per-chat status under `~/.local/share/cursor-agent-beacon/`
29
+
30
+ ## Quick start
31
+
32
+ ### From git (recommended for development)
33
+
34
+ ```bash
35
+ git clone https://github.com/suribe06/cursor-agent-beacon.git
36
+ cd cursor-agent-beacon
37
+ ./setup.sh
38
+ ```
39
+
40
+ ### From PyPI
41
+
42
+ ```bash
43
+ python3 -m venv .venv
44
+ source .venv/bin/activate
45
+ pip install "cursor-agent-beacon[bridge]"
46
+ cursor-agent-beacon setup
47
+ ```
48
+
49
+ Restart Cursor when setup finishes. On Ubuntu, reload GNOME Shell if the top-bar panel does not appear.
50
+
51
+ Verify installation:
52
+
53
+ ```bash
54
+ .venv/bin/cursor-agent-beacon doctor
55
+ ```
56
+
57
+ After using the agent:
58
+
59
+ ```bash
60
+ .venv/bin/cursor-agent-beacon status
61
+ ```
62
+
63
+ Check status (any project):
64
+
65
+ ```bash
66
+ cat ~/.local/share/cursor-agent-beacon/status.json
67
+ ```
68
+
69
+ See [Getting Started](docs/getting-started.md) for bridge, themes, and development setup.
70
+
71
+ ## Architecture
72
+
73
+ ```text
74
+ Cursor โ†’ hooks.json โ†’ hook-handler.py โ†’ cursor_agent_beacon โ†’ sinks
75
+ ```
76
+
77
+ Read more in [`docs/architecture.md`](docs/architecture.md).
78
+
79
+ ## Configuration
80
+
81
+ | Variable | Default | Description |
82
+ | --- | --- | --- |
83
+ | `CURSOR_AGENT_BEACON_LOG` | `true` | Emit JSON lines to stderr |
84
+ | `CURSOR_AGENT_BEACON_FILE` | `true` | Write latest status file |
85
+ | `CURSOR_AGENT_BEACON_STATUS_FILE` | `.cursor-agent-beacon/status.json` (project) or `~/.local/share/cursor-agent-beacon/status.json` (user install) | Status snapshot path |
86
+ | `CURSOR_AGENT_BEACON_HTTP_URL` | unset | Bridge `POST /status` endpoint |
87
+ | `CURSOR_AGENT_BEACON_BRIDGE_HOST` | `127.0.0.1` | Bridge bind address |
88
+ | `CURSOR_AGENT_BEACON_BRIDGE_PORT` | `8765` | Bridge HTTP port |
89
+ | `CURSOR_AGENT_BEACON_SERIAL_PORT` | unset | ESP32 serial device (dry-run if unset) |
90
+ | `CURSOR_AGENT_BEACON_SERIAL_BAUD` | `115200` | Serial baud rate |
91
+ | `CURSOR_AGENT_BEACON_THEME` | `standard` | Theme id (`standard` or custom theme name) |
92
+ | `CURSOR_AGENT_BEACON_THEMES_DIR` | packaged `themes/` or repo `themes/` | Root folder for theme packs |
93
+ | `CURSOR_AGENT_BEACON_REDACT_CONTENT` | `false` | Hide prompt/response text in status |
94
+
95
+ ## Project status
96
+
97
+ | Component | Status |
98
+ | --- | --- |
99
+ | Python hook handler | โœ… v0.3 |
100
+ | Multi-session file sink | โœ… v0.3 |
101
+ | One-shot setup + doctor CLI | โœ… v0.3 |
102
+ | GNOME status panel | ๐Ÿงช v0.10 pre-release |
103
+ | Standard GIF theme | โœ… bundled |
104
+ | Custom GIF themes | โœ… `themes/custom/` |
105
+ | Local bridge service | โœ… v0.2 |
106
+ | VIEWE display firmware | ๐Ÿ”œ planned |
107
+
108
+ See [`docs/roadmap.md`](docs/roadmap.md).
109
+
110
+ ## Documentation
111
+
112
+ - [Getting Started](docs/getting-started.md)
113
+ - [Hooks Reference](docs/hooks.md)
114
+ - [GNOME Status Panel](docs/gnome-panel.md)
115
+ - [Architecture](docs/architecture.md)
116
+ - [Hardware โ€” VIEWE](docs/hardware-viewe.md)
117
+ - [Roadmap](docs/roadmap.md)
118
+ - [Changelog](CHANGELOG.md)
119
+
120
+ ## Contributing
121
+
122
+ See [CONTRIBUTING.md](CONTRIBUTING.md). Please read the [Code of Conduct](CODE_OF_CONDUCT.md) before participating.
123
+
124
+ Report security issues privately โ€” see [SECURITY.md](SECURITY.md).
125
+
126
+ ## Development
127
+
128
+ ```bash
129
+ ./setup.sh
130
+ source .venv/bin/activate
131
+ pip install -e ".[dev,bridge]"
132
+ pytest
133
+ ruff check src tests
134
+ ruff format --check src tests
135
+ pyright
136
+ python -m build
137
+ cursor-agent-beacon bridge
138
+ cursor-agent-beacon install-hooks
139
+ PYTHONPATH=src python3 -m cursor_agent_beacon.cli map examples/sample-events/stop_completed.json
140
+ ```
141
+
142
+ Systemd user service template: [`packaging/cursor-agent-beacon-bridge.service`](packaging/cursor-agent-beacon-bridge.service)
143
+
144
+ ## License
145
+
146
+ MIT โ€” see [LICENSE](LICENSE).
@@ -0,0 +1,90 @@
1
+ # VIEWE UEDX48480021-MD80E firmware
2
+
3
+ Firmware for the **VIEWE ESP32-S3 Knob Display** (480ร—480 circular, ST7701S, LVGL).
4
+
5
+ ## Before you have the board
6
+
7
+ You can still prepare and test:
8
+
9
+ | Step | Command | What it validates |
10
+ | --- | --- | --- |
11
+ | Bridge โ†’ serial | `scripts/fake_serial_device.py` | Protocol lines without hardware |
12
+ | Export frames | `scripts/export_firmware_assets.py` | PNG sequences for LVGL |
13
+ | Protocol parser | `protocol.cpp` + unit test on PC (optional) | `STATUS\|...\` parsing |
14
+
15
+ ## When the board arrives
16
+
17
+ ### 1. Arduino IDE setup
18
+
19
+ 1. Install [Arduino ESP32 core](https://docs.espressif.com/projects/arduino-esp32/en/latest/) (ESP32-S3).
20
+ 2. Library Manager:
21
+ - `ESP32_Display_Panel` (โ‰ฅ 1.0.3)
22
+ - `lvgl` (8.4.x per VIEWE docs)
23
+ 3. Clone vendor examples: [VIEWESMART/ESP32-Arduino](https://github.com/VIEWESMART/ESP32-Arduino) โ†’ `examples/2.1inch`.
24
+ 4. Board: **ESP32-S3**. Select the macro for `UEDX48480021-MD80E` in `ESP32_Display_Panel` config.
25
+ 5. Confirm the **USB serial baud rate** in the vendor example (often `115200` on ESP32-S3 USB-CDC). Match `CURSOR_AGENT_BEACON_SERIAL_BAUD`.
26
+
27
+ ### 2. Flash workflow
28
+
29
+ 1. Open `examples/2.1inch` from VIEWESMART โ€” verify the panel + knob work **before** merging beacon code.
30
+ 2. Copy initialization from the vendor example into `cursor_agent_beacon/cursor_agent_beacon.ino`.
31
+ 3. Wire in `protocol.cpp` for serial `STATUS|state|message` lines.
32
+ 4. Load PNG frames from `data/standard/` (SPIFFS/LittleFS) using `manifest.json`.
33
+ 5. Map `state` โ†’ sprite folder โ†’ LVGL `lv_img` animation.
34
+
35
+ ### 3. Connect to the bridge
36
+
37
+ ```bash
38
+ # Find port (Linux)
39
+ ls /dev/ttyACM* /dev/ttyUSB*
40
+
41
+ export CURSOR_AGENT_BEACON_SERIAL_PORT=/dev/ttyACM0
42
+ export CURSOR_AGENT_BEACON_SERIAL_BAUD=115200
43
+ cursor-agent-beacon bridge
44
+ ```
45
+
46
+ Send a test status:
47
+
48
+ ```bash
49
+ export CURSOR_AGENT_BEACON_HTTP_URL=http://127.0.0.1:8765/status
50
+ python3 scripts/simulate_hook.py examples/sample-events/after_agent_thought.json
51
+ ```
52
+
53
+ ## Serial protocol
54
+
55
+ See [`docs/hardware-viewe.md`](../../docs/hardware-viewe.md) and Python mirror in `src/cursor_agent_beacon/protocol.py`.
56
+
57
+ ```text
58
+ PC โ†’ device: STATUS|<state>|<message>
59
+ PC โ†’ device: THEME|<theme_id>
60
+ device โ†’ PC: EVENT|button_pressed (optional, future MCP path)
61
+ ```
62
+
63
+ ## Asset layout
64
+
65
+ ```text
66
+ data/standard/
67
+ manifest.json # state โ†’ sprite โ†’ frame list
68
+ thinking/
69
+ frame_00.png
70
+ frame_01.png
71
+ ...
72
+ ```
73
+
74
+ Regenerate after theme changes:
75
+
76
+ ```bash
77
+ python3 scripts/export_standard_gifs.py
78
+ python3 scripts/export_firmware_assets.py
79
+ ```
80
+
81
+ ## Files in this folder
82
+
83
+ | File | Purpose |
84
+ | --- | --- |
85
+ | `protocol.h` / `protocol.cpp` | Parse `STATUS\|...\` lines (portable C++) |
86
+ | `cursor_agent_beacon/cursor_agent_beacon.ino` | Sketch skeleton โ€” merge with VIEWESMART init |
87
+
88
+ ## Display-only scope
89
+
90
+ This repo focuses on **showing agent status**. Knob/button `EVENT|...` lines are defined in the protocol for future use but are not required for the first end-to-end test.