aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers
AgeCommit message (Collapse)AuthorFilesLines
4 hoursassistant: load the chat's model on open, docs for cloud modelsDanilo M.1-1/+1
The canvas asks for its chat's model, else the preferred one, when it opens and when the pick changes; a cloud id loads nothing. The paperclip also closes the model panel, so it and the picker never stack. The plan's Models.qml import is corrected to the one that resolves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 hoursdocs: plan the assistant's cloud models, settings and canvasDanilo M.1-0/+909
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 hourscompanion: blush spec names what the code checksDanilo M.1-2/+2
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 hourscompanion: README for the wallpaper blush, spec matches the triggerDanilo M.1-2/+3
The trigger fires whenever she stops being away, which is a dodge and fullscreen as well as the three appearances the spec named. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 hourscompanion: plan for blushing at a listed wallpaperDanilo M.1-0/+655
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 hourscompanion: spec for blushing at a listed wallpaperDanilo M.1-0/+73
She turns to the wallpaper with the existing watch back view and blushes with blush3, when the workspace in front of her is empty and the wallpaper on her monitor is on a plain text list. The list is toggled from the wallpaper picker and its path set on the companion page. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 hourscompanion: README, AGENTS listing, Lines.js and Figure.qml in the specDanilo M.1-3/+3
The README records the measurements the code depends on: where typing and BackSpace come from, why the dodge waits for the pointer, the IdleMonitor enabled default, and fullscreen 2 against maximised 1. AGENTS.md gains the QtQuick Sprite trap beside the Controls Button one, since it took the desktop shell down on restart. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
7 hoursdocs: companion plan: the frames and prep-frames are doneDanilo M.1-1/+6
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 hourscompanion: the dress set, a shoved frame, several references per frameDanilo M.2-5/+9
The dress frames are made. What the tries taught is in frames.txt beside each line: klein turns the blindfold into an eye mask under strong expressions, so those take it off (BARE) and the rest name it as one solid band (EYES); standing "shoved" read as walking in four seeds, so it is airborne, edited from the seed-7 attempt kept in candidates/; a back view fits "watch", her watching the screen while the user types; klein would neither draw the game's Virtuous Treaty nor move a sword, nor turn her three-quarters, so muse takes only the arms of her official art. gen-frames now takes several references per frame (a + b): the first is edited, the rest are images the prompt points at. The leotard set loses the blindfold too. shoved gets a frame of its own instead of mad: in the spec's table and the plan's Mood.js and its test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursdocs: companion implementation planDanilo M.1-0/+1373
Eleven tasks: the Hyprland events first, since the spec's open checks gate the QML that depends on them; the shared balloon check; Mood.js and Lines.js with node checks; prep-frames; the assistant's replied signal; Sprite and Companion; notes; then the hand checks and the frame list for the user. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursdocs: companion: standing rest poseDanilo M.1-5/+12
Lying down is what boredom ends in, so a sitting rest pose made it no change. The standing base is a klein edit of the sitting one, which stays as its source, and the smile and wave made from the sitting base are redone from the standing one so every frame descends from a single reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursdocs: companion: a leotard set of every frameDanilo M.1-14/+23
The self-destruct leaves her in the leotard for 60 s. With one leotard frame she would freeze for that long while reactions played only as lines; a full second set keeps every state animated. Each leotard frame is a klein edit of its own dress frame, so the pose carries over, and a missing frame falls back within its outfit, never to the other one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
10 hoursdocs: companion designDanilo M.1-0/+215
A chibi 2B in the bottom-right corner of the focused monitor, part of desktop/ so she reads the assistant's state directly. The spec records what was measured while making the art (img2img moves faces, not limbs; klein moves limbs when every kept detail is named), the sd.cpp SDXL diffusers bug that forced the single-file Pony checkpoint, and the three Hyprland behaviours still to test before code depends on them. The art stays out of the repo: the character is Square Enix's and the repo is GPLv2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 daysdocs: plan the sb-builder settings pagesDanilo M.1-0/+1157
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2 daysdocs: spec the sb-builder settings pagesDanilo M.1-0/+92
Two pages under SB Builder in the settings window: the GUI's config.toml edited in place, and the helper's config on the VM through new config-get/config-set commands, so the helper keeps validating what is written to it. The sb-builder half is built in that repo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysassistant: grey out the mic when the model cannot hearDanilo M.1-4/+9
AssistantModule keeps each router model's input_modalities and exposes hears: the model loading, else the first not unloaded (the daemon's rule), reports audio. Unknown inputs or a router that is down count as yes; the daemon's error covers the rest. The model list is now read on every canvas open, not only when a preferred model is set, so hears is current when the card shows. Checked: the rule against the router's live /models (Gemma resident: on; Qwen resident or loading: off; router down: on). Not yet seen by eye after a desktop shell reload. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysassistant: a mic button asks by voiceDanilo M.2-1/+292
Each recording is a pw-record Process of its own, made from a Component like the Do row's runs, so a stopped recording's late exit cannot be read as the next one's. Stopping sets running to false (SIGTERM), which lets pw-record write the WAV header; the audio ask goes out from the process's exit, not from the click. Recording stops itself at 59 s: the daemon refuses over 60 s by file size, and the stop lands a little after the tick. Escape cancels a recording before it does anything else, and closing the card or losing the daemon cancels it too. A pw-record that ends on its own says "recording failed". Checked: a scratch harness saw transcribing, thinking, idle for a 2 s recording; by hand, every case in the spec passed with no pw-record left behind, a desktop shell reload mid-recording included. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysdocs: spec the assistant canvas micDanilo M.1-0/+90
A mic button records with pw-record and sends the WAV's path as an audio ask; the daemon transcribes it. pw-record writes a right header when stopped by SIGTERM, but one stray kept recording in a trial, so every path out stops it and the checks look for a stray each time. Recording stops at 59 s: the daemon refuses over 60 s by file size. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysdocs: plan notification soundsDanilo M.1-0/+696
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysdocs: notification sound theme mirrors gsettingsDanilo M.1-3/+18
Save sets the system sound theme too, and the page reads it back on every open so a change made elsewhere shows instead of being overwritten. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
4 daysdocs: spec notification soundsDanilo M.1-0/+123
A sound per urgency in config.json, played by the balloon shell under the same checks that decide the balloon. notifyd resolves the apps' sound-file, sound-name and suppress-sound hints into two published fields, looking names up in a configurable sound theme. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysdocs: plan the notification settings pageDanilo M.1-0/+1153
Ten tasks across notifyd (config loader, timeouts, caps, reload) and this repo (shared resolver with a node check, balloon placement and mute, the settings module). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
5 daysdocs: spec the notification settings pageDanilo M.1-0/+104
One config file in ~/.config/notifyd read by the daemon (timeouts, caps, picked up by notifyctl reload) and by both shells (placement, mute, DND). Snooze stays out: the status tile already covers it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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>