Phase 6, the last of the fresh-install spec. 159 scripts lose their .sh: 110 contracts, 47 Vicinae commands, 2 compositor contracts. A shebang and the executable bit already select the interpreter. The extension only ever added something that had to stay in sync, and the rename proved the point twice over in the space of an hour. The spec's stated risk was Vicinae's script discovery. One script was renamed and reloaded on its own before the other 46 followed; it came back as scripts:panama.capture and all 47 resolve. What the probe turned up instead is that the extension was never only a filename: Vicinae's command IDs embed it, so every ID changed. Nothing in this repository refers to them, so nothing breaks. The only trace is Vicinae's metadata.json, whose visited map had two Panama entries that are now orphaned -- two commands lost their usage ranking and will earn it back. Worth knowing before anyone renames these again on a machine that has a keybind pointing at one. Rewriting the references by exact filename missed two things it structurally could not see: a name built from a variable, settings-$page.sh, and a glob, -name '*.sh'. Both were in the contract that counts the generated commands, which promptly reported 47 expected and 0 found. The mechanical part of a rename is the part that looks finished. The three subcommands. panama doctor fronts a health check that already existed and already ran at the end of every install but could not be reached from a terminal. panama upgrade re-runs the installer from anywhere. panama test runs the suite, which had no entry point at all -- 121 files that were the main safety net in this repository and were invisible in it. Writing that runner found three tests nothing was running. calendar_agenda_bridge_test, home_assistant_bridge_test and kdeconnect_bridge_test are unittest suites without the executable bit, so no contract invoked them and the first draft of the runner skipped them silently. All three pass, and have passed unobserved for weeks. The runner collects *_test.py as well now, because a runner with a blind spot is worse than no runner for the same reason a dependency checker with one is: it reports PASS. Six worktrees pruned. Each was re-checked rather than trusted to the spec's list, and two needed it: panama-commands is not on feat/panama-commands but on feat/gnome-tweaks-parity, and fix/panama-displays-review reads [ahead 3] -- ahead of its remote, not of main, with every commit patch-equivalent to landed work. roadmap-completion stays; it has five commits that are genuinely unlanded. The branches are left alone: pruning a worktree costs nothing, deleting a branch is a decision. 121 contracts pass. Claude-Session: https://claude.ai/code/session_01NvgBuSWB5sE43yWmg21ozj
83 lines
3.9 KiB
Markdown
83 lines
3.9 KiB
Markdown
# 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+X` and `Super+Shift+X` semantics 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`
|
|
|
|
**Interfaces:**
|
|
- Produces: `addressOf(toplevel)`, `closeToplevel(toplevel)`, `moveToplevel(toplevel, workspaceName)`, and `restoreToplevel(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`
|
|
|
|
**Interfaces:**
|
|
- Consumes: Hyprland workspace named `special:scratch` and 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.
|