69 lines
3.4 KiB
Markdown
69 lines
3.4 KiB
Markdown
# 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 HTTPS `https://gitea.nettsi.de/en/enbuddy`. No SSH.
|
||
|
||
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."
|
||
```
|