Release 3.3.0 Features: * chroot: add --usb flag to make usb devices available (MR 2554) * install: log space/inodes used in image (MR 2558) * pmb.config.init: prompt for pmaports path (MR 2502) * pmb.config.init: Improve message when "Archived:" header is missing (MR 2535) Fixes: * helpers.cli: Fix regex validation (MR 2557) * pmbootstrap chroot: fix --image bugs (MR 2556) * pmb.install.format: set bytes-per-inode to 16384 (MR 2558) (MR 2555) (MR 2552) * ci/markdown: fix shellcheck errors (MR 2485) * pmbootstrap config: Fix setting attribute value to False (MR 2546) * test: move all tests into separate module (MR 2551) * pmb.flasher: Fix passing command line flags (MR 2543) * install: create_device_rootfs: check if ui extras package exists (MR 2534) Other: * pmb.parse.apkindex: Improve parse_add_block() type hint (MR 2515) * pmb.chroot.run: Add another overload for root() (MR 2515) * pyproject.toml: Remove ignore for F401 in __init__.py files (MR 2545) * pmb.chroot: Rename exists() to user_exists() (MR 2545) * pmb: Use explicit re-exports (MR 2545) * pmb: Remove unused imports (MR 2545) * ci/markdown: don't run "npm install" as root (MR 2485) * add pre-commit hook for ruff (MR 2485) * CONTRIBUTING: document markdown linting (MR 2485) * treewide: lint markdown files (MR 2485) * CI: add markdown lint (MR 2485) * pmb.config.init: resolve double-negation (MR 2502) * pmb.config.init: Reformat some strings (MR 2535) * CI: use new runner where necessary (MR 2548) * pyproject.toml: Enable all N checks (MR 2537) * pmb.helpers.logging: Use PEP 8-compliant naming (MR 2537) * pmb.conftest: Use PEP 8-compliant naming (MR 2537) * pyproject.toml: Enable all PIE checks (MR 2537) * pmb.install.losetup: Remove unnecessary range start (MR 2537) * pmb: Remove unnecessary pass statements (MR 2537) * pmb.aportgen.core: Combine startswith(...) calls into one (MR 2537)