aboutsummaryrefslogtreecommitdiffstats
path: root/docs/superpowers/specs
AgeCommit message (Collapse)AuthorFilesLines
9 daysdocs: correct the claim about counting a symlinked directoryDanilo M.1-5/+7
GNU ls follows a symlink to a directory with or without a trailing slash, so both forms count the packages correctly. Only -d lists the link itself. The original claim came from a count taken where the path did not resolve at all, and it reached the spec, the plan and two commit messages. The count was always right; the reason given for it was not, and a comment that teaches the next reader something false is worse than no comment. Records the real trap in its place: ls aliased to a long format counts its "total" header as a package. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 daysdocs: design the network and slackware widgetsDanilo M.1-0/+313
Two new cards and three fixes to existing ones. The network card reads the interface byte counters directly and keeps its own history, one sample per pixel column, so the chart never interpolates. Both series share one autoscale: drawn independently, a 200kB/s upload would look like a 40MB/s download. The public address moves from the old config's 5 minute poll to 30 minutes, since a residential address is stable for days. The slackware card takes its numbers from a sampler rather than the draw hook, and stores epochs instead of reconstructed dates. The shell function it replaces parses ls -l output and hardcodes the year, which breaks every January and on any file older than six months. Records two things found while checking real values against the design: /var/log/packages is a symlink, so counting it without a trailing slash reports 1 package rather than 2817, and the ChangeLog mtime on this machine currently reads in the future, so the age arithmetic has to survive a negative difference. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 daysdocs: correct the system-widget comments and defer the age markerDanilo M.1-0/+12
Fix the conky.conf.in comment to name all three samplers and the README to say the cache sampler runs every 15 minutes. Rewrite the disks layout comment to match per_row = n (no wrapping), drop the stale "seventeenth bar" note, and record in the spec that the cache age marker is deliberately deferred with the epoch-line upgrade path.
9 daysdocs: give the system widgets a shared colour languageDanilo M.1-12/+87
Thresholds colour every quantity that has a comfortable range: ok below the first, warning between, critical above. 25/75 for filesystems, cache and CPU load; per-sensor pairs for temperatures, because 70C is unremarkable on a CPU and alarming on an NVMe. The per-core row becomes an equaliser: sixteen vertical bars rising from a baseline, coloured by load. Disks become idea2's rings, an icon at the centre and the arc coloured by usage. Cache highlights its largest subdirectory. This needs a `warning` role the dashboard does not currently expose. udt-palette already resolves it in every scheme, mapping yellow (or Nord's aurora_yellow) to it globally, and other generators already read it, so adding it is one word in gen_conky's role tuple plus a placeholder and a palette line. No scheme file changes. Three new primitives in lib/card.lua rather than per-widget drawing: bar, ring, and a threshold helper so all four cards agree on the rule instead of each re-deriving it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 daysdocs: add the system widgets designDanilo M.1-0/+221
Four cards: CPU/RAM with every temperature, GPU, filesystems, and the user cache. Three were asked for; cache became its own card because it is a different refresh cycle and sharing the disks card would have made the densest card in the dashboard. Two findings that shaped it, both from probing the hardware rather than assuming: - The Arc B580 exposes no utilisation figure. The xe driver has no gpu_busy_percent, intel_gpu_top refuses the device outright, and gputop prints per-process rows with ANSI escapes, which is not an interface to build on. The card shows temperatures and fan speed and no load bar, rather than inventing a number. - /data is on a spinning disk with no hwmon chip, so there is no sda temperature to show. Reading SMART would need smartctl as root and would spin up a sleeping disk each poll. Also: the four NFS mounts are two filesystems behind two servers, so showing all four printed every number twice. One mount per server. Both new samplers follow the weather fetch's cache-and-read pattern, which exists precisely so an unreachable NFS server costs a stale cache instead of freezing the draw hook. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 daysfix: correct the .cod rationale, and stop world-reading the cacheDanilo M.1-4/+7
The comment claimed a bad key returns HTTP 200 with an error body, so the status code alone proves nothing. Measured against the live API, that is wrong: a bad key returns 401 and an unknown city 404, and with curl -f both fail at curl without the .cod check ever running. The claim came from the polybar script, which ran curl WITHOUT -f and so genuinely did receive error bodies with a success exit. The check was ported but not the reason for it. It still earns its place behind -f, for a 200 whose body is not usable weather, and the comment now says that instead of something false. The spec carried the same wrong sentence and is corrected too. Separately, the cache landed at 644 in a directory where every other generated file is 600, and the response carries the configured city and its coordinates. A umask before the write puts it at 600 without a window where it is briefly readable. The .cod discrepancy was found by the Task 6 implementer, which noticed the bad-key test produced a different message than the plan predicted and said so rather than reporting the expected text as achieved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 daysdocs: add the weather widget designDanilo M.1-0/+239
One vertical card merging idea1.png's two: conditions on top, a sunrise-to-sunset arc at the bottom, with the times at the arc's ends behind sunrise/sunset glyphs. Decisions worth recording rather than rediscovering: - The fetch runs from `${execi}` in conky.text, not a systemd timer, so refresh is tied to the dashboard's lifetime. conky.text is empty in this config because Cairo covers it, so whether execi fires at all was probed rather than assumed: it does, even when the command prints nothing. - Inconsolata Nerd Font already carries the Weather Icons range and the two sunrise/sunset glyphs, so no new font. Confirmed by rendering the codepoints and looking at them; an fc-list query alone had wrongly reported them missing, and a missing glyph in conky is an invisible blank rather than an error. - The cache is written atomically, since the widget reads it on an unrelated 2s cadence and would otherwise parse a half-written file. - A bad key returns HTTP 200 with a JSON error body, so the fetch checks .cod before replacing the cache, and never overwrites good data with an error. - Missing and stale states draw the normal card chrome with a notice. An empty cell was rejected: it looks exactly like a crashed widget. Also ignores .superpowers/, the brainstorming session directory. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
10 daysdocs: settle weather source on OpenWeatherMapDanilo M.1-8/+49
A polybar backup script for OWM turned up, which beats the weather.com scraper: it has a working condition mapping. Port the domain knowledge, not the code. Worth keeping: the OWM condition-id ranges, day/night selection against sys.sunrise/sys.sunset, and the Beaufort wind thresholds. Becomes a table in data.lua. Not portable: polybar %{F}/%{T} format tokens, hardcoded hex (UDT roles replace them), bc conversions (Lua arithmetic), one-line output (a card). So the script shrinks to curl-and-cache and Lua does the rest. The reference script hardcodes a live API key plus city and country. The key and location move to ~/.config/udt/weather.env, outside the repo, same reasoning as roles.conf. Nothing carries a key in-repo, and weather.env is gitignored so a stray copy cannot be staged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
10 daysdocs: add Lua dashboard design specDanilo M.1-0/+252
Conky dashboard drawn with Cairo from Lua, on a Hyprland special workspace. Replaces UDT's variables-based conky.conf.in. Platform facts verified before fixing the design, since each one invalidates a common approach: - Cairo on Wayland needs conky_surface(). The usual cairo_xlib_surface_create idiom gets a nil drawable and visual under out_to_wayland, so every tutorial using it is wrong here. - own_window_type='normal' makes Conky a real toplevel that a Hyprland windowrule can place; 'desktop' is a layer-surface and cannot be assigned to a workspace. - Cairo output covers conky.text, so conky.text stays empty. Layout is a table of grid cells at the top of dashboard.lua, so reordering widgets is one edit and the same table works on both monitors. The 2560x1600 mockup's vertical stack does not fit the 2560x1080 primary, which is what motivates cells over pixels. hwmon glob-by-name is carried over from the old config deliberately: fixed indices drift across kernel reorders and silently read the wrong chip. v1 is one clock card end to end. Widgets are additive after that. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>