Add Agents.md contributor and agent guide
This commit is contained in:
137
Agents.md
Normal file
137
Agents.md
Normal file
@@ -0,0 +1,137 @@
|
|||||||
|
# Agents Guide: Custom Streamdeck
|
||||||
|
|
||||||
|
This file is a practical onboarding guide for coding agents and contributors working in this repository.
|
||||||
|
|
||||||
|
## Mission
|
||||||
|
|
||||||
|
Build and maintain a local-first Streamdeck platform:
|
||||||
|
|
||||||
|
- Raspberry Pi Pico emits button events over USB serial.
|
||||||
|
- FastAPI backend owns state, persistence, action execution, and plugin runtime.
|
||||||
|
- React frontend is the configuration UI.
|
||||||
|
- Optional Electron overlay displays active profile/folder context.
|
||||||
|
|
||||||
|
## Tech Stack
|
||||||
|
|
||||||
|
- Backend: Python, FastAPI, SQLite, pyserial, pynput
|
||||||
|
- Frontend: React 19 + TypeScript + Vite
|
||||||
|
- Overlay: Electron + TypeScript + Tailwind CLI
|
||||||
|
- Device firmware: MicroPython (`pico/main.py`)
|
||||||
|
|
||||||
|
## Repository Map
|
||||||
|
|
||||||
|
- `backend/`: API, runtime lifecycle, DB, action engine, serial + plugin services
|
||||||
|
- `frontend/`: Vite React app for deck configuration
|
||||||
|
- `overlay/`: transparent desktop overlay app
|
||||||
|
- `plugins/`: backend plugin modules (`PLUGIN` entrypoint contract)
|
||||||
|
- `pico/`: Pico firmware
|
||||||
|
- `tests/`: backend and plugin behavior tests
|
||||||
|
- `data/`: runtime SQLite data (gitignored)
|
||||||
|
|
||||||
|
## Fast Start Commands
|
||||||
|
|
||||||
|
From repo root:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
python -m pip install -r requirements.txt
|
||||||
|
cd frontend; npm install; cd ..
|
||||||
|
cd overlay; npm install; cd ..
|
||||||
|
```
|
||||||
|
|
||||||
|
Run backend:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
python -m uvicorn backend.main:app --host 127.0.0.1 --port 8000
|
||||||
|
```
|
||||||
|
|
||||||
|
Frontend dev mode (separate shell):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd frontend
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Frontend production-style build:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd frontend
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Run tests:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
pytest
|
||||||
|
```
|
||||||
|
|
||||||
|
Overlay local run:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
cd overlay
|
||||||
|
npm run dev
|
||||||
|
```
|
||||||
|
|
||||||
|
## Runtime Contracts To Respect
|
||||||
|
|
||||||
|
### Backend Runtime
|
||||||
|
|
||||||
|
- App entrypoint and route wiring live in `backend/main.py`.
|
||||||
|
- `Runtime` owns `db`, websocket manager, plugin manager, action engine, serial service, and app discovery.
|
||||||
|
- WebSocket event flow (`/ws`) is part of the product behavior; avoid breaking event names casually.
|
||||||
|
|
||||||
|
### Database and Layout Rules
|
||||||
|
|
||||||
|
- SQLite file defaults to `data/streamdeck.sqlite`.
|
||||||
|
- First profile/root folder define canonical physical button layout.
|
||||||
|
- Physical mapping updates are intentionally restricted to the first profile's root folder.
|
||||||
|
- Schema + defaults are managed in `backend/database.py`; preserve migration safety and default seeding.
|
||||||
|
|
||||||
|
### Action Engine
|
||||||
|
|
||||||
|
- Action dispatch is centralized in `backend/services/actions.py`.
|
||||||
|
- Built-ins include: `noop`, `key_combo`, `chain`, `app_launch`, `folder`, `folder_rotation`, `plugin`.
|
||||||
|
- `click_check` mode blocks action execution and is relied on by UI/testing flows.
|
||||||
|
|
||||||
|
### Plugin System
|
||||||
|
|
||||||
|
- Plugins load from `plugins/` through `backend/services/plugins.py`.
|
||||||
|
- Each plugin exports top-level `PLUGIN`.
|
||||||
|
- Expected plugin attributes: `name`, `desc`, `version`, `actions`.
|
||||||
|
- Optional hooks: `on_load(ctx)`, `on_event(ctx, event)`, `execute_action(ctx, action_id, config, event)`.
|
||||||
|
- Plugin failures should be isolated (disabled plugin, backend stays alive).
|
||||||
|
|
||||||
|
## Firmware Assumptions
|
||||||
|
|
||||||
|
- Pico reports JSON lines with fields: `button`, `pin`, `event`, `pressed`.
|
||||||
|
- Button indices are 1..10.
|
||||||
|
- Wiring order in firmware is authoritative: `28,27,26,22,21,20,18,19,17,16`.
|
||||||
|
|
||||||
|
## Change Workflow (Recommended)
|
||||||
|
|
||||||
|
1. Read impacted module(s) and existing tests.
|
||||||
|
2. Implement minimal, targeted change.
|
||||||
|
3. Add/update tests in `tests/` for behavior changes.
|
||||||
|
4. Run `pytest`.
|
||||||
|
5. If frontend/overlay touched, run corresponding build command(s).
|
||||||
|
6. Summarize user-visible impact and any migration or operational notes.
|
||||||
|
|
||||||
|
## Guardrails
|
||||||
|
|
||||||
|
- Keep backend behavior deterministic and explicit; avoid silent fallbacks unless already established.
|
||||||
|
- Do not commit runtime/generated directories:
|
||||||
|
- `data/`
|
||||||
|
- `frontend/dist/`, `frontend/node_modules/`
|
||||||
|
- `overlay/dist/`, `overlay/release/`, `overlay/node_modules/`
|
||||||
|
- Prefer extending existing action/plugin patterns over introducing parallel frameworks.
|
||||||
|
- Preserve local-first behavior: no cloud dependency required for baseline functionality.
|
||||||
|
|
||||||
|
## High-Value Test Targets
|
||||||
|
|
||||||
|
When changing core behavior, prioritize tests around:
|
||||||
|
|
||||||
|
- Pico event parsing (`parse_pico_line`)
|
||||||
|
- Profile/folder/button invariants in `Database`
|
||||||
|
- Physical layout synchronization and restrictions
|
||||||
|
- Action execution paths (`folder`, `folder_rotation`, `plugin`, `chain`)
|
||||||
|
- Plugin isolation and HTTP/device integration plugins
|
||||||
|
|
||||||
Reference in New Issue
Block a user