aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers
AgeCommit message (Collapse)AuthorFilesLines
6 daysdocs: OBS pill enhancements planDanilo M.1-0/+343
6 daysdocs: OBS pill enhancements designDanilo M.1-0/+279
6 daysdocs: the OBS pill opens a controls panelDanilo M.2-114/+137
At rest the pill is a record dot with the elapsed time; a click morphs it into a panel, as the status pill does for sound, with Record/Stop, Pause/Resume, Show/Hide webcam and the scene list. The user preferred it to every control inline: the pill stays small, and scenes are picked by name rather than stepped through, so obsStep is gone. OBS quitting with the panel open clears it, or the island would stay held open. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6 daysdocs: OBS pill implementation planDanilo M.1-0/+528
Six tasks: logic helpers with their check, the openssl auth helper, the Obs singleton, the pill, island wiring with the sliver pulse, docs. Records two deviations from the spec found while planning: QML's WebSocket hides the close code, so a wrong password is logged as 'closed before Identified'; responses route on the echoed requestType. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6 daysdocs: OBS pill designDanilo M.1-0/+125
A pill on the island that exists while OBS runs: record, pause, scene, webcam visibility, and a pulsing sliver while recording. Talks to obs-websocket directly from QML (QtWebSockets is installed), reading the password from OBS's own config so no copy exists. Auth stays on because obs-websocket listens on every interface. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysnotes: an empty note body gets a file, and the second click writesDanilo M.1-10/+19
Reported from use: a note created with only a title then saved left a db.json entry with no file beside it, and reopening it said the file was missing. Cause: FileView.setText("") on a path that view has not loaded creates no file at all and reports no error. The index write (always non-empty JSON) was fine, so only the body was lost, which is why it looked like a missing file rather than a failed save. Bodies are now written by a Process running cat > <file> with the text on stdin: verified against empty and non-empty payloads, consecutive writes on one Process, and a store with no db.json at all. The exit code is the real outcome, so a refused write reports it. Second report in the same flow: the editor stays editable after the first click, so typing more and then pressing Commit & push dropped the edit, the push carrying only what the first click wrote. The second click now writes the current title and body before it commits and pushes.
7 daysnotes: delete asks before it destroysDanilo M.1-2/+4
The confirm was on the second click, after the first had already removed the file and the entry, so the 'Confirm?' label promised a check that had already happened and one stray click lost the note. The first click now only arms the button; the second removes and pushes the removal.
7 daysnotes: write and commit failures are reported, not assumedDanilo M.1-0/+4
A review of the branch found four ways the page could report success for work that never happened, all reachable in ordinary use. Writes: setText is asynchronous unless blockWrites, and its saved()/saveFailed() do not fire for every write (a second setText to the same path loses the signal, which stranded the callback), so a save was reported before it landed and a failed db.json or body write was never seen. Both views now block and carry the outcome, so writeDb and writeBody know the result when they return; a failed create therefore leaves no index entry. The create path also loads the body before the index, so a failed body write cannot leave an entry with no text. Commits: the sync chain swallowed every commit failure with '|| true', so a failing pre-commit hook or a signing failure pushed an unchanged HEAD and reported success. It now stages, commits only when something is staged, and lets 'set -e' fail the chain, with stderr folded in for the whole chain rather than just the push. Duplicate notes: the 'awaiting commit' state lived only in a 3 second timer, so a slower second click re-entered create() and appended a second note. It is now a page property that outlives the timer, and the button follows it. Preview: the shared Switch writes checked itself, dropping the binding, so the switch stopped following page.preview; resynced on change, the way StatusRow.qml does. Also validates a note's file name as digits before read, write or rm, and clears the index error once the index reads again.
7 daysnotes: in-drawer editor with commit-on-save and git pullDanilo M.1-7/+22
The editor, and the write and git path behind it. Save is two clicks and each does one thing: the first writes the note and only then arms the button as 'Commit & push?', so a quick second click cannot commit a note the first has not written yet. The write path refuses when db.json cannot be read as the index. That is not hypothetical: git pull --rebase --autostash resolves a remote db.json change against a local uncommitted one, the stash pop conflicts, git still exits 0, and the file is left full of merge markers. Reading that as 'no notes' and writing it back deleted every title in a probe; Notes.valid now distinguishes it from an empty store and the write reports instead. parse stays tolerant for display. Stamping lastpull also only follows a pull that worked, and only when git is on at all. Db reads that a write is based on go through reload() plus waitForJob(): blockLoading does not make reload() blocking, contrary to the note in AGENTS.md, and reading text() straight after reload() returns the old contents. A body is written with a plain setText, which needs no prior load; only reading text() before a load would.
7 daysdocs: notes drawer module spec and planDanilo M.2-0/+651
A drawer tile and page for bash-notes: browse, write, edit and delete notes in the page, sharing notes.sh's store so both tools work on the same notes. Git follows notes.sh's shape, pull before write, commit and push after, with two departures the page needs: an unconfirmed Save leaves db.json uncommitted (write and commit are two clicks here, one invocation there), so the pulls carry --autostash, and lastpull is stamped after the pull rather than before it, which notes.sh does and then ignores the failed pull that follows.
7 daysfix(assistant): review of the Do row and fileopsDanilo M.1-2/+2
The canvas: a To .md ended any other way than its own Stop (the footer Stop, a question, a drop, a daemon restart, an older daemon refusing the command) left the card at Working forever. The footer Stop goes through stopOp(), asking and dropping end the operation first, a disconnect ends it, and an error while nothing else runs is taken as its outcome. Each fileops run gets its own Process, so a stopped run's late answer is never read as the next one's. To .md takes one PDF, as one file is written. Compress... no longer flips back when file(1) refines a kind, long errors are elided, and a desktop with no documents folder gets Documents/Assistant rather than ~/Assistant. fileops: an animated GIF to PNG or JPEG left one file per frame under names the rename never found; the first frame is taken. JPEG flattens transparency onto white. Zipping a folder holding the output folder read its own growing archive without end; only regular files outside it are added, which also skips FIFOs and dangling links. qpdf warnings no longer fail a merge. A folder's free name keeps its dots, a lone .gz or .xz is decompressed rather than refused, and a dotfile's archive is not hidden. Tools die with fileops even when it is killed outright, a killed run's leftovers are swept on the next run, a stop between fork and bookkeeping cannot miss the child, and a late stop cannot add a second answer. Error lines lose bsdtar's doubled prefix and its delayed-exit noise. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysfeat(assistant): fileops, the Do row's local operationsDanilo M.1-2/+2
One CLI for converting, extracting, merging and compressing staged files, answering with one JSON line. Results are written under a temporary name and renamed to the first free one, so a failure or a stop leaves nothing half written, and a stop kills the tool's whole process group. This ffmpeg has no libx264 and no AAC encoder, so MP4 is H.264 through VAAPI with MP3 audio, and audio extraction copies AAC, MP3 and Opus tracks as they are. The test builds its inputs and checks every result's type. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: spec the Do row of file operationsDanilo M.1-0/+86
Local conversions, extraction, merge and compression through a small fileops CLI, results in Documents/Assistant, and To .md through the daemon's new write command. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: spec the Ask presetsDanilo M.1-0/+73
Canned questions per staged kind in the file state, stored in Prefs with built-in defaults so a future settings page can edit them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: the entry line and file drop are implementedDanilo M.1-1/+1
Checked by hand: resume rule, island drop and its refusal message, the file state, Chat about it, the picker, and the Escape order. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: plan the entry line, file state, picker and island dropDanilo M.1-0/+1345
Four tasks: file kinds, the three card states with staging and the in-card picker, the island receptacle, and the handover. The card files ran in a scratch harness against the attachment daemon first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: attach files from the chat through an in-card pickerDanilo M.1-1/+27
A system file dialog would open under the overlay that holds the keyboard, so the picker is drawn in the card, over the transcript, from Qt.labs.folderlistmodel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: spec the entry line and file drop on the islandDanilo M.1-0/+92
Three card states: an entry line, a file state offering what to do with dropped files, and the chat. A drop always starts a new task, and asking about a file is one of the choices rather than the only one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: the assistant canvas is implementedDanilo M.1-1/+1
All nine visual checks passed by hand. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: plan the assistant canvasDanilo M.1-0/+1279
Five tasks: the markdown splitter, the canvas components, hosting them in the desktop shell, the switch-over (voice overlay out, hypr-theme bind, autostart and blur), and the user's visual check. Every file was run in a scratch harness against the real daemon before planning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs: spec the assistant canvasDanilo M.1-0/+108
A Luma-style overlay on SUPER+Home, inside the desktop process, as a pure view over desktop-assistant's socket. It replaces the voice overlay in assistant/ and stands in for llamachat while it is tested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(git): the git config page, and replace-all appending on no matchDanilo M.1-1/+3
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(git): implementation plan for the git config pageDanilo M.1-0/+941
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(git): design for the global git config pageDanilo M.1-0/+83
A drawer page, reached from the user page, listing every global git key and editing, adding and removing values through git config itself, so the file keeps its comments and quoting. --fixed-value lets each write target one value of a multi-valued key. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(plan): user details implementation planDanilo M.1-0/+1054
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(spec): user details picks the git signing keyDanilo M.1-7/+13
The git sync was meant to include user.signingkey and the spec had dropped it, claiming nothing reads a GPG key. git does. The page offers the secret keys gpg holds, plus None, and writes the fingerprint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(spec): user details leaves the password outDanilo M.1-0/+4
passwd in a terminal already does it, AccountsService's SetPassword needs admin rights and a hash, and a change desyncs the login keyring. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 daysdocs(spec): user details in the drawerDanilo M.1-0/+97
A drawer row greets the login user and opens a page that edits name, email, avatar, language and location, written where other programs already read them: AccountsService (and through it the passwd GECOS LibreOffice reads), KDE's emaildefaults and the global git config, with the surname shortened to an initial for git. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfix(updates): review findings in updatesctlDanilo M.1-2/+2
A git hash starting with a letter (3.1-a59215d) ordered behind its base, because any trailing alphabetic chunk counted as a pre-release; only alpha, beta, rc, pre and dev do now. Trailing zeros (1.14 against 1.14.0) compare equal instead of reading as an upstream bump. A bad line in the slackpkg blacklist is skipped rather than crashing the script and leaving the drawer with nothing. An AppImage keeps its key over a flatpak of the same name, as the spec orders them, and flatpak list has a timeout. A Slackware upgrade compares version and build, so an arch change alone is not a row. The spec's prose now matches the code: the upstream comparison includes the installed version. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(plan): the updates module, and two spec correctionsDanilo M.2-12/+1213
Drafting the code found two holes in the spec. Awaiting build was limited to the user's own recipes, so an SBo package whose recipe had caught up but was not yet built (nessus) showed in no section; it now covers any recipe. And "the newest ChangeLog line decides" would never call a package new once it had been upgraded after being added; only Added and Removed lines count now. The prefix rule for kernel suffixes is dropped as redundant: version order already ranks a suffixed version newer, which is never behind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(spec): an updates module that names the next stepDanilo M.1-0/+149
The conky updates card copies nvtable's table, where installed-behind and repo-behind share a row and are told apart by colour, and it measured "shipped" as the .info version: gamescope and kitty read as ready to install while the binary repo still held the old build. The drawer module sorts each tracked package into one action, from PACKAGES.TXT of the binary repo rather than the recipe: upgrade here, awaiting build, upstream newer, app updates. Slackware is compared mirror against installed, not against slackpkg's local ChangeLog, which `slackpkg update` replaces without installing anything; new and removed packages come from the mirror's ChangeLog. NFS reads go through a timed-out child because the mount is hard. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(spec): the drawer as the control centerDanilo M.1-0/+129
The drawer keeps its look and takes over: the island's controls panel goes, since each of its tiles opened a drawer page that already existed, and SUPER alone opens the drawer instead. The tile grid scrolls inside a three-row box so new tiles do not eat the notification space. New: a performance page reusing the island's Perf service, a cliphist clipboard page replacing the rofi list, and a quiet mode in the status registry that mutes Claude and opencode sounds through one notify-sound script while their popups stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(window-switcher): gravity pulls the scatter toward the centreDanilo M.1-1/+4
On screen the spiral alone read as loose: separation keeps the spiral's gaps, and the previews filled 24 to 30% of the screen. Thirty rounds now pull every window 15% closer to the centre and push them apart again, which fills 35 to 55% and makes each preview up to 1.5x larger. Twenty windows lay out in about 4ms. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysfeat(window-switcher): the expose scatter layoutDanilo M.1-16/+19
layout() seeds windows on a golden-angle spiral, most recent at the centre, pushes overlapping pairs apart along the axis that costs less screen, and fits the result with one scale so sizes stay relative. The spec's first seed, the windows' real positions, was prototyped and dropped: every window on this desk fills its monitor, so they started in one pile, and pushing a pile apart made a line that still overlapped after 300 passes and filled 8 to 15% of the screen. The spiral converged in 1 to 55 passes. Comparing overlaps in raw pixels stacked wide windows into a column, which is why the axis choice divides by the screen's width and height. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 daysdocs(spec): expose on ALT+TAB and a hot cornerDanilo M.1-0/+132
The window-switcher grid becomes a Mission Control scatter: previews keep their real shape and relative size, seeded from their real positions and pushed apart, then fitted with one scale. A top-right hot corner on DP-1 opens it after a 250ms glow that warns before it fires, and stays inert while gaming. shared/Status.qml is not linked into window-switcher because a second instance would run its own game poll and react to presentation twice; the corner reads status.gaming directly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): performance warning is a dot, stale IP a dashDanilo M.1-5/+8
IconImage cannot be recoloured without an effect layer, so the severity shows as a dot on the icon's corner. A stale public IP is a dash with no age, as the Errors section already said. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): performance panel implementation planDanilo M.1-0/+1518
Nine tasks: two spec corrections, Perf.js with its node test, the pinned IP in Prefs, the Perf service, the panel, the status pill wiring, an on-screen check against the still-running conky widgets, docs, and last the removal of those widgets from conky-theme-udt. The plan's Perf.js was run against its test while planning. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): performance panel from the conky widgetsDanilo M.1-0/+198
Sub-project 4. An icon in the status pill opens a card grid of CPU, RAM, temperatures, GPU, disks and network, read from the same /proc, /sys and hwmon sources conky uses. The icon warns on temperatures, RAM, disks and a public IP that drifts from a pinned address, since the VPN depends on the ISP's fixed IP. CPU load is left out of the icon because spikes would flicker it. The four conky widgets are removed once the panel is verified beside them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): calendar protocol settled while planningDanilo M.1-5/+23
One JSON envelope on stdout for every calctl command, the event as an argument rather than stdin, a get command because the editor edits the series rather than the occurrence clicked, and a pure Cal.js for the date logic so it is tested under node like the island's other helpers. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): calendar panel implementation planDanilo M.1-0/+2202
Ten tasks: protocol corrections to the spec, calctl in two halves with their CLI tests, the pure Cal.js with its node test, the service, the editor, the panel, the island wiring, a pass with the user and docs. Both test suites were run against the plan's own code before committing, and a read-only list against the live calendars measured 0.11s. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): calendar panel with event editingDanilo M.1-0/+153
Sub-project 3. The clock pill opens a month grid beside the selected day's agenda, and an editor that writes the vdirsyncer calendars through a small Python tool, calctl, rather than khal: khal 0.11 has no JSON output and keeps a cache that is a second view of the same files. Recurrence stops at a plain FREQ and UNTIL, and the form owns one alarm; anything richer in an existing event reads as custom and survives an edit untouched. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysfix(island): review findings in the controls panelDanilo M.1-2/+3
Edit mode let a right-click and the wheel through to the tile, so a right-click opened the drawer and scroll changed volume, against the spec. The drag area now takes both buttons and the wheel. A scroll up on a level already above the cap, such as a mic set to 120% elsewhere, snapped it down to the cap. The cap now only stops a step up. Prefs logs a failed write, which printErrors off had silenced: the new order would otherwise vanish at the next restart with no trace. Its parsed object is renamed from data to doc, so it cannot shadow a base property of that name. The spec now says what was built: JSON.parse rather than a JsonAdapter, and the helper list as it is. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): controls panel uses named icons and a plain dragDanilo M.1-4/+15
Planning found two places where the spec diverged from the island it extends. Icons go through the icon theme like every other island icon, and drag is one MouseArea per tile with a pure drop-slot helper, which is less code than DragHandler and DropArea and can be tested under node. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(plan): controls panel implementation planDanilo M.1-0/+1063
Nine tasks: two spec corrections found while planning, the pure helpers with their node test, the preferences singleton, the tile, the panel, the island and IPC wiring, the SUPER release bind with its fallback, a visual pass with the user, and docs. The plan's test was run against the plan's Controls.js before committing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 daysdocs(spec): controls panel and preferences storeDanilo M.1-0/+147
Sub-project 2. A grid of seven toggles opened from the status pill and by a bare SUPER release, with an edit mode to reorder, hide and show tiles. The visible list lives in a JSON file under the state home, so a tile added to the code later starts hidden rather than appearing unasked. The drawer keeps the detail: right-click on a tile opens its page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07fix(island): neutral idle sliver, flag scroll via MouseAreaDanilo M.1-1/+2
The sliver was the accent at rest, and udt had snapped the accent to the same colour as the mic indicator (#36d190), so an idle sliver read as a live microphone. It is Theme.overlay at rest now; captures keep their colours whatever the wallpaper does. The flag's WheelHandler never fired. MouseArea.onWheel, which SoundPage already uses, does; scroll now switches layout, one step per notch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs(plan): island core implementation planDanilo M.2-6/+1471
Twelve tasks from pure logic to waybar removal. The spec is corrected on two points found while reading the code: Quickshell's PwNode has no running state, so mic and screen detection poll pw-dump like the waybar script did, and the VM dot rule now agrees with its own table on saved VMs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs(spec): island flag follows whichever keyboard is mainDanilo M.1-1/+4
The same keyboard appears as a different device over USB and over its dongle, so the main device is resolved per event, never cached. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07docs(spec): island core designDanilo M.1-0/+213
Sub-project 1 of the move toward a Modesty-style integrated desktop: a top-centre island on DP-1 hidden behind a sliver, a clock pill and a status pill that slide out of it, a sound panel, and the removal of waybar. Records the decisions taken while brainstorming: the island floats over windows with no exclusive zone, privacy capture recolours the sliver rather than revealing the pills, the clock pill flicks the desktop icon, app icon and app name on workspace change and app open but not on focus change, the volume icon has no gestures beyond opening its panel, and the flag images move into this repo. Modesty is GPLv3, so only its ideas are used. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05fix(ai): count a running sd-cli as the sd engineDanilo M.1-1/+5
fanfictioner runs sd-cli one-shot, not through sd-server, so the sd row read down while a CLI run held VRAM and generated. A running sd-cli now reads up and busy, its model marked (sd-cli), and outranks the web UI. The model is the first --diffusion-model/-m: sd-cli's prompt follows and is free text that may contain "-m". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>