This repository is a fresh start for a new GNUstep CLI.
The design is intentionally split into two interfaces:
- a bootstrap CLI for
setupanddoctor - a full CLI implemented as an Objective-C/GNUstep application
The old repository at ../gnustep-cli is reference material, not an architectural constraint.
- Build one CLI with two interfaces:
- a minimal bootstrap interface for installation and
doctor - a full Objective-C/GNUstep interface for normal long-term use
- a minimal bootstrap interface for installation and
- Prefer reusing a compatible platform-native GNUstep toolchain when that path is validated and compatible with the CLI's requirements, rather than forcing a managed install everywhere.
- Keep managed installs artifact-backed and reproducible when a native packaged path is not good enough or not yet supported.
- Treat updates as a first-class managed lifecycle responsibility of the installed full CLI:
gnustep updateshould check, plan, and apply CLI/toolchain and package updates transactionally, while setup remains focused on onboarding, repair, and environment configuration. - Treat
buildandrunas GNUstep project commands with a backend model; GNUstep Make is first implemented, while CMake and libs-xcode/buildtool are core planned backends. - Treat current-release native-toolchain discovery and validation as in scope for:
- OpenBSD
- Fedora
- Debian
- Arch
- Treat the following distro families as deferred future investigation targets rather than current-release requirements:
- openSUSE
- RHEL-family distributions and clones
- Alpine
The repository currently contains:
- project requirements and architectural policy in AGENTS.md
- an implementation roadmap in docs/implementation-roadmap.md
- bootstrap scripts under
scripts/bootstrap/ - the Objective-C full CLI under
src/full-cli - a generated package repository under
packages/ - schema drafts under
schemas/ - automated regression coverage under
tests/andsrc/full-cli/Tests - a project requirement that new features, bug fixes, and roadmap subphases include automated unit/regression coverage before being considered complete
- native
doctor,setup,build,run,new,install,remove, andupdatecommand implementations exist in the full Objective-C CLI - package installation now supports package IDs resolved through a package index
- package safety checks include compatibility-aware artifact selection, dependency rejection, reinstall/idempotent behavior, and removal blocking for dependents
- the installed full CLI bundle is qualified without bundled Python runtime trees
- the Python/shared regression suite
- the native Objective-C
tools-xctestsuite - bootstrap-to-full handoff qualification for staged release artifacts
- package index generation determinism in CI
- fresh OpenBSD packaged-path host evidence on libvirt, including native package install/remove smoke after fixing OpenBSD OS detection
- fresh Debian host evidence for managed-toolchain compile-link-run, release-artifact package smoke, and public published-URL bootstrap/full-CLI qualification on libvirt
- Fedora and Arch native packaged-path qualification on disposable libvirt hosts, classified as GCC/libobjc interoperability paths rather than preferred modern Clang/libobjc2 stacks
- Windows libvirt readiness, MSYS2 assembly, native full-CLI build,
--version/--help, package install/remove smoke on a fresh lease, and package-flow qualification against refreshed staged Windows release artifacts
- dogfood candidate
v0.1.0-dev-hosted.32is the current qualified RC baseline; the immutablev0.1.0-dev-hosted.1dogfood manifest remains historical evidence only because it contains malformed GitHub asset URLs - the intended stable tag candidate is
v0.1.0, but public stable publication is intentionally blocked until fresh hosted structured OpenBSD and Windows Tier 1 reports are collected for the stable candidate - Linux and Windows current-source producer lanes, signed package-index generation, stable-channel staging rehearsal, and release-signing smoke now pass with hosted evidence and CI-held trust material
- structured OpenBSD/Windows smoke-report ingestion is available through the
Structured Smoke Evidenceworkflow; it has been validated with the accepted existing structured reports, but those reports are not fresh stable evidence - finish native Objective-C
doctordeep-detection parity with the shared model before claiming the full CLI as the authoritative diagnostic implementation - repaired Linux managed artifact portability beyond the explicitly scoped Debian and Ubuntu managed targets remains deferred; Fedora and Arch are currently GCC/libobjc interoperability paths unless per-distro managed Clang/libobjc2 artifacts are built and validated
- package-index trust metadata, provenance generation, signing, trust-gate
validation, and signed-index enforcement in package-index consumer paths are
implemented for the official package repository path; hosted Linux
tools-xctestrebuilds pass, while target-native package rebuilds for OpenBSD, Windows, and arm64 remain to be completed or explicitly deferred - OpenBSD
amd64release claims are native packaged GNUstep claims; managed OpenBSD artifact publication is optional future work, not a current release-candidate blocker
For current otvm-backed validation, use libvirt rather than the default OCI
config. This now applies to the VM-backed GNUstep CLI validation path
generally, including Windows work as OracleTestVMs rolls out libvirt-backed
Windows leases. Use a dedicated libvirt config based on
otvm-libvirt.example.toml
and the refresh procedure in
openbsd-debian-libvirt-refresh.md.
Release preparation also emits otvm-host-validation-plan.json, and
scripts/internal/build_infra.py otvm-release-host-validation-plan can
regenerate that release-scoped Debian/OpenBSD/Windows libvirt validation plan
for any staged release directory.
Initial commands:
setupdoctorbuildrunnewinstallremoveupdate
Bootstrap only supports setup and doctor, but should expose the full CLI surface in help output. Bootstrap is an onboarding and recovery tool, not the normal updater after the full CLI is installed.
Update scope:
gnustep update --checkshould compare installed CLI/toolchain and package state against signed release/package metadata without mutating the install.gnustep update clishould update the full CLI and managed toolchain through staged, verified, rollback-capable activation.gnustep update packagesshould upgrade installed packages through the signed package index and package transaction model.gnustep update/gnustep update allshould coordinate CLI/toolchain and package updates through one coherent plan.setup --check-updatesandsetup --upgradeare compatibility/internal lifecycle hooks only; user-facing documentation should not present setup as the update command, and there should be nosetup --updatesyntax.gnustep setup --repairshould remain the recovery path for interrupted or corrupted lifecycle operations.
Build backend scope:
gnustep-makeis the first implemented backend and usesGNUmakefile/make.cmakeis a core planned backend usingCMakeLists.txt/cmake.xcode-buildtoolis a core planned backend using libs-xcodebuildtooland*.xcodeproj.- Help and diagnostics should say
GNUstep projectunless the message is specifically backend-specific.
The current release goal is not "managed toolchain only". doctor and setup
should be able to distinguish among:
- preferred native packaged toolchain paths
- supported but not preferred native paths
- interoperability-only native paths
- incompatible native paths that should use the managed toolchain instead
Run the baseline test suite with:
python3 -m unittest discover -s testsThe committed package index should stay in sync with the package manifests:
python3 scripts/internal/package_repo.py --json packages --output /tmp/package-index.json >/dev/null
diff -u packages/package-index.json /tmp/package-index.jsonTesting policy: any new feature or bug fix should include the relevant automated tests in the same change set. Native Objective-C behavior belongs in the tools-xctest suite; Python tests should cover bootstrap, shared tooling, schemas, package repository generation, and cross-language contracts.
Run the full regression gate, including the native Objective-C tools-xctest
suite for the full CLI, with:
python3 -c 'import sys; sys.path.insert(0, "src"); from gnustep_cli_shared.qa import regression_suite; import json; print(json.dumps(regression_suite(), indent=2))'Or run the native suite directly with:
. ./scripts/dev/activate-tools-xctest.sh
./scripts/dev/run-native-tests.shGitHub Actions now runs both the Python/shared suite and the native
Objective-C tools-xctest suite on every push and pull request.