# Plan enBoxer is a new Hyprland program. It routes keys to several World of Warcraft windows and can show a live crop of one window on another. ## How work is split Two roles. They do not share a keyboard. | Role | Who | Does | | --- | --- | --- | | Designer + PM | Grok | Writes this file and `TASKS.md`. Splits the product into **small** tickets **before** the worker starts a phase. Does not implement those tickets. | | Worker | OpenCode | Implements open tickets, **one at a time**, with the **ponytail plugin** on (`opencode.json`). Never `--pure`. Never runs ponytail-review. | Sequence for a phase: 1. Grok writes every ticket for that phase into `TASKS.md` (Open list). That is “giving tasks.” 2. Grok starts OpenCode against those tickets. No ponytail-review while tickets are still being written or still open. 3. OpenCode finishes the phase (or says a ticket is blocked). 4. Grok reads the diff against the tickets (ordinary review: did the ticket land, tests pass). Not ponytail. 5. If a ticket is wrong, Grok adds a **smaller** ticket and sends OpenCode back. That is a new giving-tasks step; ponytail still waits. 6. When Grok accepts the whole phase, **Grok** runs ponytail-review once. 7. Grok pushes git. The name `en/enbuddy` is already taken on this Gitea (existing `en/enBuddy`); this project uses `https://gitea.nettsi.de/en/enBoxer`. OpenCode must not invent tickets, add features, or “clean up” docs unless a ticket says so. ## Product rules (do not regress) - Named maps: a hotkey runs a list of steps to named targets (`current`, `others`, `all`, `group:…`, `slots:…`). - Keys not in maps (and not in repeater) go only to the focused primary. - `passthrough` is a list. Empty means nothing is skipped. The example profile uses ESDF so those letters stay on the primary. - Routing is off when focus is not a managed game window and not an enBoxer overlay. - No code is loaded into the game. Keys go through Hyprland (`hl.dsp.send_shortcut` / `send_key_state`). - No game addon in v1. Macros and the Interact with Target bind are documented in `docs/MACROS.md`. - Video FX: crop of slot A drawn on the primary; hover with `pass_through` sends keys and clicks to slot A only. ## Phase 0 — tree and contract (Grok) - [x] Crate, profile, engine, Hyprland session, grim Video FX, tests - [x] `README.md`, `DESCRIPTION.md`, `CHANGELOG.md`, `AGENT.md`, `TASKS.md`, this file - [x] `opencode.json` with ponytail - [ ] Git remote + push (after Phase 1 is accepted and Grok has run ponytail-review) ## Phase 1 — OpenCode tickets (all assigned below; do not ponytail-review until they are closed) See `TASKS.md`. - T1 format — closed - T2 clippy — closed - T3 stop if already clean — closed - T4 Video FX click pass-through — closed - T5 log slot list when it changes — closed - T6 test: empty passthrough can map `e` — closed Phase 1 Open list is empty. Next: Grok ponytail-review, then git push. ## Later (not this phase, not OpenCode until Grok files tickets) - Capture a window that is fully covered (`hyprland-toplevel-export`) - Clicks on a covered source without moving the real cursor onto the covering window - Follow/assist binds that track which slot is primary - Check Forever’s macro language when that client exists ## Invoke worker ```bash opencode run --dir /home/en/git/enBoxer --auto --title "enBoxer T4-T6" \ "Read AGENT.md, PLAN.md, TASKS.md. Ponytail plugin required. Do open tickets in order, one at a time. Do not run ponytail-review." ```