aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/plans
AgeCommit message (Collapse)AuthorFilesLines
34 hoursdocs: correct three plan details found during executionDanilo M.1-14/+32
The Connections block needs a typed property on a QtObject, the bluetooth README lines belong to Task 6 so every commit stays self-consistent, and Pairing has no status property. Each was found by a task review and fixed in the plan as well as the code.
34 hoursdocs: plan the network and bluetooth modulesDanilo M.1-0/+1343
Eight tasks, each leaving the tree working: network wired page, wifi section, README, bluetooth module and page, pairing, README, then the waybar removal and the trap notes. The spec's failure section is corrected in the same commit: it claimed forget and disconnect failures would surface inline, but neither backend exposes a failure signal for them, so that is a ceiling rather than a feature. Verified by probe before writing any task: the singletons start empty for about two seconds, the device lists are ObjectModels, signalStrength is 0..1, scanner and discovering are writable, and NMSettings is not in QML scope, which drops the hidden-network join the spec had left conditional.
36 hoursdocs: correct the plan's no-arg ipc open and the head pipeDanilo M.1-6/+20
Quickshell 0.3.1 IPC requires every declared argument, so the plan's `ipc call drawer open` with no page fails; the page-less grid entry is the zero-argument `toggle`. Also records that `... | head` races timeout and kills the shell early, so verification uses a file redirect.
37 hoursdocs: a subdirectory singleton needs no qmldir, drop it from the planDanilo M.1-71/+54
The plan claimed a pragma Singleton outside the config root is invisible until a qmldir names it, and had Task 1 create one plus Tasks 6, 7 and 8 append a line each. That premise was wrong. Tested: a pragma Singleton in modules/sub/, reached by a plain import "modules/sub", resolves with no qmldir anywhere. The control was a reference to a genuinely undefined type, which warns "ReferenceError: <name> is not defined"; the singleton case produced no such warning and the binding evaluated. This matches what AGENTS.md already documented about Theme.qml, which the code review pointed out. Four registration steps removed and the remaining steps renumbered. The AGENTS.md note Task 9 adds now records the tested behaviour rather than the invented one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
38 hoursdocs: warn that the config task's tilde paths must be typed absoluteDanilo M.1-0/+9
The paths are written with a tilde because this file is committed and the repo forbids home paths in committed files. But neither Hyprland's exec_cmd nor waybar's exec goes through a shell, so a tilde there never expands and fails silently, which reads as a broken keybind rather than a bad path. The two rules genuinely conflict here, so the plan now says which form goes where instead of shipping lines that would not run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
38 hoursdocs: implementation plan for the desktop shellDanilo M.1-0/+2817
Ten tasks: skeleton, contract, chrome, drawer, then the four modules in increasing order of risk, then documentation, then the six config edits outside this repo. Appearance goes first among the modules despite being last in the grid, because it is nine lines of substance and puts something in the grid before the three migrations start. Sound, mail and vm follow in that order: sound splits one 302-line file into three, mail is the gentlest move and carries the only automated oracle in the project, and vm is the largest and the one whose polling behaviour actually changes. Each task leaves the repo working, because several delete a component and a half-finished deletion is painful to unpick. Paths in the config task are written with a tilde: the gitleaks hook rejected the absolute form, correctly, since this file is committed and the live Hyprland config it describes is not. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01We9zcHEH8ZWHPcQwMaJRNv
2 daysdocs: implementation plan for mail arrival notificationsDanilo M.1-0/+924
Six tasks, TDD against one bash check rather than a framework: the script is sourced as a library so the pure functions, the ones that only move text around, are asserted without notmuch, dunstify or inotify in the picture. The two parsing traps that already cost this component a debugging session each get a fixture apiece: a key containing dots, and a folder value containing a bracket. Verification does not wait for mail. Backdating the stored revision by 2000 replays a real window on demand, and the seed run before it proves the anti-storm rule with 101 unread messages on disk. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ZwWrCEbdKzmisfg9bb1nS
3 daysdocs(window-switcher): focusHistoryID is not on HyprlandToplevelDanilo M.1-2/+12
Implementing the model found it. The property reads undefined, so the planned sort compared NaN and silently did nothing, leaving the list in arbitrary tracker order while looking entirely plausible. It is on lastIpcObject instead. Carried into the plan's later tasks so the grid does not reintroduce the bare property, and into the notes that Task 6 puts in AGENTS.md, since a sort that quietly does nothing is the kind of wrong answer this repo's notes exist to prevent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
3 daysfix(window-switcher): pick the screen the way the other components doDanilo M.1-1/+4
The screen was found by a name written inline, falling back to null. The other three panels all take a monitor property and fall back to screens[0], so this now does too: a machine without a DP-1 gets its first monitor rather than a null screen, and the name is in one place if it ever needs changing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
3 daysdocs(window-switcher): the implementation planDanilo M.1-0/+849
Six tasks, each ending in a commit: the skeleton and the keyboard grab, the window model, one card, the grid and empty state, the Hyprland wiring, and the docs. Two things were checked against the running system while writing it rather than left for the implementation to discover. The keyboard grab works: Keys.onEscapePressed on a focused Item inside the layer surface fires, so the AGENTS.md workaround holds and keyboard navigation is safe to build on. And the dispatcher for sending a key is send_shortcut with the underscore; sendshortcut does not exist, and a test written against that name would have failed in a way that looks exactly like the key never arriving. No qmldir is added. There is none anywhere in this repo and Theme resolves without one, since quickshell scans the config directory itself; the AGENTS.md note about needing one is about singletons outside it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYg4wYHq5XNbiVmMeKRb1S
4 daysdocs: the plan does not launch anything on the user's screenDanilo M.1-4/+11
The user works at this machine and runs the shell themselves. An agent executing this plan writes code and runs non-GUI checks, then hands over the command and the numbers to compare against; the four steps that need a running qs are now marked as the user's. Also warns against a bare pkill -x qs, which would take down the three components the user already has running. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU
4 daysdocs: correct the notmuch malformed-query claimDanilo M.1-8/+15
The previous commit, the spec and the plan all said notmuch exits 0 on a malformed query while printing something that is not a count, and that validating the output as an integer therefore catches it. Measured properly, that is wrong in a way worth recording, because the truth is worse. notmuch fails two different ways. A rejected query prints nothing and exits 1: `notmuch count 'tag:unread and ('`. A query Xapian merely misparses returns a plausible wrong number and exits 0: `notmuch count 'tag:unread and (('` gives 41, and `'tag:unread and tag:'` gives 3. The second is undetectable by any check on the output, which is why the original claim was not just imprecise but inverted: the case it described as caught is the case nothing can catch. The integer validation still earns its place, on the first failure mode, where empty output would otherwise render as an empty inbox. The real defence against the second is that QUERY is a fixed string and is never built from anything, which the comment now says. The earlier measurement that produced the wrong claim read 40 as mangled output when it was a successful parse answering a different question. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU
4 daysdocs: implementation plan for mail-overviewDanilo M.1-0/+1339
Seven tasks, ordered so the thing most likely to be wrong is checked first. The watcher script comes before any QML because it is the only piece with a real runnable check and needs no compositor. The component skeleton gets its own commit because the failure it guards against is invisible: a config whose only window is hidden exits straight after logging Configuration Loaded and reports no error. Two decisions changed while reading the existing components. The drawer is a fullscreen overlay with content anchored top right, which is the idiom both other panels use and what gives click-outside and Escape for free, rather than a small anchored window. And its exclusionMode is Normal rather than the Ignore those two use, so waybar's exclusive zone places it below the bar without this component carrying the bar's 42px height as a constant to drift. Also records a trap measured this session: notmuch exits 0 even for a malformed query, printing something that is not a count, so every count is validated as an integer rather than trusting the exit status. A failure that rendered as 0 would look exactly like an empty inbox. The live-config task needs real absolute paths, because waybar's exec and Hyprland's Lua strings do not expand a tilde. They are written as <repo> and <home> placeholders with a note to substitute, since the gitleaks hook blocks committed home paths and was right to reject the first attempt. The spec was updated to match both changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WWL8JYHu7yhAdtx5pU9PMU