Files
RedBear-OS/local/docs/CUB-PACKAGE-MANAGER.md
T
2026-05-07 21:15:08 +01:00

367 lines
13 KiB
Markdown

# Cub — Red Bear OS Package Manager
**Status:** Active (redesign complete 2026-05)
**Location:** `local/recipes/system/cub/`
**Type:** Runtime package manager (runs inside Red Bear OS)
**Dependencies:** `pkgutils` (redox-pkg), `pkgar`
## Overview
Cub is the Red Bear OS package manager — an AUR-inspired tool for searching, fetching,
building, installing, and managing packages. It serves as the bridge between Red Bear OS
and the Arch Linux AUR ecosystem, converting PKGBUILD recipes into Red Bear OS recipe.toml
files and producing pkgar packages.
Cub runs as a regular user inside Red Bear OS, managing packages in `~/.cub/` and
installing them via the `pkgar` system.
## Architecture
```
cub (workspace)
├── cub-lib/ ← Core library (13 modules)
│ ├── aur.rs ← AUR RPC v5 client (search, info)
│ ├── storage.rs ← ~/.cub/ user-local storage manager
│ ├── cook.rs ← recipe cooking (shells out to repo cook)
│ ├── pkgbuild.rs ← Enhanced AUR PKGBUILD parser
│ ├── recipe.rs ← Unified recipe.toml generation
│ ├── converter.rs ← Legacy PKGBUILD converter (preserved)
│ ├── cookbook.rs ← recipe.toml generation from RBPKGBUILD
│ ├── rbpkgbuild.rs ← RBPKGBUILD TOML type definitions
│ ├── package.rs ← pkgar archive creation
│ ├── sandbox.rs ← Build sandbox environment
│ ├── deps.rs ← Arch Linux → Redox dependency name mapping
│ ├── rbsrcinfo.rs ← .RBSRCINFO metadata format
│ └── error.rs ← CubError enum (11 variants)
├── cub-tui/ ← Terminal UI (ratatui 0.30 + termion)
│ ├── app.rs ← TUI app struct and event loop
│ ├── theme.rs ← Red Bear color theme
│ ├── views/ ← search, info, install, build, query
│ └── widgets/ ← Reusable TUI components
└── cub-cli/ ← CLI binary entry point
└── main.rs ← 14 Arch-style switches + TUI launcher
```
## CLI Reference
### Operation Modes
Cub supports three operation modes mirroring pacman:
| Mode | Flag | Description |
|------|------|-------------|
| Sync | `-S` | Install, search, refresh, upgrade packages |
| Query | `-Q` | Manage locally installed packages |
| Remove | `-R` | Uninstall packages |
### Sync Operations (`-S`)
```bash
cub -S <pkg> # Install from official repo or BUR/AUR
cub -Ss <query> # Search official repo + cached BUR + AUR
cub -Si <pkg> # Show AUR package info (description, deps, votes)
cub -Sy # Refresh BUR cache + verify AUR connectivity
cub -Syu # Full system upgrade (sync + update all)
cub -Sua # Update AUR packages only
cub -Sc # Clean package caches
```
### Build Operations (`-B`, `-G`)
```bash
cub -B <dir> # Build local RBPKGBUILD directory → pkgar + install
cub -G <pkg> # Fetch AUR PKGBUILD, convert to recipe, save to ~/.cub/
```
### Query Operations (`-Q`)
```bash
cub -Q # List all installed packages
cub -Qi <pkg> # Show installed package details (version, deps, size)
cub -Ql <pkg> # List files installed by a package
```
### Remove Operations (`-R`)
```bash
cub -R <pkg> # Uninstall a package
```
### Other Commands
```bash
cub -Pi <target> # Inspect installed package or local RBPKGBUILD
cub --import-aur <target> # Import AUR package (clone + convert PKGBUILD)
cub -T, --no-tui # Disable TUI mode (use CLI directly)
cub # No subcommand: launch TUI
```
## User Storage (`~/.cub/`)
Cub maintains all user-local data in `~/.cub/` with four subdirectories:
```
~/.cub/
├── recipes/ # Converted recipe.toml + RBPKGBUILD + patches
│ └── <pkgname>/
│ ├── recipe.toml ← Generated cookbook recipe
│ ├── RBPKGBUILD ← Red Bear PKGBUILD (TOML format)
│ ├── .RBSRCINFO ← Metadata for dependency resolution
│ └── patches/ ← Local patches
├── sources/ # Cached source tarballs and git clones
├── repo/ # Built pkgar packages organized by target
│ └── x86_64-unknown-redox/
│ ├── <pkg>.pkgar ← Signed package archive
│ └── <pkg>.toml ← Package metadata
└── config/ # Cub configuration and keyring
```
## AUR Integration
Cub accesses the Arch User Repository via the AUR RPC v5 API:
| Endpoint | Method | Cub Function |
|----------|--------|-------------|
| `/rpc?v=5&type=search&arg=<q>` | GET | `AurClient::search(query)` |
| `/rpc?v=5&type=info&arg[]=<pkg>` | GET | `AurClient::info(pkgs)` |
| `https://aur.archlinux.org/<pkg>.git` | git clone | `-G <pkg>` (import) |
### PKGBUILD Conversion
When importing from AUR (`-G` or `--import-aur`):
1. Clone the AUR git repository
2. Parse `PKGBUILD` bash script — extracts `pkgname`, `pkgver`, `pkgrel`,
`depends`, `makedepends`, `source`, `sha256sums`, `optdepends`
3. Detect build template (cargo, cmake, meson, configure, custom)
4. Map Arch dependencies to Redox equivalents (glibc→relibc, openssl→openssl3,
systemd→removed, etc.)
5. Generate `RBPKGBUILD` (TOML format) and `.RBSRCINFO`
6. Generate `recipe.toml` compatible with the Red Bear cookbook
7. Save all files to `~/.cub/recipes/<pkgname>/`
### Dependency Mapping
Cub maintains a 44-entry mapping table (`deps.rs`) translating Arch Linux
package names to their Redox/Red Bear equivalents:
| Arch Package | Redox Mapping | Notes |
|---|---|---|
| `glibc` | `relibc` | Redox uses relibc instead of glibc |
| `openssl` | `openssl3` | Version-specific mapping |
| `gcc`, `make` | `build-base` | Meta-package for build tools |
| `systemd` | *(removed)* | Unavailable on Redox — warning issued |
| `libx11`, `libxcb` | *(mapped)* | X11 unavailable — manual port needed |
| `linux-api-headers` | *(removed)* | Linux-specific — not applicable |
| `wayland` | `wayland` | Direct 1:1 mapping when available |
| `qt6-base` | `qtbase` | Qt 6 base libraries |
| `dbus` | `dbus` | Direct 1:1 mapping |
Unknown dependencies are passed through unchanged with a warning.
## Build Flow
```
cub -B <dir> # Build local RBPKGBUILD
├─ 1. Parse RBPKGBUILD ← Validate TOML format
├─ 2. Create sandbox ← .cub-sandbox/{build,stage,sysroot}
├─ 3. Generate recipe.toml ← cookbook::generate_recipe()
├─ 4. repo cook <recipe_dir> ← Shell out to cookbook (cook.rs)
├─ 5. Locate stage directory ← Find populated stage dir
├─ 6. Create pkgar archive ← pkgar::create_with_flags()
├─ 7. Generate .toml metadata ← Package name, version, deps
└─ 8. Install via pkgutils ← library.install() + apply()
```
### Sandbox Environment
The build sandbox sets these environment variables for `repo cook`:
| Variable | Value |
|----------|-------|
| `COOKBOOK_SOURCE` | Source directory path |
| `COOKBOOK_STAGE` | Stage (install) directory |
| `COOKBOOK_SYSROOT` | Sysroot with built dependencies |
| `COOKBOOK_TARGET` | `x86_64-unknown-redox` |
| `COOKBOOK_HOST_TARGET` | `x86_64-unknown-linux-gnu` |
| `COOKBOOK_MAKE_JOBS` | CPU core count |
| `DESTDIR` | Alias for COOKBOOK_STAGE |
| `TARGET` | `x86_64-unknown-redox` |
| `GNU_TARGET` | `x86_64-redox` |
## TUI (Terminal UI)
Cub launches a ratatui-based TUI by default when run without a subcommand.
Use `--no-tui` / `-T` for direct CLI operation.
### Views
| View | Description | Key Bindings |
|------|-------------|-------------|
| **Search** | Search AUR by name/description | Type query, Enter to search |
| **Info** | Detailed package view | Shows deps, version, votes, description |
| **Install** | Install progress with log output | Shows command output in real-time |
| **Build** | Build progress for local recipes | Shows stage/progress indicators |
| **Query** | Browse locally installed packages | Arrows to navigate, Enter for details |
### Global Keys
| Key | Action |
|-----|--------|
| `q` / `Esc` | Quit TUI |
| `/` | Focus search bar |
| `Tab` | Cycle between views |
| `↑` `↓` | Navigate lists |
| `Enter` | Select / confirm |
### Theme
Red Bear color theme:
- Background: dark (terminal default)
- Accent: red (#CC0000)
- Text: white
- Selected: red highlight on white text
- Borders: gray
## Configuration
### Environment Variables
| Variable | Default | Description |
|----------|---------|-------------|
| `CUB_BUR_REPO_URL` | `https://gitlab.redox-os.org/redox-os/bur.git` | BUR repository URL |
| `CUB_PKGAR_SECRET_KEY` | *(auto-detected)* | Path to pkgar secret key |
| `CUB_PKGAR_PUBKEY_DIR` | *(auto-detected)* | Directory containing public key |
### Key Locations
| Path | Purpose |
|------|---------|
| `~/.pkg/id_ed25519.toml` | Secret key (pkgar signing) |
| `/etc/pkg/id_ed25519.toml` | System secret key fallback |
| `/pkg/id_ed25519.toml` | System secret key fallback 2 |
| `~/.cub/config/` | Cub-specific configuration |
## Recipe Format
Cub generates standard Red Bear OS recipe.toml files compatible with the
`repo cook` command:
```toml
[source]
git = "https://github.com/user/repo.git"
branch = "main"
rev = "abc123"
[build]
template = "cargo"
dependencies = ["cargo", "pkg-config"]
[package]
dependencies = ["relibc", "openssl3"]
version = "1.0.0-1"
description = "Example package converted from AUR"
```
### Template Detection
Cub auto-detects the correct build template from PKGBUILD `build()` contents:
| PKGBUILD pattern | recipe.toml template |
|---|---|
| `cargo build`, `cargo install` | `cargo` |
| `cmake` | `cmake` |
| `meson setup`, ` meson ` | `meson` |
| `./configure`, ` configure ` | `configure` |
| Other | `custom` |
## Linuxism Detection
During PKGBUILD conversion, cub detects Linux-specific patterns and issues
warnings for manual intervention:
| Pattern | Warning |
|---------|---------|
| `systemctl` | systemctl not available on Redox |
| `/usr/lib/systemd` | Linux-specific paths |
| `systemd` as dependency | Dependency removed (unavailable) |
| `/proc` references | May require Redox-specific adaptation |
## Build Recipe
Cub is built as a standard Cargo workspace:
```toml
# local/recipes/system/cub/recipe.toml
[source]
path = "source"
[build]
template = "cargo"
cargopath = "cub-cli"
[package]
dependencies = ["pkgutils"]
```
The recipe builds `cub-cli` which depends on `cub-lib` and optionally `cub-tui`.
The `default-members` of the workspace is `cub-cli` (the binary).
## Protected Recipe
Cub is listed as a **protected recipe** in `src/cook/fetch.rs` — it cannot be
re-fetched online. Sources are archived in `sources/redbear-0.1.0/`.
## Error Handling
Cub uses an 11-variant `CubError` enum via `thiserror`:
| Variant | Description |
|---------|-------------|
| `Io` | Filesystem errors |
| `TomlParse` | recipe.toml parse failures |
| `TomlSerialize` | recipe.toml serialization failures |
| `InvalidPkgbuild` | Malformed RBPKGBUILD |
| `BuildFailed` | `repo cook` or build failures |
| `PackageNotFound` | Missing package in repo/BUR |
| `Conversion` | PKGBUILD conversion errors |
| `Dependency` | Dependency resolution failures |
| `Aur` | AUR RPC errors (HTTP, parse, rate limit) |
| `Storage` | `~/.cub/` storage errors |
| `Network` | General network failures |
| `Sandbox` | Build sandbox errors |
## Limitations
1. **Build tools required**: `repo cook` requires the build toolchain
(cross-compiler, host tools) which is not yet available inside Red Bear OS.
Until build tools are ported, `cub build` (cooking) only works on build
hosts. Runtime-only operations (search, install, query, remove) work inside
Red Bear OS.
2. **Single source support**: recipe.toml generation currently supports only one
primary source per recipe (AUR packages with multiple sources need manual
adjustment).
3. **No binary repository**: cub currently fetches from AUR (source-based) and
BUR (Red Bear package recipes). There is no binary package repository — all
packages must be built from source.
4. **AUR JSON parsing**: The AUR module uses a hand-written JSON parser to avoid
adding `serde_json` as a dependency. This works for the AUR RPC response
format but is less robust than `serde_json`.
5. **TUI test coverage**: The `cub-tui` crate has no unit tests. Views are
rendering-only and verified via `cargo build`.
## Future Work
- Port build tools inside Red Bear OS to enable full cooking at runtime
- Add binary package repository support for pre-built packages
- Implement `serde_json` dependency for robust AUR JSON parsing
- Add TUI unit tests for view rendering
- Support multi-source PKGBUILDs in recipe.toml generation
- Add package signing verification on install
- Implement delta updates for large packages