3.9 KiB
Continuum Scratchpad and Window Actions Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add address-scoped close and drag/drop workspace movement plus a global visual scratchpad shelf to Continuum.
Architecture: Window components emit intent; OverviewBody owns Hyprland dispatches. Workspace cards and the shelf are drop destinations, and the special scratch workspace remains separate from the positive-workspace filmstrip.
Tech Stack: Quickshell QML, QtQuick Drag APIs, Quickshell.Hyprland, Hyprland dispatchers, Bash contract tests
Spec: docs/superpowers/specs/2026-08-17-continuum-scratchpad-design.md
Global Constraints
- Every close and move command must target one normalized window address.
- Existing click-to-focus, search, and focus-workspace integration must remain intact.
Super+XandSuper+Shift+Xsemantics remain unchanged.- Drag feedback is event-driven and stops immediately after drop/cancel.
Task 1: Address-scoped action boundary
Files:
- Modify:
config/dot/quickshell/modules/overview/OverviewBody.qml - Test:
tests/quickshell/overview-window-actions-contract.sh
Interfaces:
-
Produces:
addressOf(toplevel),closeToplevel(toplevel),moveToplevel(toplevel, workspaceName), andrestoreToplevel(toplevel). -
Write a static/live contract proving move and close operations include an exact disposable-window address.
-
Run it and verify the missing IPC/action surface fails.
-
Implement normalized address helpers and bounded post-dispatch refresh.
-
Run the contract to green without touching non-disposable windows.
Task 2: Draggable window chrome
Files:
- Modify:
config/dot/quickshell/modules/overview/WindowThumbnail.qml - Modify:
config/dot/quickshell/modules/overview/WorkspaceCard.qml
Interfaces:
-
Produces: activation, close, drag-start, and drag-finish signals carrying the toplevel.
-
Consumes: workspace drop callback carrying toplevel and target workspace.
-
Add a source contract for hover-only close chrome and drag payload identity.
-
Implement restrained hover/drag states with activation suppression after drag.
-
Make workspace cards highlight and accept the exact toplevel payload.
-
Verify clicking still focuses and dropping leaves Continuum open.
Task 3: Global scratchpad shelf
Files:
- Create:
config/dot/quickshell/modules/overview/ScratchpadShelf.qml - Modify:
config/dot/quickshell/modules/overview/OverviewBody.qml - Test:
tests/quickshell/scratchpad-shelf-contract.sh
Interfaces:
-
Consumes: Hyprland workspace named
special:scratchand OverviewBody move/restore callbacks. -
Produces: always-available scratch drop target and populated live-card shelf.
-
Write a contract confirming the global special workspace and existing keybindings.
-
Implement the collapsed empty target and expanded populated shelf.
-
Wire drop-to-hide, click-to-restore, and address-scoped close.
-
Verify the selected positive workspace remains stable while hiding windows.
Task 4: Keyboard navigation and visual refresh
Files:
-
Modify:
config/dot/quickshell/modules/overview/Overview.qml -
Modify:
config/dot/quickshell/modules/overview/OverviewBody.qml -
Add workspace Left/Right, result navigation, Enter, Delete, and Escape handling.
-
Refresh workspace/toplevel models and one-shot captures after successful actions.
-
Verify keyboard and pointer flows do not double-activate.
Task 5: System verification
- Run overview, focus, window-action, and scratchpad contracts.
- Use disposable windows to test move, hide, restore, and close end to end.
- Capture empty shelf, populated shelf, drop target, and close chrome states.
- Restart Quickshell and confirm the overview maps without warnings.