diff --git a/apps/streamdeck/README.md b/apps/streamdeck/README.md index f9bac824f..0e1db308c 100644 --- a/apps/streamdeck/README.md +++ b/apps/streamdeck/README.md @@ -96,12 +96,12 @@ the selection, the dials review it.** │ STREAM DECK + │ │ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ -│ │ Builder│ │ Builder│ │ Builder│ │ Builder│ Row 1: │ -│ │ slot 1 │ │ slot 2 │ │ slot 3 │ │ slot 4 │ selectors │ +│ │OpenArch│ │ Builder│ │ Builder│ │ Builder│ Row 1: │ +│ │ (main) │ │ (1st) │ │ (2nd) │ │ (3rd) │ selectors │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │ -│ │Approve │ │ Dev │ │Send Fb │ │ Bldr │ Row 2: │ -│ │ Gate │ │ Server │ │ (N) │ │ Term │ palette │ +│ │ │ │Approve │ │OpenArch│ │ Bldr │ Row 2: │ +│ │ (free) │ │ Gate │ │ (bldr) │ │ Term │ palette │ │ └────────┘ └────────┘ └────────┘ └────────┘ │ │ ┌──────────────────────────────────────────────┐ │ │ │ touch strip: each dial's title + live detail │ │ @@ -112,15 +112,27 @@ the selection, the dials review it.** └──────────────────────────────────────────────────────────┘ ``` -- **Row 1 — fleet selectors.** Four **Builder Action** keys, one per slot (1–4). - They are a **4-wide window** onto the fleet: with more than four builders the - **Select dial** (Zoom Navigator rotate) scrolls the window to builders 5–8, 9–N, - and the slot holding the current selection is accented. Press selects the builder +- **Row 1 — selectors, anchored by the architect.** Slot 1 is **Open Architect + Terminal** pinned to **Main** mode: a fixed anchor at the left of the board that + opens the workspace's `main` architect. It can sit in Row 1 without breaking the + "Row 1 selects" invariant precisely because Main mode is **selection-independent** — + it always targets `main`, so it neither reads nor moves the shared selection. Slots + 2–4 are **Builder Action** selectors — here **three** of them. + The selectors are a **window** onto the fleet whose width is **exactly the number of + Builder Action keys you place** (three here), not a fixed count: the keys self-order + by physical position (left to right, top row first), so there are no slot numbers to + set, and a Mini or an XL sizes itself the same way. With more builders than keys the + **Select dial** (Zoom Navigator rotate) scrolls the window a page at a time, and the + slot holding the current selection is accented. Because the window follows the placed + keys, a builder is never selectable while shown on no key. Press selects the builder (Row 2 + the dials follow) and opens its phase artifact. - **Row 2 — action palette**, fixed in place, always acting on the **selected** - builder: **Approve Gate · Dev Server · Send Feedback (N) · Open Builder - Terminal**. Its sibling **Open Architect Terminal** opens the owning architect - instead — place it where a slot frees up (e.g. Send Feedback in forward mode). + builder: slot 1 is **free** (drop any key here — e.g. Dev Server or Send Feedback), + then **Approve Gate · Open Architect Terminal (builder mode) · Open Builder + Terminal**. The Row-2 architect key is pinned to **builder** mode, so it opens the + **selected builder's owning architect** — the per-builder complement to Row 1's + `main`-mode anchor. Between the two keys, both `main` and whoever spawned the current + builder are one press away. Nothing is fixed — drag whatever you want onto each slot in the Stream Deck app. The 5th encoder, **Spawn from Backlog**, can swap onto a dial in place of any of @@ -130,13 +142,16 @@ the four above (e.g. replace PR Nav when you are triaging the backlog). ### Keys -- **Builder Action** (Row 1) — a live tile for a builder **slot**, but as a 4-wide - **window** onto the fleet, not a fixed index: slot N shows the Nth builder on the - current page, and the **Select dial** scrolls the page so a fleet larger than four - is fully reachable. It shows the builder's issue + phase, accents the slot holding - the selection, and on press selects the builder (Row 2 + the dials follow) and - opens its phase artifact. The default press verb is **Automatic** (the current - phase's spec / plan / diff); pick a fixed verb in the PI to always run that. +- **Builder Action** (Row 1) — a live tile for a builder **slot**, as a **window** + onto the fleet whose width is the number of these keys you placed (not a fixed + index): the key's slot is its position among them (reading order, row then column), + so the Nth key shows the Nth builder on the current page, and the **Select dial** + scrolls the page so a fleet larger than the window is fully reachable. Because the + window matches the placed keys, a builder is never selectable while shown on no key. + It shows the builder's issue + phase, accents the slot holding the selection, and on + press selects the builder (Row 2 + the dials follow) and opens its phase artifact. + The default press verb is **Automatic** (the current phase's spec / plan / diff); + pick a fixed verb in the PI to always run that. - **Approve Gate** (Row 2) — the **single** approve affordance. Acts on the **selected** builder: the face shows its pending gate (e.g. `Plan · Approve`), and press surfaces that gate's **approval modal in the focused VSCode window** for you @@ -164,12 +179,11 @@ the four above (e.g. replace PR Nav when you are triaging the backlog). in Main mode when `main` isn't live, VSCode opens the first architect while the face still reads `Main` (the mode reflects your configured intent); and a live architect registration behind a dead terminal opens a session nobody reads (the - deck can't detect it). Placement caveat: the Main-mode key is selection- - independent, so it can live on a **Row 1** key without affecting selection — but - Row 1's window is a fixed page of four (independent of how many Builder Action - keys you place), so freeing a Row 1 key leaves three builder slots and hides - every fourth builder past a three-builder fleet. Recommended for small working - sets; self-sizing the Row 1 window is tracked separately (#1465). + deck can't detect it). Placement: the Main-mode key is selection-independent, so + it can live on a **Row 1** key without affecting selection — and because Row 1's + window sizes itself to the Builder Action keys you actually place (#1465), giving a + Row 1 key to this one simply leaves a correctly-sized three-wide builder window, + with no hidden builders. That is the recommended layout above (Row 1 slot 1). - **Codev Action** — fires a workspace verb. Choose it in the Property Inspector (Open Architect/Builder Terminal, View Diff, Send Message, Spawn Builder, Refresh Overview). Defaults to Refresh Overview. (The Open Architect Terminal diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/manifest.json b/apps/streamdeck/com.cluesmith.codev.sdPlugin/manifest.json index 5c0ebf330..5f79862ca 100644 --- a/apps/streamdeck/com.cluesmith.codev.sdPlugin/manifest.json +++ b/apps/streamdeck/com.cluesmith.codev.sdPlugin/manifest.json @@ -130,7 +130,7 @@ { "Name": "Builder Action", "UUID": "com.cluesmith.codev.builder-action", - "Tooltip": "Live tile for the Nth builder (set the slot in the property inspector). Shows its issue + phase; press selects the builder and opens the artifact for its current phase (spec / plan / diff), or a fixed verb you choose.", + "Tooltip": "Live tile for a builder — its slot is where you place the key (the selectors self-order left to right, top row first). Shows its issue + phase; press selects the builder and opens the artifact for its current phase (spec / plan / diff), or a fixed verb you choose.", "Icon": "icons/list/builder-action", "Controllers": [ "Keypad" diff --git a/apps/streamdeck/com.cluesmith.codev.sdPlugin/ui/builder-action.html b/apps/streamdeck/com.cluesmith.codev.sdPlugin/ui/builder-action.html index 29bf9b615..899477bf7 100644 --- a/apps/streamdeck/com.cluesmith.codev.sdPlugin/ui/builder-action.html +++ b/apps/streamdeck/com.cluesmith.codev.sdPlugin/ui/builder-action.html @@ -3,23 +3,11 @@
- -