aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
13 hoursHints: Phantom deps dialogDanilo M.4-13/+163
The list with Add and Remove, suggestions (required names no package of the tree has, with who needs them) to tick and add, and Apply to hints, which starts fix-current; its end opens the diff dialog with Revert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hourssbb-remote 0.7.0: phantom deps list, suggestions, fix-currentDanilo M.4-6/+168
The list moves to phantom_deps_file (/etc/sb-builder/phantom-deps, mkhint's format), edited with phantom-add/phantom-remove. phantom-list also suggests every REQUIRES name no package of the repo has, with who needs it: SBo drops a package when it enters the official tree. The fix-current job (and fix-current-now, inline for sbshadow) is mkhint -F: listed deps merged into DELREQUIRES, .bak first, add only. manifest_packages is neovim alone: openvino lives in the overlay now. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursAdd phantom deps design (phase 4b, part 1)Danilo M.1-0/+74
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursPackages: fix segfault on Clear / Select visible behind a filterDanilo M.2-4/+34
Both emitted layoutChanged without layoutAboutToBeChanged; with a filter on and a current row, the proxy kept stale persistent indexes and Qt crashed (Ctrl+Shift+A with orphaned + cat:games closed the app). Only check states change, so the model now emits dataChanged on the box column. The new test segfaults on the old code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursKeep column widths, splitters and window size across runsDanilo M.4-6/+54
QSettings in state.conf next to config.toml, saved on close: every table header (widths, sort column) and splitter of the tabs, and the window geometry. Tests point it at a temp file, never the user's own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursPackages: orphaned filter chipDanilo M.5-16/+35
SBo marks an orphaned package MAINTAINER="orphaned - no maintainer" (1936 in the tree today); the inventory already carries the maintainer, so the chip filters in the GUI alone. The shown/selected count moves next to the search field so the chip row fits the default window width. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursFilter bars: chips read as buttons, status dots, group labelsDanilo M.6-29/+73
Chips get a button background and border, a dot in the color the table uses for that status, and a muted label per group (overlay, status, state, result). Search fields get a search icon and a clear button. Phase 2 spec: why the signing key locks after the GUI quits. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursUI guidelines in AGENTS.md; README for the new frameDanilo M.4-40/+72
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursOne frame for every tab: ribbons of actions, next steps as dialogsDanilo M.8-310/+503
Tabs are permanent and load on first show. The ribbon shows the current tab's actions in workflow order, a small ribbon under it the view controls; inapplicable actions are disabled with the reason as tooltip. Starting a job stays on the tab; the Jobs tab reads (running), then shows the end status. When a preview this session started ends, its log opens with Run it (publish box) or Apply shadowing; Not now loses nothing, Run it in Jobs reopens it. New hint moves to the Packages ribbon and acts on the ticked packages without a hint. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hourssbb-remote 0.6.0: hint-new takes several packages, no versionDanilo M.3-12/+14
Each gets the .info pin; Update selected sets a version later. One package that already has a hint refuses the whole job before it starts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursAdd UI frame implementation planDanilo M.1-0/+1651
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
13 hoursAdd UI design: one frame for every tab, next steps as dialogsDanilo M.1-0/+162
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursHints: Delete hint acts on the ticked packages, then offers RevertDanilo M.4-12/+36
Rows with only a stanza have no hint and are skipped. The deletes open the same dialog as a hint job: each removed hint's diff and Revert, which had no place in the GUI before. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursPackages: Build/Update/Rebuild/Remove act on ticked packages onlyDanilo M.3-7/+8
The highlighted row used to stand in when nothing was ticked; with row clicks toggling the tick, that ran an action on a row just unticked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursPackages tab: a click anywhere on a row ticks or unticks itDanilo M.2-2/+14
Same as the Hints tab: the box is no longer user-checkable on its own and one clicked handler toggles the row, so no click counts twice. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursHints tab: a click anywhere on a row ticks or unticks itDanilo M.2-2/+15
The box is no longer user-checkable on its own, so a click on it is not counted twice; one cellClicked handler toggles every row click. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursHint diff dialog: color added, removed and hunk linesDanilo M.2-1/+19
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursCtrl+A / Ctrl+Shift+A: select visible and clear, Packages and HintsDanilo M.4-9/+26
The search field keeps Ctrl+A for its own text. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursHints tab: Select visible and ClearDanilo M.2-1/+23
Same pair as the Packages tab: tick every row the chips and search leave visible, untick every row. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursUpstream versions with '-' as '_', as mkhint stored themDanilo M.3-3/+12
'-' is illegal in a SlackBuild version, so dated tags like exploitdb's 2026-10-14 are packaged 2026_10_14 and showed as outdated forever. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursDocument the Hints screen; phase 4 spec from the implementationDanilo M.3-61/+104
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursHints screen: upstream check, hint jobs, diff and revertDanilo M.4-8/+438
Check upstream fills the upstream column and ticks the outdated hints, Update selected starts hint-update, Delete hint acts on the VM. When a hint job ends its SBB-RESULT opens a dialog with each changed hint's diff, Revert per package (once) and Build these. The Packages detail pane gets New hint and Open in Hints. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursUpstream versions from nvchecker on the desktopDanilo M.5-0/+625
nvchecker.toml moves from the VM into the repo. The GUI runs nvchecker with its own [__config__] (the keyfile from [hints]) and reads versions and per-package errors from --logger json; outdated is decided against the hints, so no oldver, newver or nvtake. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hourssbb-remote 0.5.0: hint jobs replace mkhint's hint editingDanilo M.4-6/+535
hint-update and hint-new run the helper's own _hint command: version bumps as mkhint does them (also '-' and dotless URL forms, never inside MD5SUM values), a DELREQUIRES-only hint pinned from the .info first, md5 of the first URL of each DOWNLOAD pair, --no-dl as DOWNLOAD="no", .bak before each write and a final SBB-RESULT line that job-result returns. hint-diff, hint-revert and hint-delete answer at once. neovim and openvino are refused until phase 4b. Job ids accept hyphenated kinds. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursPhase 4 plan: drop fix-current, sbshadow owns the DELREQUIRES hintsDanilo M.1-157/+171
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 hoursAdd phase 4 implementation planDanilo M.1-0/+1980
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 hoursAdd phase 4 design: hints managed by the helperDanilo M.2-0/+240
mkhint's hint logic moves into sbb-remote and the upstream check runs nvchecker on the desktop with a config tracked in this repo. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
15 hoursAdd a .desktop entry, linked by install.shDanilo M.4-3/+16
Exec=sb-builder relies on ~/bin being on the session PATH, as for the other launchers there. setDesktopFileName lets Wayland compositors match the window to the entry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursShow dates as DD/MM/YYYY HH:MMDanilo M.3-2/+9
All GUI dates go through fmt_time; switch it to the Italian order with the year, and use it for the Dashboard's "stale since" too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursbuild-log: show the last attempt's log, not always build.logDanilo M.6-13/+33
slackrepo writes one log per command (build, rebuild, update, remove). A failed update left build.log from an older successful build, so the viewer showed a success next to a failed result. The helper (0.4.1) now returns the newest command log and its name, which the viewer shows in the title and header. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursResults tab with build logs; count only real packagesDanilo M.9-12/+378
sbb-remote 0.4.0: results lists slackrepo's last attempt per package (newest first, with built version and whether a log dir exists), and build-log returns the end of a package's build.log (512 KB) plus its resource.log, accepting only category/pkg paths. Result counts skip the legacy buildresults rows keyed by package file name: the 213 "bad" on the Dashboard matched no package. GUI: a Results tab (chips per result, table sorted by attempt time, detail pane, log viewer window that keeps the failure at the end), opened from the ribbon or by clicking a result in the Dashboard bar or legend, filtered to it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursDashboard: freshness dot on the slackpkg tileDanilo M.2-2/+31
Green when the last upgrade is within a day, yellow after one day, red after two; the age text beside it carries the meaning too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursDashboard: VM meters and sparklines, slackpkg tileDanilo M.5-17/+237
sbb-remote 0.3.0 adds CPU busy % (two /proc/stat samples), RAM total and available, disk / total and free, and the last slackpkg update (LASTUPDATE) and package change (/var/log/packages), replacing disk_free. The Dashboard shows a VM card with meters for CPU, RAM and disk / (accent, warning from 80%, critical from 90%, value always printed) and CPU/RAM sparklines from this session's polls, and a slackpkg tile in place of VM load. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursRibbon for the screens; centered, distinct tab barDanilo M.2-6/+38
The Open menu becomes a toolbar ribbon (icon over label: Dashboard, Packages, Jobs) using the desktop icon theme with Qt fallbacks. Tabs are centered with a bordered, rounded shape, the selected one filled with the highlight color and joined to a highlight line over the pane, so the bar reads as its own control. Colors come from the palette. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
28 hoursCtrl+PgUp/PgDn cycle tabs from anywhere in the windowDanilo M.2-0/+19
QTabWidget's built-in binding only works with focus on the tab bar, and the table views take page keys. Window-level shortcuts, wrapping. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursDocument the Packages tab, publishing and signing key unlockDanilo M.2-0/+29
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursAdd Packages tab, hint view, Run it and signing key unlockDanilo M.10-20/+844
Packages tab over the helper inventory: query bar with cat:/maint:/ req:/status: prefixes, overlay and status chips, check column, and a detail pane with versions, dependencies after hints and a structured read-only view of the hint (hints.py mirrors slackrepo's parser). Actions start slackrepo previews; the Jobs tab offers Run it with a publish box (default from [builds] publish), asking for the signing key passphrase first when the key is locked. Status bar shows the key state; Dashboard tiles open their tabs; inventory reloads after slackrepo and publish jobs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hourssbb-remote 0.2.0: inventory, slackrepo and publish jobs, signing keyDanilo M.3-19/+388
inventory lists every package with its effective version (hint over .info), build state from the slackrepo DB, summary, and the parsed hint found by slackrepo's search order; hints are parsed with shlex, never sourced. Job kinds now return argv plus env: slackrepo build/rebuild/update/remove (packages validated against the tree, --preview, --no-publish sets SBB_PUBLISH=n) and publish (sb-publish). gpg-status and gpg-unlock let the GUI unlock the package signing key in gpg-agent; the passphrase comes on stdin only, every other subprocess gets stdin=DEVNULL. A real slackrepo run is refused while the key is locked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursAdd phase 2 implementation planDanilo M.2-2/+3885
Code in the plan ran in a scratch copy first (68 tests offscreen, inventory and gpg-status against the real VM data, hook gates with stubs). Spec: the stale config copy in repo-html-structure is untracked, so it is deleted after asking rather than committed away. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hourstests: always run the GUI tests offscreenDanilo M.1-1/+1
setdefault kept a QT_QPA_PLATFORM already set by the desktop session (wayland;xcb here), so the tests drew windows and modal dialogs on the real display. Force offscreen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursPhase 4 note: migrate NODOWNLOAD=yes hints to DOWNLOAD="no"Danilo M.1-1/+5
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursPhase 2 spec: structured read-only hint viewDanilo M.2-9/+54
Hint grammar taken from slackrepo's parser: search order, recognised keys, ARCH-resolved downloads, forced checksum skip, the REQUIRES computation, USERADD/GROUPADD defaults, pragmas. The detail pane shows hints as sections, never the raw file. NODOWNLOAD=yes is shown as DOWNLOAD="no"; phase 4 makes mkhint write DOWNLOAD="no". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
29 hoursAdd phase 2 design: packages browser and slackrepo buildsDanilo M.1-0/+246
Package browser with query bar, chips and detail pane over a helper inventory; slackrepo build/rebuild/update/remove and update-all as previewed jobs; a publish gate in the slackrepo config with a separate Publish action; signing key unlock through gpg-preset-passphrase since jobs have no terminal for pinentry. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursDashboard: visible neutral swatch, note tiles as future entry pointsDanilo M.2-1/+6
The neutral result color came from QPalette.Mid, which in a dark theme can equal the card background and hid the "removed" swatch; use the muted text color instead. Record in the spec that the dashboard tiles should open their screens once those exist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursRedesign the Dashboard as cards with stat tilesDanilo M.2-40/+192
The tiles were plain group boxes of key: value text and read as text scattered on a page. Now a KPI row (packages, built, last pull, VM load) with large values and muted details, a slackrepo results stacked bar in the reserved status colors with hover counts and a labelled legend, and a recent jobs card. Colors come from the Qt palette, so the user's theme applies. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursFix crash when closing the Jobs tab during a running jobDanilo M.3-1/+33
Closing the tab killed the job-follow process, whose finished signal arrived after the tab was deleted; the slot touched dead widgets and PyQt6 aborted the whole application on the unhandled exception. stop() now disconnects the process before killing it. A sys.excepthook logs any future slot exception to stderr instead of aborting. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursAdd launcher, install script and usage docsDanilo M.4-4/+110
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursAdd the PyQt6 GUI: Dashboard, Jobs, VM control, notificationsDanilo M.10-0/+993
All VM access goes through remote.py (ssh with a shared ControlMaster, local virsh). The main window polls jobs, backs off while ssh is down, checks the libvirt domain and offers Start or Resume, and sends freedesktop notifications when a job ends or the VM comes up. The Jobs tab streams a job's log with job-follow and resumes at the last offset after a drop. Config is TOML, validated against built-in defaults. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursAdd sbb-remote, the VM helperDanilo M.3-0/+645
Single-file stdlib helper the GUI runs over ssh. JSON commands for version, stats and jobs; job-start runs a fixed table of kinds (sbpull, sbshadow, each requiring --yes or --no) detached with setsid and no stdin, one at a time under a flock; job-follow streams a log from a byte offset so the GUI can drop and resume; job-kill sends SIGTERM to the job's process group. A job whose runner died is reported lost. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
30 hoursAdd phase 1 implementation plan, refine specDanilo M.2-21/+2292
The plan embeds code that was run in a scratch copy before writing it down (38 tests, helper stats against the real VM data). Drafting it settled a few details now reflected in the spec: version also returns the overlays, an upstream_branch helper key, a shared fmt module and a launcher, follow resuming on the next jobs poll instead of its own backoff, and sbpull returning sbshadow's exit status. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>