diff options
| author | Danilo M. <danix@danix.xyz> | 2026-10-19 20:53:50 +0200 |
|---|---|---|
| committer | Danilo M. <danix@danix.xyz> | 2026-10-19 20:53:50 +0200 |
| commit | da5363d1c0fb77dcf3030968a2cd5be355ee7f1a (patch) | |
| tree | ce299498135db7e974c6d022b0b7dfc93f2ba5a4 | |
| parent | b8400f38411818aa54a773dffb2c3a0c56b06dba (diff) | |
| download | sb-builder-da5363d1c0fb77dcf3030968a2cd5be355ee7f1a.tar.gz sb-builder-da5363d1c0fb77dcf3030968a2cd5be355ee7f1a.zip | |
Document the Packages tab, publishing and signing key unlock
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| -rw-r--r-- | AGENTS.md | 14 | ||||
| -rw-r--r-- | README.md | 15 |
2 files changed, 29 insertions, 0 deletions
@@ -24,6 +24,14 @@ Design and phasing: `docs/superpowers/specs/`. Phase 1 (core) is - Jobs run detached on the VM (`setsid`, `stdin=/dev/null`), one at a time under a flock, logging to `<state_dir>/jobs/<id>/`. The GUI can disconnect and reattach with `job-follow <id> <offset>`. +- Exception, by design: `gpg-unlock` reads the signing key passphrase from + stdin (`remote.call(..., stdin=...)`) and feeds it to + `gpg-preset-passphrase`. Every other subprocess in the helper runs with + `stdin=DEVNULL`, so nothing can read the passphrase off the ssh channel. + Never put the passphrase in argv, env, logs or files. +- Hints are parsed (`shlex`), never sourced. `sb_builder/hints.py` mirrors + slackrepo's own rules (`../GITHUB/slackrepo/libexec/functions.d/parsefunctions.sh`); + check that file when changing it. - Jobs never get input. Any tool run as a job must be non-interactive (`--yes`/`--no` style flags). If a tool needs a flag it lacks, add it in that tool's own repo (e.g. `slackrepo_setup` for sbshadow, `mkhintfile` @@ -42,6 +50,12 @@ Design and phasing: `docs/superpowers/specs/`. Phase 1 (core) is python3 -m unittest discover -s tests +`test_gui.py` forces `QT_QPA_PLATFORM=offscreen` (the desktop session sets +its own, and a modal dialog on the real display blocks the run). A fake +remote must answer every call a test triggers: an unanswered call returns +"ssh: connection failed", which opens a warning dialog that blocks forever +offscreen. + Headless (`test_gui.py` sets `QT_QPA_PLATFORM=offscreen`), no VM needed. `test_remote.py` loads `remote/sbb-remote` with `SourceFileLoader` (no `.py` extension) and points it at a temp state dir through `SBB_CONFIG`. Two @@ -41,6 +41,21 @@ Every key is optional. `File > Reload config` rereads the GUI config. preview that lists `shadow:` or `unshadow:` lines, "Apply shadowing" runs `sbshadow --yes`. +- **Open > Packages** (or click the Packages tile): every package of the + repository, with built version and status (`ok`, `failed`, `never`, + `outdated`). Search by name or summary, or with `cat:`, `maint:`, `req:`, + `status:`; toggle the overlay and status chips. The detail pane shows the + package's versions, its dependencies after hints (dropped ones struck + through), and what its hint file does, section by section. +- Tick packages (or select one row) and press Build, Update, Rebuild or + Remove; Update all updates everything. Each first runs a slackrepo + `--preview` job. When the preview is fine, **Run it** in the Jobs tab starts + the real run; untick **publish** to keep the packages local and press + **Publish** later to push them. +- Real runs sign the repository. When the package signing key is locked + (status bar 🔒), the GUI asks for its passphrase first and hands it to the + VM's gpg-agent; it is never stored. + Jobs run on the VM detached from the ssh session, one at a time. Closing the GUI or losing the connection does not stop them; reopening the job resumes the log. Job state and logs live in `/var/lib/sb-builder/jobs/` on the VM. |
